Support HTTP/3 protocol upgrade for HTTPS DNS records

This CL introduces UseDnsHttpsSvcbAlpn feature which can be enabled at
chrome://flags#use-dns-https-svcb-alpn. When this feature is enabled,
Chrome will connect to the server using the HTTP/3 protocol if Chrome
receives a HTTPS DNS record indicating HTTP/3 support.

This CL changes the behavior of HttpStreamFactory::JobController as
follows:

Currently, if Chrome has received an Alt-Svc header from the origin,
JobController creates two Jobs to compete for connection establishment.
  [1] Main job for HTTP/1 or HTTP/2
  [2] Alternative job for HTTP/3 (Note: This job can use HTTP/2 when the
      enable_http2_alternative_service parameter is enabled. But this
      parameter is not enabled in Chrome.)
The main job waits for a while before starting the race if Chrome knows
that QUIC works on the current network. The waiting time is determined
based on recent QUIC connection performance in
QuicStreamFactory::GetTimeDelayForWaitingJob().

This CL introduces a new Job.
  [3] DNS alpn job: This job tries to use HTTP/3 noly if Chrome receives
      a HTTPS DNS record indicating HTTP/3 support. Otherwise it fails
      with ERR_DNS_NO_MACHING_SUPPORTED_ALPN.
This DNS alpn job is created only when the new UseDnsHttpsAlpn feature
is enabled, and the URL scheme is HTTPS, and QUIC is enabled, and proxy
is not used, and the alternative job can’t use an existing Quic session,
and Chrome has not recognised that the QUIC connection to the server is
broken. If the DNS alpn job can use an existing QUIC session, other jobs
are canceled. Additionally, if the destination of both the alternate job
and the DNS alpn job are the same, the DNS alpn job is canceled to avoid
redundant jobs.
The main job waits for a while before starting, just like its current
behavior.


Note: There are some tricy part in OrphanUnboundJob() method.
Currently, even if the main job successfully completes before the
alternative job, the alternative job is not cleared. And also when the
alternative job successfully completes before the main job, if the
alternative job has failed on the default network, the main job is not
cleared. This logic is implemented in the OrphanUnboundJob() method.
This is intended to check if the QUIC connection is broken in the
MaybeReportBrokenAlternativeService() method. And if it is broken,
Chrome will not try to use QUIC and start the main job for following
requests to the server.
We have to do the same thing for the DNS alpn job. We need to keep other
jobs even when one job successfully completes for some situation to
detect the QUIC connection breakage. This CL implemented this logic in
the OrphanUnboundJob() method.

Bug: 1317943
Change-Id: Iac56f2f8bc5fca627f0a5f08d6180b95a029bc2c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3703040
Reviewed-by: Eric Orth <ericorth@chromium.org>
Commit-Queue: Tsuyoshi Horo <horo@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1020469}
22 files changed
tree: 550d39dadf780db4be83134fcca76035d7a674fd
  1. android_webview/
  2. apps/
  3. ash/
  4. base/
  5. build/
  6. build_overrides/
  7. buildtools/
  8. cc/
  9. chrome/
  10. chromecast/
  11. chromeos/
  12. codelabs/
  13. components/
  14. content/
  15. courgette/
  16. crypto/
  17. dbus/
  18. device/
  19. docs/
  20. extensions/
  21. fuchsia_web/
  22. gin/
  23. google_apis/
  24. google_update/
  25. gpu/
  26. headless/
  27. infra/
  28. ios/
  29. ipc/
  30. media/
  31. mojo/
  32. native_client_sdk/
  33. net/
  34. pdf/
  35. ppapi/
  36. printing/
  37. remoting/
  38. rlz/
  39. sandbox/
  40. services/
  41. skia/
  42. sql/
  43. storage/
  44. styleguide/
  45. testing/
  46. third_party/
  47. tools/
  48. ui/
  49. url/
  50. weblayer/
  51. .clang-format
  52. .clang-tidy
  53. .eslintrc.js
  54. .git-blame-ignore-revs
  55. .gitattributes
  56. .gitignore
  57. .gn
  58. .mailmap
  59. .rustfmt.toml
  60. .vpython
  61. .vpython3
  62. .yapfignore
  63. AUTHORS
  64. BUILD.gn
  65. CODE_OF_CONDUCT.md
  66. codereview.settings
  67. DEPS
  68. DIR_METADATA
  69. ENG_REVIEW_OWNERS
  70. LICENSE
  71. LICENSE.chromium_os
  72. OWNERS
  73. PRESUBMIT.py
  74. PRESUBMIT_test.py
  75. PRESUBMIT_test_mocks.py
  76. README.md
  77. WATCHLISTS
README.md

Logo Chromium

Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.

The project's web site is https://www.chromium.org.

To check out the source code locally, don't use git clone! Instead, follow the instructions on how to get the code.

Documentation in the source is rooted in docs/README.md.

Learn how to Get Around the Chromium Source Code Directory Structure .

For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.

If you found a bug, please file it at https://crbug.com/new.