@fails-components/webtransport 0.0.1-rc.0 → 0.0.1-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. package/.github/workflows/npm-publish-packages.yml +0 -0
  2. package/CMakeLists.txt +2 -0
  3. package/package.json +1 -1
  4. package/readme.md +0 -0
  5. package/src/http3serversession.h +1 -1
  6. package/src/webtransport.js +4 -2
  7. package/third_party/boringssl/src/CMakeLists.txt +9 -12
  8. package/third_party/boringssl/src/crypto/CMakeLists.txt +2 -3
  9. package/third_party/boringssl/src/crypto/asn1/time_support.c +206 -206
  10. package/third_party/boringssl/src/crypto/bio/socket_helper.c +124 -122
  11. package/third_party/boringssl/src/crypto/evp/digestsign.c +268 -231
  12. package/third_party/boringssl/src/crypto/evp/p_ec.c +286 -286
  13. package/third_party/boringssl/src/crypto/fipsmodule/aes/key_wrap.c +246 -236
  14. package/third_party/boringssl/src/crypto/fipsmodule/aes/mode_wrappers.c +124 -122
  15. package/third_party/boringssl/src/crypto/fipsmodule/bcm.c +3 -0
  16. package/third_party/boringssl/src/crypto/fipsmodule/bn/bytes.c +246 -230
  17. package/third_party/boringssl/src/crypto/fipsmodule/bn/internal.h +734 -715
  18. package/third_party/boringssl/src/crypto/fipsmodule/bn/random.c +349 -341
  19. package/third_party/boringssl/src/crypto/fipsmodule/cipher/cipher.c +670 -648
  20. package/third_party/boringssl/src/crypto/fipsmodule/cipher/e_aes.c +1504 -1472
  21. package/third_party/boringssl/src/crypto/{cipher_extra → fipsmodule/cipher}/e_aesccm.c +435 -446
  22. package/third_party/boringssl/src/crypto/{cmac → fipsmodule/cmac}/cavp_3des_cmac_tests.txt +0 -0
  23. package/third_party/boringssl/src/crypto/{cmac → fipsmodule/cmac}/cavp_aes128_cmac_tests.txt +0 -0
  24. package/third_party/boringssl/src/crypto/{cmac → fipsmodule/cmac}/cavp_aes192_cmac_tests.txt +0 -0
  25. package/third_party/boringssl/src/crypto/{cmac → fipsmodule/cmac}/cavp_aes256_cmac_tests.txt +0 -0
  26. package/third_party/boringssl/src/crypto/{cmac → fipsmodule/cmac}/cmac.c +318 -278
  27. package/third_party/boringssl/src/crypto/{cmac → fipsmodule/cmac}/cmac_test.cc +268 -267
  28. package/third_party/boringssl/src/crypto/fipsmodule/dh/dh.c +5 -1
  29. package/third_party/boringssl/src/crypto/fipsmodule/ec/ec.c +11 -17
  30. package/third_party/boringssl/src/crypto/fipsmodule/ec/ec_key.c +15 -4
  31. package/third_party/boringssl/src/crypto/fipsmodule/ec/internal.h +2 -6
  32. package/third_party/boringssl/src/crypto/fipsmodule/ec/p224-64.c +1164 -1180
  33. package/third_party/boringssl/src/crypto/fipsmodule/ec/p256-nistz.c +3 -3
  34. package/third_party/boringssl/src/crypto/fipsmodule/ec/p256-nistz_test.cc +2 -2
  35. package/third_party/boringssl/src/crypto/fipsmodule/ec/p256.c +44 -33
  36. package/third_party/boringssl/src/crypto/fipsmodule/ec/scalar.c +169 -175
  37. package/third_party/boringssl/src/crypto/fipsmodule/ec/simple.c +352 -357
  38. package/third_party/boringssl/src/crypto/fipsmodule/ecdh/ecdh.c +4 -0
  39. package/third_party/boringssl/src/crypto/fipsmodule/ecdsa/ecdsa.c +14 -9
  40. package/third_party/boringssl/src/crypto/fipsmodule/hmac/hmac.c +256 -235
  41. package/third_party/boringssl/src/crypto/fipsmodule/rand/ctrdrbg.c +204 -202
  42. package/third_party/boringssl/src/crypto/fipsmodule/rsa/padding.c +702 -695
  43. package/third_party/boringssl/src/crypto/fipsmodule/rsa/rsa_impl.c +7 -2
  44. package/third_party/boringssl/src/crypto/fipsmodule/self_check/self_check.c +7 -0
  45. package/third_party/boringssl/src/crypto/fipsmodule/service_indicator/internal.h +89 -0
  46. package/third_party/boringssl/src/crypto/fipsmodule/service_indicator/service_indicator.c +333 -0
  47. package/third_party/boringssl/src/crypto/fipsmodule/service_indicator/service_indicator_test.cc +2410 -0
  48. package/third_party/boringssl/src/crypto/fipsmodule/sha/sha1.c +359 -357
  49. package/third_party/boringssl/src/crypto/fipsmodule/sha/sha256.c +325 -321
  50. package/third_party/boringssl/src/crypto/fipsmodule/sha/sha512.c +510 -508
  51. package/third_party/boringssl/src/crypto/fipsmodule/tls/kdf.c +177 -165
  52. package/third_party/boringssl/src/crypto/internal.h +13 -0
  53. package/third_party/boringssl/src/crypto/trust_token/trust_token_test.cc +884 -884
  54. package/third_party/boringssl/src/crypto/x509/internal.h +0 -2
  55. package/third_party/boringssl/src/crypto/x509/t_crl.c +148 -148
  56. package/third_party/boringssl/src/crypto/x509/t_req.c +249 -250
  57. package/third_party/boringssl/src/crypto/x509/t_x509.c +2 -3
  58. package/third_party/boringssl/src/crypto/x509/x509_req.c +262 -304
  59. package/third_party/boringssl/src/crypto/x509/x509_set.c +250 -240
  60. package/third_party/boringssl/src/crypto/x509/x509_test.cc +466 -4
  61. package/third_party/boringssl/src/crypto/x509/x509cset.c +292 -279
  62. package/third_party/boringssl/src/crypto/x509/x509rset.c +89 -86
  63. package/third_party/boringssl/src/crypto/x509/x_crl.c +37 -125
  64. package/third_party/boringssl/src/crypto/x509/x_req.c +114 -109
  65. package/third_party/boringssl/src/crypto/x509/x_x509.c +394 -394
  66. package/third_party/boringssl/src/crypto/x509v3/v3_akey.c +11 -16
  67. package/third_party/boringssl/src/crypto/x509v3/v3_alt.c +644 -642
  68. package/third_party/boringssl/src/crypto/x509v3/v3_bcons.c +130 -133
  69. package/third_party/boringssl/src/crypto/x509v3/v3_bitst.c +149 -144
  70. package/third_party/boringssl/src/crypto/x509v3/v3_cpols.c +496 -500
  71. package/third_party/boringssl/src/crypto/x509v3/v3_enum.c +105 -106
  72. package/third_party/boringssl/src/crypto/x509v3/v3_ia5.c +126 -121
  73. package/third_party/boringssl/src/crypto/x509v3/v3_info.c +206 -218
  74. package/third_party/boringssl/src/crypto/x509v3/v3_int.c +97 -91
  75. package/third_party/boringssl/src/crypto/x509v3/v3_pci.c +290 -289
  76. package/third_party/boringssl/src/crypto/x509v3/v3_skey.c +161 -156
  77. package/third_party/boringssl/src/crypto/x509v3/v3_utl.c +5 -3
  78. package/third_party/boringssl/src/include/openssl/aead.h +480 -480
  79. package/third_party/boringssl/src/include/openssl/asn1.h +2 -0
  80. package/third_party/boringssl/src/include/openssl/base.h +1 -1
  81. package/third_party/boringssl/src/include/openssl/service_indicator.h +96 -0
  82. package/third_party/boringssl/src/include/openssl/ssl.h +7 -0
  83. package/third_party/boringssl/src/include/openssl/x509.h +11 -33
  84. package/third_party/boringssl/src/include/openssl/x509v3.h +990 -1018
  85. package/third_party/boringssl/src/sources.cmake +4 -4
  86. package/third_party/boringssl/src/ssl/internal.h +10 -0
  87. package/third_party/boringssl/src/ssl/ssl_lib.cc +3081 -3072
  88. package/third_party/boringssl/src/ssl/ssl_test.cc +46 -0
  89. package/third_party/boringssl/src/ssl/tls13_server.cc +4 -6
  90. package/third_party/boringssl/src/util/bot/DEPS +14 -27
  91. package/third_party/boringssl/src/util/bot/UPDATING +3 -9
  92. package/third_party/boringssl/src/util/bot/update_clang.py +172 -172
  93. package/third_party/boringssl/src/util/bot/vs_toolchain.py +3 -3
  94. package/third_party/quiche/.bazelrc +8 -0
  95. package/third_party/quiche/BUILD.bazel +7 -0
  96. package/third_party/quiche/WHITESPACE +3 -1
  97. package/third_party/quiche/WORKSPACE.bazel +87 -0
  98. package/third_party/quiche/build/BUILD.bazel +7 -0
  99. package/third_party/quiche/build/source_list.bzl +1511 -0
  100. package/third_party/quiche/build/source_list.gni +1511 -0
  101. package/third_party/quiche/build/source_list.json +1511 -0
  102. package/third_party/quiche/build/test.bzl +26 -0
  103. package/third_party/quiche/build/zlib.BUILD +25 -0
  104. package/third_party/quiche/quiche/BUILD.bazel +270 -0
  105. package/third_party/quiche/quiche/{common/balsa → balsa}/balsa_enums.cc +3 -3
  106. package/third_party/quiche/quiche/{common/balsa → balsa}/balsa_enums.h +7 -7
  107. package/third_party/quiche/quiche/{common/balsa → balsa}/balsa_frame.cc +39 -18
  108. package/third_party/quiche/quiche/{common/balsa → balsa}/balsa_frame.h +11 -10
  109. package/third_party/quiche/quiche/{common/balsa → balsa}/balsa_frame_test.cc +67 -63
  110. package/third_party/quiche/quiche/{common/balsa → balsa}/balsa_headers.cc +13 -12
  111. package/third_party/quiche/quiche/{common/balsa → balsa}/balsa_headers.h +16 -8
  112. package/third_party/quiche/quiche/{common/balsa → balsa}/balsa_headers_test.cc +9 -9
  113. package/third_party/quiche/quiche/{common/balsa → balsa}/balsa_visitor_interface.h +4 -4
  114. package/third_party/quiche/quiche/{common/balsa → balsa}/framer_interface.h +3 -3
  115. package/third_party/quiche/quiche/{common/balsa → balsa}/header_api.h +3 -3
  116. package/third_party/quiche/quiche/{common/balsa → balsa}/header_properties.cc +1 -1
  117. package/third_party/quiche/quiche/{common/balsa → balsa}/header_properties.h +3 -3
  118. package/third_party/quiche/quiche/{common/balsa → balsa}/header_properties_test.cc +1 -1
  119. package/third_party/quiche/quiche/{common/balsa → balsa}/http_validation_policy.cc +1 -1
  120. package/third_party/quiche/quiche/{common/balsa → balsa}/http_validation_policy.h +3 -3
  121. package/third_party/quiche/quiche/{common/balsa → balsa}/noop_balsa_visitor.h +4 -4
  122. package/third_party/quiche/quiche/{common/balsa → balsa}/simple_buffer.cc +22 -29
  123. package/third_party/quiche/quiche/{common/balsa → balsa}/simple_buffer.h +18 -16
  124. package/third_party/quiche/quiche/{common/balsa → balsa}/simple_buffer_test.cc +79 -32
  125. package/third_party/quiche/quiche/{common/balsa → balsa}/standard_header_map.cc +1 -1
  126. package/third_party/quiche/quiche/{common/balsa → balsa}/standard_header_map.h +3 -3
  127. package/third_party/quiche/quiche/common/platform/api/quiche_command_line_flags.h +6 -1
  128. package/third_party/quiche/quiche/common/platform/api/quiche_flags.h +8 -0
  129. package/third_party/quiche/quiche/common/platform/api/quiche_logging.h +0 -3
  130. package/third_party/quiche/quiche/common/platform/api/quiche_lower_case_string_test.cc +29 -0
  131. package/third_party/quiche/quiche/common/platform/api/quiche_test.h +5 -7
  132. package/third_party/quiche/quiche/common/platform/default/quiche_platform_impl/quic_flags_impl.h +1 -1
  133. package/third_party/quiche/quiche/common/platform/default/quiche_platform_impl/quiche_bug_tracker_impl.h +3 -2
  134. package/third_party/quiche/quiche/common/platform/default/quiche_platform_impl/quiche_command_line_flags_impl.cc +41 -0
  135. package/third_party/quiche/quiche/common/platform/default/quiche_platform_impl/quiche_command_line_flags_impl.h +33 -0
  136. package/third_party/quiche/quiche/common/platform/default/quiche_platform_impl/quiche_expect_bug_impl.h +15 -0
  137. package/third_party/quiche/quiche/common/platform/default/quiche_platform_impl/quiche_logging_impl.h +84 -50
  138. package/third_party/quiche/quiche/common/platform/default/quiche_platform_impl/quiche_lower_case_string_impl.h +25 -0
  139. package/third_party/quiche/quiche/common/platform/default/quiche_platform_impl/quiche_stack_trace_impl.cc +1 -1
  140. package/third_party/quiche/quiche/common/platform/default/quiche_platform_impl/quiche_test_impl.cc +25 -0
  141. package/third_party/quiche/quiche/common/platform/default/quiche_platform_impl/quiche_test_impl.h +56 -0
  142. package/third_party/quiche/quiche/common/platform/default/quiche_platform_impl/quiche_test_output_impl.h +27 -0
  143. package/third_party/quiche/quiche/common/platform/default/quiche_platform_impl/quiche_thread_impl.h +26 -0
  144. package/third_party/quiche/quiche/common/platform/default/quiche_platform_impl/quiche_url_utils_impl.cc +1 -0
  145. package/third_party/quiche/quiche/common/quiche_buffer_allocator_test.cc +1 -1
  146. package/third_party/quiche/quiche/common/quiche_mem_slice_storage.h +2 -3
  147. package/third_party/quiche/quiche/common/structured_headers.cc +14 -12
  148. package/third_party/quiche/quiche/http2/adapter/event_forwarder.cc +7 -5
  149. package/third_party/quiche/quiche/http2/adapter/event_forwarder.h +4 -2
  150. package/third_party/quiche/quiche/http2/adapter/event_forwarder_test.cc +14 -9
  151. package/third_party/quiche/quiche/http2/adapter/header_validator.cc +43 -19
  152. package/third_party/quiche/quiche/http2/adapter/header_validator.h +11 -40
  153. package/third_party/quiche/quiche/http2/adapter/header_validator_base.h +69 -0
  154. package/third_party/quiche/quiche/http2/adapter/header_validator_test.cc +73 -1
  155. package/third_party/quiche/quiche/http2/adapter/nghttp2_adapter_test.cc +66 -0
  156. package/third_party/quiche/quiche/http2/adapter/nghttp2_session_test.cc +8 -5
  157. package/third_party/quiche/quiche/http2/adapter/nghttp2_test.cc +1 -1
  158. package/third_party/quiche/quiche/http2/adapter/noop_header_validator.cc +22 -0
  159. package/third_party/quiche/quiche/http2/adapter/noop_header_validator.h +25 -0
  160. package/third_party/quiche/quiche/http2/adapter/noop_header_validator_test.cc +523 -0
  161. package/third_party/quiche/quiche/http2/adapter/oghttp2_adapter_test.cc +186 -5
  162. package/third_party/quiche/quiche/http2/adapter/oghttp2_session.cc +37 -43
  163. package/third_party/quiche/quiche/http2/adapter/oghttp2_session.h +22 -23
  164. package/third_party/quiche/quiche/http2/adapter/test_utils.cc +1 -1
  165. package/third_party/quiche/quiche/http2/adapter/window_manager_test.cc +11 -5
  166. package/third_party/quiche/quiche/http2/core/http2_trace_logging.cc +13 -11
  167. package/third_party/quiche/quiche/http2/core/http2_trace_logging.h +5 -4
  168. package/third_party/quiche/quiche/http2/core/priority_write_scheduler.h +42 -36
  169. package/third_party/quiche/quiche/http2/core/priority_write_scheduler_test.cc +2 -2
  170. package/third_party/quiche/quiche/http2/decoder/decode_buffer_test.cc +9 -9
  171. package/third_party/quiche/quiche/http2/decoder/decode_http2_structures_test.cc +1 -1
  172. package/third_party/quiche/quiche/http2/decoder/http2_frame_decoder_test.cc +14 -14
  173. package/third_party/quiche/quiche/http2/decoder/http2_structure_decoder_test.cc +17 -17
  174. package/third_party/quiche/quiche/http2/decoder/payload_decoders/altsvc_payload_decoder_test.cc +1 -1
  175. package/third_party/quiche/quiche/http2/decoder/payload_decoders/continuation_payload_decoder_test.cc +1 -1
  176. package/third_party/quiche/quiche/http2/decoder/payload_decoders/data_payload_decoder_test.cc +2 -2
  177. package/third_party/quiche/quiche/http2/decoder/payload_decoders/goaway_payload_decoder_test.cc +1 -1
  178. package/third_party/quiche/quiche/http2/decoder/payload_decoders/headers_payload_decoder_test.cc +1 -1
  179. package/third_party/quiche/quiche/http2/decoder/payload_decoders/ping_payload_decoder_test.cc +1 -1
  180. package/third_party/quiche/quiche/http2/decoder/payload_decoders/priority_payload_decoder_test.cc +1 -1
  181. package/third_party/quiche/quiche/http2/decoder/payload_decoders/priority_update_payload_decoder_test.cc +1 -1
  182. package/third_party/quiche/quiche/http2/decoder/payload_decoders/push_promise_payload_decoder_test.cc +1 -1
  183. package/third_party/quiche/quiche/http2/decoder/payload_decoders/rst_stream_payload_decoder_test.cc +1 -1
  184. package/third_party/quiche/quiche/http2/decoder/payload_decoders/settings_payload_decoder_test.cc +1 -1
  185. package/third_party/quiche/quiche/http2/decoder/payload_decoders/unknown_payload_decoder_test.cc +1 -1
  186. package/third_party/quiche/quiche/http2/decoder/payload_decoders/window_update_payload_decoder_test.cc +1 -1
  187. package/third_party/quiche/quiche/http2/hpack/decoder/hpack_block_decoder_test.cc +2 -2
  188. package/third_party/quiche/quiche/http2/hpack/decoder/hpack_decoder_state_test.cc +8 -8
  189. package/third_party/quiche/quiche/http2/hpack/decoder/hpack_decoder_string_buffer_test.cc +4 -3
  190. package/third_party/quiche/quiche/http2/hpack/decoder/hpack_decoder_tables_test.cc +17 -17
  191. package/third_party/quiche/quiche/http2/hpack/decoder/hpack_decoder_test.cc +25 -25
  192. package/third_party/quiche/quiche/http2/hpack/decoder/hpack_entry_decoder_test.cc +2 -2
  193. package/third_party/quiche/quiche/http2/hpack/decoder/hpack_entry_type_decoder_test.cc +7 -6
  194. package/third_party/quiche/quiche/http2/hpack/decoder/hpack_string_decoder_test.cc +6 -6
  195. package/third_party/quiche/quiche/http2/hpack/decoder/hpack_whole_entry_buffer_test.cc +1 -1
  196. package/third_party/quiche/quiche/http2/hpack/huffman/hpack_huffman_decoder_test.cc +2 -2
  197. package/third_party/quiche/quiche/http2/hpack/huffman/hpack_huffman_encoder_test.cc +1 -1
  198. package/third_party/quiche/quiche/http2/hpack/huffman/hpack_huffman_transcoder_test.cc +5 -5
  199. package/third_party/quiche/quiche/http2/hpack/varint/hpack_varint_decoder_test.cc +4 -4
  200. package/third_party/quiche/quiche/http2/hpack/varint/hpack_varint_round_trip_test.cc +1 -1
  201. package/third_party/quiche/quiche/http2/http2_constants_test.cc +1 -1
  202. package/third_party/quiche/quiche/http2/http2_structures_test.cc +23 -22
  203. package/third_party/quiche/quiche/http2/test_tools/frame_decoder_state_test_util.cc +1 -1
  204. package/third_party/quiche/quiche/http2/test_tools/frame_decoder_state_test_util.h +1 -1
  205. package/third_party/quiche/quiche/http2/test_tools/frame_parts.cc +38 -38
  206. package/third_party/quiche/quiche/http2/test_tools/hpack_block_collector.cc +15 -15
  207. package/third_party/quiche/quiche/http2/test_tools/hpack_entry_collector.cc +24 -22
  208. package/third_party/quiche/quiche/http2/test_tools/hpack_string_collector.cc +5 -5
  209. package/third_party/quiche/quiche/http2/test_tools/http2_frame_builder_test.cc +70 -89
  210. package/third_party/quiche/quiche/http2/test_tools/payload_decoder_base_test_util.cc +1 -1
  211. package/third_party/quiche/quiche/http2/test_tools/payload_decoder_base_test_util.h +29 -26
  212. package/third_party/quiche/quiche/http2/test_tools/{random_decoder_test.cc → random_decoder_test_base.cc} +13 -10
  213. package/third_party/quiche/quiche/http2/test_tools/{random_decoder_test.h → random_decoder_test_base.h} +15 -17
  214. package/third_party/quiche/quiche/http2/test_tools/{random_decoder_test_test.cc → random_decoder_test_base_test.cc} +1 -1
  215. package/third_party/quiche/quiche/http2/test_tools/verify_macros.h +32 -0
  216. package/third_party/quiche/quiche/quic/core/congestion_control/bbr2_sender.cc +2 -1
  217. package/third_party/quiche/quiche/quic/core/congestion_control/bbr2_simulator_test.cc +3 -2
  218. package/third_party/quiche/quiche/quic/core/congestion_control/bbr_sender_test.cc +3 -2
  219. package/third_party/quiche/quiche/quic/core/congestion_control/rtt_stats.cc +3 -2
  220. package/third_party/quiche/quiche/quic/core/congestion_control/rtt_stats.h +2 -1
  221. package/third_party/quiche/quiche/quic/core/congestion_control/rtt_stats_test.cc +2 -13
  222. package/third_party/quiche/quiche/quic/core/crypto/certificate_view.cc +15 -0
  223. package/third_party/quiche/quiche/quic/core/crypto/certificate_view.h +7 -0
  224. package/third_party/quiche/quiche/quic/core/crypto/certificate_view_test.cc +16 -0
  225. package/third_party/quiche/quiche/quic/core/crypto/crypto_protocol.h +1 -0
  226. package/third_party/quiche/quiche/quic/core/crypto/proof_source.h +2 -2
  227. package/third_party/quiche/quiche/quic/core/crypto/proof_source_x509.cc +3 -5
  228. package/third_party/quiche/quiche/quic/core/crypto/proof_source_x509.h +1 -2
  229. package/third_party/quiche/quiche/quic/core/crypto/quic_crypto_server_config.cc +1 -1
  230. package/third_party/quiche/quiche/quic/core/crypto/quic_crypto_server_config.h +3 -3
  231. package/third_party/quiche/quiche/quic/core/frames/quic_blocked_frame.cc +2 -8
  232. package/third_party/quiche/quiche/quic/core/frames/quic_blocked_frame.h +0 -1
  233. package/third_party/quiche/quiche/quic/core/frames/quic_crypto_frame.h +2 -0
  234. package/third_party/quiche/quiche/quic/core/frames/quic_frames_test.cc +2 -1
  235. package/third_party/quiche/quiche/quic/core/http/capsule.cc +2 -22
  236. package/third_party/quiche/quiche/quic/core/http/capsule.h +0 -2
  237. package/third_party/quiche/quiche/quic/core/http/capsule_test.cc +1 -2
  238. package/third_party/quiche/quiche/quic/core/http/end_to_end_test.cc +148 -57
  239. package/third_party/quiche/quiche/quic/core/http/http_constants.cc +1 -1
  240. package/third_party/quiche/quiche/quic/core/http/http_constants.h +2 -2
  241. package/third_party/quiche/quiche/quic/core/http/quic_header_list_test.cc +2 -2
  242. package/third_party/quiche/quiche/quic/core/http/quic_headers_stream_test.cc +18 -14
  243. package/third_party/quiche/quiche/quic/core/http/quic_send_control_stream.h +2 -1
  244. package/third_party/quiche/quiche/quic/core/http/quic_send_control_stream_test.cc +3 -7
  245. package/third_party/quiche/quiche/quic/core/http/quic_server_session_base.h +4 -0
  246. package/third_party/quiche/quiche/quic/core/http/quic_spdy_session.cc +47 -65
  247. package/third_party/quiche/quiche/quic/core/http/quic_spdy_session.h +5 -17
  248. package/third_party/quiche/quiche/quic/core/http/quic_spdy_session_test.cc +63 -54
  249. package/third_party/quiche/quiche/quic/core/http/quic_spdy_stream.cc +34 -91
  250. package/third_party/quiche/quiche/quic/core/http/quic_spdy_stream.h +1 -9
  251. package/third_party/quiche/quiche/quic/core/http/quic_spdy_stream_test.cc +27 -134
  252. package/third_party/quiche/quiche/quic/core/http/spdy_utils.cc +0 -41
  253. package/third_party/quiche/quiche/quic/core/http/spdy_utils.h +0 -9
  254. package/third_party/quiche/quiche/quic/core/http/spdy_utils_test.cc +0 -32
  255. package/third_party/quiche/quiche/quic/core/http/web_transport_http3.cc +0 -1
  256. package/third_party/quiche/quiche/quic/core/packet_number_indexed_queue_test.cc +2 -2
  257. package/third_party/quiche/quiche/quic/core/qpack/qpack_header_table.cc +2 -1
  258. package/third_party/quiche/quiche/quic/core/qpack/qpack_send_stream.h +2 -1
  259. package/third_party/quiche/quiche/quic/core/quic_arena_scoped_ptr_test.cc +2 -2
  260. package/third_party/quiche/quiche/quic/core/quic_connection.cc +68 -46
  261. package/third_party/quiche/quiche/quic/core/quic_connection.h +7 -6
  262. package/third_party/quiche/quiche/quic/core/quic_connection_context_test.cc +2 -2
  263. package/third_party/quiche/quiche/quic/core/quic_connection_id_manager_test.cc +2 -2
  264. package/third_party/quiche/quiche/quic/core/quic_connection_id_test.cc +2 -2
  265. package/third_party/quiche/quiche/quic/core/quic_connection_test.cc +45 -132
  266. package/third_party/quiche/quiche/quic/core/quic_constants.h +0 -7
  267. package/third_party/quiche/quiche/quic/core/quic_control_frame_manager.cc +11 -3
  268. package/third_party/quiche/quiche/quic/core/quic_control_frame_manager.h +1 -1
  269. package/third_party/quiche/quiche/quic/core/quic_control_frame_manager_test.cc +2 -2
  270. package/third_party/quiche/quiche/quic/core/quic_crypto_client_handshaker.cc +13 -1
  271. package/third_party/quiche/quiche/quic/core/quic_crypto_client_handshaker.h +3 -0
  272. package/third_party/quiche/quiche/quic/core/quic_crypto_client_handshaker_test.cc +2 -2
  273. package/third_party/quiche/quiche/quic/core/quic_crypto_client_stream.cc +6 -0
  274. package/third_party/quiche/quiche/quic/core/quic_crypto_client_stream.h +8 -0
  275. package/third_party/quiche/quiche/quic/core/quic_crypto_server_stream.cc +26 -13
  276. package/third_party/quiche/quiche/quic/core/quic_crypto_server_stream.h +5 -2
  277. package/third_party/quiche/quiche/quic/core/quic_crypto_stream.cc +55 -47
  278. package/third_party/quiche/quiche/quic/core/quic_crypto_stream.h +15 -10
  279. package/third_party/quiche/quiche/quic/core/quic_crypto_stream_test.cc +34 -5
  280. package/third_party/quiche/quiche/quic/core/quic_dispatcher.cc +20 -11
  281. package/third_party/quiche/quiche/quic/core/quic_dispatcher_test.cc +37 -13
  282. package/third_party/quiche/quiche/quic/core/quic_flags_list.h +6 -10
  283. package/third_party/quiche/quiche/quic/core/quic_flow_controller.cc +3 -3
  284. package/third_party/quiche/quiche/quic/core/quic_flow_controller.h +2 -2
  285. package/third_party/quiche/quiche/quic/core/quic_flow_controller_test.cc +15 -10
  286. package/third_party/quiche/quiche/quic/core/quic_framer.cc +1 -1
  287. package/third_party/quiche/quiche/quic/core/quic_one_block_arena.h +3 -2
  288. package/third_party/quiche/quiche/quic/core/quic_one_block_arena_test.cc +2 -2
  289. package/third_party/quiche/quiche/quic/core/quic_packet_creator.cc +3 -11
  290. package/third_party/quiche/quiche/quic/core/quic_packet_creator.h +0 -8
  291. package/third_party/quiche/quiche/quic/core/quic_ping_manager.cc +14 -14
  292. package/third_party/quiche/quiche/quic/core/quic_ping_manager_test.cc +48 -0
  293. package/third_party/quiche/quiche/quic/core/quic_received_packet_manager.cc +3 -18
  294. package/third_party/quiche/quiche/quic/core/quic_received_packet_manager_test.cc +4 -14
  295. package/third_party/quiche/quiche/quic/core/quic_server_id_test.cc +2 -2
  296. package/third_party/quiche/quiche/quic/core/quic_session.cc +4 -4
  297. package/third_party/quiche/quiche/quic/core/quic_session.h +1 -1
  298. package/third_party/quiche/quiche/quic/core/quic_session_test.cc +21 -1
  299. package/third_party/quiche/quiche/quic/core/quic_stream.cc +4 -7
  300. package/third_party/quiche/quiche/quic/core/quic_stream_test.cc +2 -4
  301. package/third_party/quiche/quiche/quic/core/quic_trace_visitor_test.cc +2 -2
  302. package/third_party/quiche/quiche/quic/core/quic_types.h +3 -8
  303. package/third_party/quiche/quiche/quic/core/quic_udp_socket_posix.cc +5 -4
  304. package/third_party/quiche/quiche/quic/core/quic_unacked_packet_map_test.cc +1 -1
  305. package/third_party/quiche/quiche/quic/core/quic_utils.cc +1 -1
  306. package/third_party/quiche/quiche/quic/core/quic_utils.h +2 -2
  307. package/third_party/quiche/quiche/quic/core/quic_versions_test.cc +0 -1
  308. package/third_party/quiche/quiche/quic/core/tls_client_handshaker.cc +13 -0
  309. package/third_party/quiche/quiche/quic/core/tls_client_handshaker.h +2 -0
  310. package/third_party/quiche/quiche/quic/core/tls_server_handshaker.cc +17 -3
  311. package/third_party/quiche/quiche/quic/core/tls_server_handshaker.h +3 -1
  312. package/third_party/quiche/quiche/quic/core/uber_received_packet_manager_test.cc +18 -10
  313. package/third_party/quiche/quiche/quic/masque/masque_client_bin.cc +6 -4
  314. package/third_party/quiche/quiche/quic/masque/masque_client_session.cc +23 -7
  315. package/third_party/quiche/quiche/quic/masque/masque_client_session.h +1 -1
  316. package/third_party/quiche/quiche/quic/masque/masque_server_backend.cc +13 -0
  317. package/third_party/quiche/quiche/quic/masque/masque_server_backend.h +2 -0
  318. package/third_party/quiche/quiche/quic/masque/masque_server_bin.cc +5 -4
  319. package/third_party/quiche/quiche/quic/masque/masque_server_session.cc +30 -40
  320. package/third_party/quiche/quiche/quic/masque/masque_server_session.h +1 -1
  321. package/third_party/quiche/quiche/quic/platform/api/quic_export.h +4 -4
  322. package/third_party/quiche/quiche/quic/platform/api/quic_flags.h +0 -1
  323. package/third_party/quiche/quiche/quic/platform/api/quic_logging.h +0 -6
  324. package/third_party/quiche/quiche/quic/platform/api/quic_test.h +6 -5
  325. package/third_party/quiche/quiche/quic/qbone/bonnet/icmp_reachable_test.cc +2 -2
  326. package/third_party/quiche/quiche/quic/qbone/bonnet/mock_qbone_tunnel.h +2 -0
  327. package/third_party/quiche/quiche/quic/qbone/bonnet/qbone_tunnel_interface.h +2 -0
  328. package/third_party/quiche/quiche/quic/qbone/bonnet/tun_device_controller_test.cc +2 -2
  329. package/third_party/quiche/quiche/quic/qbone/bonnet/tun_device_packet_exchanger_test.cc +2 -2
  330. package/third_party/quiche/quiche/quic/qbone/bonnet/tun_device_test.cc +2 -2
  331. package/third_party/quiche/quiche/quic/qbone/platform/netlink_test.cc +2 -2
  332. package/third_party/quiche/quiche/quic/qbone/platform/tcp_packet.cc +5 -4
  333. package/third_party/quiche/quiche/quic/qbone/qbone_client_session.cc +4 -2
  334. package/third_party/quiche/quiche/quic/qbone/qbone_packet_processor.cc +2 -1
  335. package/third_party/quiche/quiche/quic/qbone/qbone_packet_processor_test.cc +2 -2
  336. package/third_party/quiche/quiche/quic/qbone/qbone_server_session.cc +4 -2
  337. package/third_party/quiche/quiche/quic/qbone/qbone_session_base.cc +3 -2
  338. package/third_party/quiche/quiche/quic/qbone/qbone_stream.cc +4 -4
  339. package/third_party/quiche/quiche/quic/test_tools/quic_connection_peer.cc +1 -1
  340. package/third_party/quiche/quiche/quic/test_tools/quic_http_response_cache_data/test.example.com/index.html +63 -0
  341. package/third_party/quiche/quiche/quic/test_tools/quic_http_response_cache_data/test.example.com/map.html +65 -0
  342. package/third_party/quiche/quiche/quic/test_tools/quic_test_utils.cc +4 -3
  343. package/third_party/quiche/quiche/quic/test_tools/quic_test_utils.h +18 -1
  344. package/third_party/quiche/quiche/quic/test_tools/simulator/quic_endpoint_test.cc +1 -1
  345. package/third_party/quiche/quiche/quic/test_tools/simulator/simulator_test.cc +1 -1
  346. package/third_party/quiche/quiche/quic/test_tools/test_ticket_crypter.cc +1 -1
  347. package/third_party/quiche/quiche/quic/test_tools/test_ticket_crypter.h +2 -2
  348. package/third_party/quiche/quiche/quic/{core/crypto → tools}/crypto_message_printer_bin.cc +0 -0
  349. package/third_party/quiche/quiche/quic/{core/qpack → tools}/qpack_offline_decoder_bin.cc +0 -0
  350. package/third_party/quiche/quiche/quic/tools/quic_client_interop_test_bin.cc +4 -3
  351. package/third_party/quiche/quiche/quic/tools/quic_memory_cache_backend_test.cc +3 -31
  352. package/third_party/quiche/quiche/quic/tools/quic_packet_printer_bin.cc +2 -2
  353. package/third_party/quiche/quiche/quic/tools/quic_simple_server_session.h +1 -1
  354. package/third_party/quiche/quiche/quic/tools/quic_simple_server_session_test.cc +1 -1
  355. package/third_party/quiche/quiche/quic/tools/quic_toy_client.cc +52 -38
  356. package/third_party/quiche/quiche/quic/tools/quic_toy_server.cc +10 -7
  357. package/third_party/quiche/quiche/quic/tools/simple_ticket_crypter.cc +1 -1
  358. package/third_party/quiche/quiche/quic/tools/simple_ticket_crypter.h +1 -1
  359. package/third_party/quiche/quiche/quic/tools/web_transport_test_visitors.h +3 -2
  360. package/third_party/quiche/quiche/spdy/core/array_output_buffer.h +1 -1
  361. package/third_party/quiche/quiche/spdy/core/hpack/hpack_decoder_adapter_test.cc +1 -1
  362. package/third_party/quiche/quiche/spdy/core/hpack/hpack_encoder_test.cc +2 -1
  363. package/third_party/quiche/quiche/spdy/core/hpack/hpack_header_table_test.cc +1 -1
  364. package/third_party/quiche/quiche/spdy/core/hpack/hpack_round_trip_test.cc +2 -1
  365. package/third_party/quiche/quiche/spdy/core/hpack/hpack_static_table_test.cc +1 -1
  366. package/third_party/quiche/quiche/spdy/core/http2_frame_decoder_adapter.cc +8 -6
  367. package/third_party/quiche/quiche/spdy/core/http2_frame_decoder_adapter.h +17 -6
  368. package/third_party/quiche/quiche/spdy/core/metadata_extension.cc +1 -1
  369. package/third_party/quiche/quiche/spdy/core/metadata_extension_test.cc +1 -1
  370. package/third_party/quiche/quiche/spdy/core/spdy_framer_test.cc +21 -17
  371. package/third_party/quiche/quiche/spdy/core/spdy_intrusive_list_test.cc +3 -3
  372. package/third_party/quiche/quiche/spdy/core/spdy_no_op_visitor.h +6 -4
  373. package/third_party/quiche/quiche/spdy/core/spdy_pinnable_buffer_piece_test.cc +1 -1
  374. package/third_party/quiche/quiche/spdy/core/spdy_prefixed_buffer_reader_test.cc +1 -1
  375. package/third_party/quiche/quiche/spdy/core/spdy_protocol_test.cc +1 -1
  376. package/third_party/quiche/quiche/spdy/test_tools/mock_spdy_framer_visitor.h +5 -4
  377. package/third_party/boringssl/src/util/bot/cmake-win32.zip.sha1 +0 -1
  378. package/third_party/quiche/quiche/common/platform/api/quiche_mock_log.h +0 -18
  379. package/third_party/quiche/quiche/common/platform/api/quiche_test_helpers.h +0 -8
  380. package/third_party/quiche/quiche/quic/platform/api/quic_mock_log.h +0 -19
  381. package/third_party/quiche/quiche/quic/tools/quic_transport_simple_server_dispatcher.cc +0 -51
  382. package/third_party/quiche/quiche/quic/tools/quic_transport_simple_server_dispatcher.h +0 -41
  383. package/third_party/quiche/quiche/quic/tools/quic_transport_simple_server_session.cc +0 -168
  384. package/third_party/quiche/quiche/quic/tools/quic_transport_simple_server_session.h +0 -78
@@ -89,11 +89,12 @@ TEST(EventForwarderTest, ForwardsEventsWithTruePredicate) {
89
89
  EXPECT_CALL(receiver, OnGoAwayFrameData(some_data.data(), some_data.size()));
90
90
  event_forwarder.OnGoAwayFrameData(some_data.data(), some_data.size());
91
91
 
92
- EXPECT_CALL(
93
- receiver,
94
- OnHeaders(stream_id, /*has_priority=*/false, /*weight=*/42, stream_id + 2,
95
- /*exclusive=*/false, /*fin=*/true, /*end=*/true));
96
- event_forwarder.OnHeaders(stream_id, /*has_priority=*/false, /*weight=*/42,
92
+ EXPECT_CALL(receiver,
93
+ OnHeaders(stream_id, /*payload_length=*/1234,
94
+ /*has_priority=*/false, /*weight=*/42, stream_id + 2,
95
+ /*exclusive=*/false, /*fin=*/true, /*end=*/true));
96
+ event_forwarder.OnHeaders(stream_id, /*payload_length=*/1234,
97
+ /*has_priority=*/false, /*weight=*/42,
97
98
  stream_id + 2, /*exclusive=*/false, /*fin=*/true,
98
99
  /*end=*/true);
99
100
 
@@ -103,8 +104,10 @@ TEST(EventForwarderTest, ForwardsEventsWithTruePredicate) {
103
104
  EXPECT_CALL(receiver, OnPushPromise(stream_id, stream_id + 1, /*end=*/true));
104
105
  event_forwarder.OnPushPromise(stream_id, stream_id + 1, /*end=*/true);
105
106
 
106
- EXPECT_CALL(receiver, OnContinuation(stream_id, /*end=*/true));
107
- event_forwarder.OnContinuation(stream_id, /*end=*/true);
107
+ EXPECT_CALL(receiver,
108
+ OnContinuation(stream_id, /*payload_length=*/42, /*end=*/true));
109
+ event_forwarder.OnContinuation(stream_id, /*payload_length=*/42,
110
+ /*end=*/true);
108
111
 
109
112
  const spdy::SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector;
110
113
  EXPECT_CALL(receiver, OnAltSvc(stream_id, some_data, altsvc_vector));
@@ -186,7 +189,8 @@ TEST(EventForwarderTest, DoesNotForwardEventsWithFalsePredicate) {
186
189
  event_forwarder.OnGoAwayFrameData(some_data.data(), some_data.size());
187
190
 
188
191
  EXPECT_CALL(receiver, OnHeaders).Times(0);
189
- event_forwarder.OnHeaders(stream_id, /*has_priority=*/false, /*weight=*/42,
192
+ event_forwarder.OnHeaders(stream_id, /*payload_length=*/1234,
193
+ /*has_priority=*/false, /*weight=*/42,
190
194
  stream_id + 2, /*exclusive=*/false, /*fin=*/true,
191
195
  /*end=*/true);
192
196
 
@@ -197,7 +201,8 @@ TEST(EventForwarderTest, DoesNotForwardEventsWithFalsePredicate) {
197
201
  event_forwarder.OnPushPromise(stream_id, stream_id + 1, /*end=*/true);
198
202
 
199
203
  EXPECT_CALL(receiver, OnContinuation).Times(0);
200
- event_forwarder.OnContinuation(stream_id, /*end=*/true);
204
+ event_forwarder.OnContinuation(stream_id, /*payload_length=*/42,
205
+ /*end=*/true);
201
206
 
202
207
  EXPECT_CALL(receiver, OnAltSvc).Times(0);
203
208
  const spdy::SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector;
@@ -81,17 +81,30 @@ bool IsValidStatus(absl::string_view status) {
81
81
  }
82
82
 
83
83
  bool ValidateRequestHeaders(const std::vector<std::string>& pseudo_headers,
84
+ absl::optional<std::string>& authority,
84
85
  absl::string_view method, absl::string_view path,
85
- bool allow_connect) {
86
+ bool allow_extended_connect) {
86
87
  QUICHE_VLOG(2) << "Request pseudo-headers: ["
87
88
  << absl::StrJoin(pseudo_headers, ", ")
88
- << "], allow_connect: " << allow_connect
89
+ << "], allow_extended_connect: " << allow_extended_connect
90
+ << ", authority: "
91
+ << (authority ? authority.value() : "<nullopt>")
89
92
  << ", method: " << method << ", path: " << path;
90
- if (allow_connect && method == "CONNECT") {
93
+ if (method == "CONNECT") {
94
+ if (allow_extended_connect) {
95
+ // See RFC 8441.
96
+ static const std::vector<std::string>* kExtendedConnectHeaders =
97
+ new std::vector<std::string>(
98
+ {":authority", ":method", ":path", ":protocol", ":scheme"});
99
+ if (pseudo_headers == *kExtendedConnectHeaders) {
100
+ return true;
101
+ }
102
+ }
103
+ // See RFC 7540 Section 8.3.
91
104
  static const std::vector<std::string>* kConnectHeaders =
92
- new std::vector<std::string>(
93
- {":authority", ":method", ":path", ":protocol", ":scheme"});
94
- return pseudo_headers == *kConnectHeaders;
105
+ new std::vector<std::string>({":authority", ":method"});
106
+ return authority.has_value() && !authority.value().empty() &&
107
+ pseudo_headers == *kConnectHeaders;
95
108
  }
96
109
 
97
110
  if (path.empty()) {
@@ -128,12 +141,11 @@ bool ValidateResponseTrailers(const std::vector<std::string>& pseudo_headers) {
128
141
  } // namespace
129
142
 
130
143
  void HeaderValidator::StartHeaderBlock() {
144
+ HeaderValidatorBase::StartHeaderBlock();
131
145
  pseudo_headers_.clear();
132
- status_.clear();
133
146
  method_.clear();
134
147
  path_.clear();
135
148
  authority_ = absl::nullopt;
136
- content_length_.reset();
137
149
  }
138
150
 
139
151
  HeaderValidator::HeaderStatus HeaderValidator::ValidateSingleHeader(
@@ -194,9 +206,16 @@ HeaderValidator::HeaderStatus HeaderValidator::ValidateSingleHeader(
194
206
  }
195
207
  }
196
208
  } else if (key == "content-length") {
197
- const bool success = HandleContentLength(value);
198
- if (!success) {
199
- return HEADER_FIELD_INVALID;
209
+ const ContentLengthStatus status = HandleContentLength(value);
210
+ switch (status) {
211
+ case CONTENT_LENGTH_ERROR:
212
+ return HEADER_FIELD_INVALID;
213
+ case CONTENT_LENGTH_SKIP:
214
+ return HEADER_SKIP;
215
+ case CONTENT_LENGTH_OK:
216
+ return HEADER_OK;
217
+ default:
218
+ return HEADER_FIELD_INVALID;
200
219
  }
201
220
  } else if (key == "te" && value != "trailers") {
202
221
  return HEADER_FIELD_INVALID;
@@ -214,8 +233,8 @@ bool HeaderValidator::FinishHeaderBlock(HeaderType type) {
214
233
  std::sort(pseudo_headers_.begin(), pseudo_headers_.end());
215
234
  switch (type) {
216
235
  case HeaderType::REQUEST:
217
- return ValidateRequestHeaders(pseudo_headers_, method_, path_,
218
- allow_connect_);
236
+ return ValidateRequestHeaders(pseudo_headers_, authority_, method_, path_,
237
+ allow_extended_connect_);
219
238
  case HeaderType::REQUEST_TRAILER:
220
239
  return ValidateRequestTrailers(pseudo_headers_);
221
240
  case HeaderType::RESPONSE_100:
@@ -227,28 +246,33 @@ bool HeaderValidator::FinishHeaderBlock(HeaderType type) {
227
246
  return false;
228
247
  }
229
248
 
230
- bool HeaderValidator::HandleContentLength(absl::string_view value) {
249
+ HeaderValidator::ContentLengthStatus HeaderValidator::HandleContentLength(
250
+ absl::string_view value) {
231
251
  if (value.empty()) {
232
- return false;
252
+ return CONTENT_LENGTH_ERROR;
233
253
  }
234
254
 
235
255
  if (status_ == "204" && value != "0") {
236
256
  // There should be no body in a "204 No Content" response.
237
- return false;
257
+ return CONTENT_LENGTH_ERROR;
238
258
  }
239
259
  if (!status_.empty() && status_[0] == '1' && value != "0") {
240
260
  // There should also be no body in a 1xx response.
241
- return false;
261
+ return CONTENT_LENGTH_ERROR;
242
262
  }
243
263
 
244
264
  size_t content_length = 0;
245
265
  const bool valid = absl::SimpleAtoi(value, &content_length);
246
266
  if (!valid) {
247
- return false;
267
+ return CONTENT_LENGTH_ERROR;
248
268
  }
249
269
 
270
+ if (content_length_.has_value()) {
271
+ return content_length == content_length_.value() ? CONTENT_LENGTH_SKIP
272
+ : CONTENT_LENGTH_ERROR;
273
+ }
250
274
  content_length_ = content_length;
251
- return true;
275
+ return CONTENT_LENGTH_OK;
252
276
  }
253
277
 
254
278
  // Returns whether `authority` contains only characters from the `host` ABNF
@@ -6,67 +6,38 @@
6
6
 
7
7
  #include "absl/strings/string_view.h"
8
8
  #include "absl/types/optional.h"
9
+ #include "quiche/http2/adapter/header_validator_base.h"
9
10
  #include "quiche/common/platform/api/quiche_export.h"
10
11
 
11
12
  namespace http2 {
12
13
  namespace adapter {
13
14
 
14
- enum class HeaderType : uint8_t {
15
- REQUEST,
16
- REQUEST_TRAILER,
17
- RESPONSE_100,
18
- RESPONSE,
19
- RESPONSE_TRAILER,
20
- };
21
-
22
- enum class ObsTextOption : uint8_t {
23
- kAllow,
24
- kDisallow,
25
- };
26
-
27
- class QUICHE_EXPORT_PRIVATE HeaderValidator {
15
+ class QUICHE_EXPORT_PRIVATE HeaderValidator : public HeaderValidatorBase {
28
16
  public:
29
17
  HeaderValidator() = default;
30
18
 
31
- void SetMaxFieldSize(uint32_t field_size) { max_field_size_ = field_size; }
32
- void SetObsTextOption(ObsTextOption option) { obs_text_option_ = option; }
33
-
34
- // If called, this validator will allow the `:protocol` pseudo-header, as
35
- // described in RFC 8441.
36
- void AllowConnect() { allow_connect_ = true; }
19
+ void StartHeaderBlock() override;
37
20
 
38
- void StartHeaderBlock();
39
-
40
- enum HeaderStatus {
41
- HEADER_OK,
42
- HEADER_FIELD_INVALID,
43
- HEADER_FIELD_TOO_LONG,
44
- };
45
21
  HeaderStatus ValidateSingleHeader(absl::string_view key,
46
- absl::string_view value);
22
+ absl::string_view value) override;
47
23
 
48
24
  // Returns true if all required pseudoheaders and no extra pseudoheaders are
49
25
  // present for the given header type.
50
- bool FinishHeaderBlock(HeaderType type);
51
-
52
- // For responses, returns the value of the ":status" header, if present.
53
- absl::string_view status_header() const { return status_; }
54
-
55
- absl::optional<size_t> content_length() const { return content_length_; }
26
+ bool FinishHeaderBlock(HeaderType type) override;
56
27
 
57
28
  private:
58
- bool HandleContentLength(absl::string_view value);
29
+ enum ContentLengthStatus {
30
+ CONTENT_LENGTH_OK,
31
+ CONTENT_LENGTH_SKIP, // Used to handle duplicate content length values.
32
+ CONTENT_LENGTH_ERROR,
33
+ };
34
+ ContentLengthStatus HandleContentLength(absl::string_view value);
59
35
  bool ValidateAndSetAuthority(absl::string_view authority);
60
36
 
61
37
  std::vector<std::string> pseudo_headers_;
62
38
  absl::optional<std::string> authority_ = absl::nullopt;
63
- std::string status_;
64
39
  std::string method_;
65
40
  std::string path_;
66
- absl::optional<size_t> max_field_size_;
67
- absl::optional<size_t> content_length_;
68
- ObsTextOption obs_text_option_ = ObsTextOption::kDisallow;
69
- bool allow_connect_ = false;
70
41
  };
71
42
 
72
43
  } // namespace adapter
@@ -0,0 +1,69 @@
1
+ #ifndef QUICHE_HTTP2_ADAPTER_HEADER_VALIDATOR_BASE_H_
2
+ #define QUICHE_HTTP2_ADAPTER_HEADER_VALIDATOR_BASE_H_
3
+
4
+ #include <string>
5
+
6
+ #include "absl/strings/string_view.h"
7
+ #include "absl/types/optional.h"
8
+ #include "quiche/common/platform/api/quiche_export.h"
9
+
10
+ namespace http2 {
11
+ namespace adapter {
12
+
13
+ enum class HeaderType : uint8_t {
14
+ REQUEST,
15
+ REQUEST_TRAILER,
16
+ RESPONSE_100,
17
+ RESPONSE,
18
+ RESPONSE_TRAILER,
19
+ };
20
+
21
+ enum class ObsTextOption : uint8_t {
22
+ kAllow,
23
+ kDisallow,
24
+ };
25
+
26
+ class QUICHE_EXPORT_PRIVATE HeaderValidatorBase {
27
+ public:
28
+ HeaderValidatorBase() = default;
29
+ virtual ~HeaderValidatorBase() = default;
30
+
31
+ virtual void StartHeaderBlock() {
32
+ status_.clear();
33
+ content_length_ = absl::nullopt;
34
+ }
35
+
36
+ enum HeaderStatus {
37
+ HEADER_OK,
38
+ HEADER_SKIP,
39
+ HEADER_FIELD_INVALID,
40
+ HEADER_FIELD_TOO_LONG,
41
+ };
42
+ virtual HeaderStatus ValidateSingleHeader(absl::string_view key,
43
+ absl::string_view value) = 0;
44
+
45
+ // Should return true if validation was successful.
46
+ virtual bool FinishHeaderBlock(HeaderType type) = 0;
47
+
48
+ // For responses, returns the value of the ":status" header, if present.
49
+ absl::string_view status_header() const { return status_; }
50
+
51
+ absl::optional<size_t> content_length() const { return content_length_; }
52
+
53
+ void SetMaxFieldSize(uint32_t field_size) { max_field_size_ = field_size; }
54
+ void SetObsTextOption(ObsTextOption option) { obs_text_option_ = option; }
55
+ // Allows the "extended CONNECT" syntax described in RFC 8441.
56
+ void SetAllowExtendedConnect() { allow_extended_connect_ = true; }
57
+
58
+ protected:
59
+ std::string status_;
60
+ absl::optional<size_t> max_field_size_;
61
+ absl::optional<size_t> content_length_;
62
+ ObsTextOption obs_text_option_ = ObsTextOption::kDisallow;
63
+ bool allow_extended_connect_ = false;
64
+ };
65
+
66
+ } // namespace adapter
67
+ } // namespace http2
68
+
69
+ #endif // QUICHE_HTTP2_ADAPTER_HEADER_VALIDATOR_BASE_H_
@@ -266,6 +266,54 @@ TEST(HeaderValidatorTest, RequestPseudoHeaders) {
266
266
  }
267
267
  }
268
268
 
269
+ TEST(HeaderValidatorTest, ConnectHeaders) {
270
+ // Too few headers.
271
+ HeaderValidator v;
272
+ v.StartHeaderBlock();
273
+ EXPECT_EQ(HeaderValidator::HEADER_OK,
274
+ v.ValidateSingleHeader(":authority", "athena.dialup.mit.edu:23"));
275
+ EXPECT_FALSE(v.FinishHeaderBlock(HeaderType::REQUEST));
276
+
277
+ v.StartHeaderBlock();
278
+ EXPECT_EQ(HeaderValidator::HEADER_OK,
279
+ v.ValidateSingleHeader(":method", "CONNECT"));
280
+ EXPECT_FALSE(v.FinishHeaderBlock(HeaderType::REQUEST));
281
+
282
+ // Too many headers.
283
+ v.StartHeaderBlock();
284
+ EXPECT_EQ(HeaderValidator::HEADER_OK,
285
+ v.ValidateSingleHeader(":authority", "athena.dialup.mit.edu:23"));
286
+ EXPECT_EQ(HeaderValidator::HEADER_OK,
287
+ v.ValidateSingleHeader(":method", "CONNECT"));
288
+ EXPECT_EQ(HeaderValidator::HEADER_OK, v.ValidateSingleHeader(":path", "/"));
289
+ EXPECT_FALSE(v.FinishHeaderBlock(HeaderType::REQUEST));
290
+
291
+ // Empty :authority
292
+ v.StartHeaderBlock();
293
+ EXPECT_EQ(HeaderValidator::HEADER_OK,
294
+ v.ValidateSingleHeader(":authority", ""));
295
+ EXPECT_EQ(HeaderValidator::HEADER_OK,
296
+ v.ValidateSingleHeader(":method", "CONNECT"));
297
+ EXPECT_FALSE(v.FinishHeaderBlock(HeaderType::REQUEST));
298
+
299
+ // Just right.
300
+ v.StartHeaderBlock();
301
+ EXPECT_EQ(HeaderValidator::HEADER_OK,
302
+ v.ValidateSingleHeader(":authority", "athena.dialup.mit.edu:23"));
303
+ EXPECT_EQ(HeaderValidator::HEADER_OK,
304
+ v.ValidateSingleHeader(":method", "CONNECT"));
305
+ EXPECT_TRUE(v.FinishHeaderBlock(HeaderType::REQUEST));
306
+
307
+ v.SetAllowExtendedConnect();
308
+ // "Classic" CONNECT headers should still be accepted.
309
+ v.StartHeaderBlock();
310
+ EXPECT_EQ(HeaderValidator::HEADER_OK,
311
+ v.ValidateSingleHeader(":authority", "athena.dialup.mit.edu:23"));
312
+ EXPECT_EQ(HeaderValidator::HEADER_OK,
313
+ v.ValidateSingleHeader(":method", "CONNECT"));
314
+ EXPECT_TRUE(v.FinishHeaderBlock(HeaderType::REQUEST));
315
+ }
316
+
269
317
  TEST(HeaderValidatorTest, WebsocketPseudoHeaders) {
270
318
  HeaderValidator v;
271
319
  v.StartHeaderBlock();
@@ -280,7 +328,7 @@ TEST(HeaderValidatorTest, WebsocketPseudoHeaders) {
280
328
 
281
329
  // Future header blocks may send the `:protocol` pseudo-header for CONNECT
282
330
  // requests.
283
- v.AllowConnect();
331
+ v.SetAllowExtendedConnect();
284
332
 
285
333
  v.StartHeaderBlock();
286
334
  for (Header to_add : kSampleRequestPseudoheaders) {
@@ -428,6 +476,30 @@ TEST(HeaderValidatorTest, Response204) {
428
476
  EXPECT_TRUE(v.FinishHeaderBlock(HeaderType::RESPONSE));
429
477
  }
430
478
 
479
+ TEST(HeaderValidatorTest, ResponseWithMultipleIdenticalContentLength) {
480
+ HeaderValidator v;
481
+
482
+ v.StartHeaderBlock();
483
+ EXPECT_EQ(HeaderValidator::HEADER_OK,
484
+ v.ValidateSingleHeader(":status", "200"));
485
+ EXPECT_EQ(HeaderValidator::HEADER_OK,
486
+ v.ValidateSingleHeader("content-length", "13"));
487
+ EXPECT_EQ(HeaderValidator::HEADER_SKIP,
488
+ v.ValidateSingleHeader("content-length", "13"));
489
+ }
490
+
491
+ TEST(HeaderValidatorTest, ResponseWithMultipleDifferingContentLength) {
492
+ HeaderValidator v;
493
+
494
+ v.StartHeaderBlock();
495
+ EXPECT_EQ(HeaderValidator::HEADER_OK,
496
+ v.ValidateSingleHeader(":status", "200"));
497
+ EXPECT_EQ(HeaderValidator::HEADER_OK,
498
+ v.ValidateSingleHeader("content-length", "13"));
499
+ EXPECT_EQ(HeaderValidator::HEADER_FIELD_INVALID,
500
+ v.ValidateSingleHeader("content-length", "17"));
501
+ }
502
+
431
503
  TEST(HeaderValidatorTest, Response204WithContentLengthZero) {
432
504
  HeaderValidator v;
433
505
 
@@ -5281,6 +5281,72 @@ TEST(NgHttp2AdapterTest, IncompleteRequestWithServerResponse) {
5281
5281
  EXPECT_FALSE(adapter->want_write());
5282
5282
  }
5283
5283
 
5284
+ TEST(NgHttp2AdapterTest, ServerHandlesMultipleContentLength) {
5285
+ DataSavingVisitor visitor;
5286
+ auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor);
5287
+ EXPECT_FALSE(adapter->want_write());
5288
+
5289
+ const std::string frames = TestFrameSequence()
5290
+ .ClientPreface()
5291
+ .Headers(1,
5292
+ {{":method", "POST"},
5293
+ {":scheme", "https"},
5294
+ {":authority", "example.com"},
5295
+ {":path", "/1"},
5296
+ {"content-length", "7"},
5297
+ {"content-length", "7"}},
5298
+ /*fin=*/false)
5299
+ .Headers(3,
5300
+ {{":method", "POST"},
5301
+ {":scheme", "https"},
5302
+ {":authority", "example.com"},
5303
+ {":path", "/3"},
5304
+ {"content-length", "11"},
5305
+ {"content-length", "13"}},
5306
+ /*fin=*/false)
5307
+ .Serialize();
5308
+ testing::InSequence s;
5309
+
5310
+ // Client preface (empty SETTINGS)
5311
+ EXPECT_CALL(visitor, OnFrameHeader(0, 0, SETTINGS, 0));
5312
+ EXPECT_CALL(visitor, OnSettingsStart());
5313
+ EXPECT_CALL(visitor, OnSettingsEnd());
5314
+ // Stream 1
5315
+ EXPECT_CALL(visitor, OnFrameHeader(1, _, HEADERS, 4));
5316
+ EXPECT_CALL(visitor, OnBeginHeadersForStream(1));
5317
+ EXPECT_CALL(visitor, OnHeaderForStream(1, ":method", "POST"));
5318
+ EXPECT_CALL(visitor, OnHeaderForStream(1, ":scheme", "https"));
5319
+ EXPECT_CALL(visitor, OnHeaderForStream(1, ":authority", "example.com"));
5320
+ EXPECT_CALL(visitor, OnHeaderForStream(1, ":path", "/1"));
5321
+ EXPECT_CALL(visitor, OnHeaderForStream(1, "content-length", "7"));
5322
+ // nghttp2 does not like duplicate Content-Length headers.
5323
+ EXPECT_CALL(
5324
+ visitor,
5325
+ OnErrorDebug("Invalid HTTP header field was received: frame type: 1, "
5326
+ "stream: 1, name: [content-length], value: [7]"));
5327
+ EXPECT_CALL(
5328
+ visitor,
5329
+ OnInvalidFrame(1, Http2VisitorInterface::InvalidFrameError::kHttpHeader));
5330
+ // Stream 3
5331
+ EXPECT_CALL(visitor, OnFrameHeader(3, _, HEADERS, 4));
5332
+ EXPECT_CALL(visitor, OnBeginHeadersForStream(3));
5333
+ EXPECT_CALL(visitor, OnHeaderForStream(3, ":method", "POST"));
5334
+ EXPECT_CALL(visitor, OnHeaderForStream(3, ":scheme", "https"));
5335
+ EXPECT_CALL(visitor, OnHeaderForStream(3, ":authority", "example.com"));
5336
+ EXPECT_CALL(visitor, OnHeaderForStream(3, ":path", "/3"));
5337
+ EXPECT_CALL(visitor, OnHeaderForStream(3, "content-length", "11"));
5338
+ EXPECT_CALL(
5339
+ visitor,
5340
+ OnErrorDebug("Invalid HTTP header field was received: frame type: 1, "
5341
+ "stream: 3, name: [content-length], value: [13]"));
5342
+ EXPECT_CALL(
5343
+ visitor,
5344
+ OnInvalidFrame(3, Http2VisitorInterface::InvalidFrameError::kHttpHeader));
5345
+
5346
+ const int64_t result = adapter->ProcessBytes(frames);
5347
+ EXPECT_EQ(frames.size(), static_cast<size_t>(result));
5348
+ }
5349
+
5284
5350
  TEST(NgHttp2AdapterTest, ServerSendsInvalidTrailers) {
5285
5351
  DataSavingVisitor visitor;
5286
5352
  auto adapter = NgHttp2Adapter::CreateServerAdapter(visitor);
@@ -5,8 +5,8 @@
5
5
  #include "quiche/http2/adapter/nghttp2_util.h"
6
6
  #include "quiche/http2/adapter/test_frame_sequence.h"
7
7
  #include "quiche/http2/adapter/test_utils.h"
8
+ #include "quiche/common/platform/api/quiche_expect_bug.h"
8
9
  #include "quiche/common/platform/api/quiche_test.h"
9
- #include "quiche/common/platform/api/quiche_test_helpers.h"
10
10
 
11
11
  namespace http2 {
12
12
  namespace adapter {
@@ -27,7 +27,7 @@ enum FrameType {
27
27
  WINDOW_UPDATE,
28
28
  };
29
29
 
30
- class NgHttp2SessionTest : public testing::Test {
30
+ class NgHttp2SessionTest : public quiche::test::QuicheTest {
31
31
  public:
32
32
  void SetUp() override {
33
33
  nghttp2_option_new(&options_);
@@ -311,9 +311,12 @@ TEST_F(NgHttp2SessionTest, NullPayload) {
311
311
  ASSERT_EQ(0, result);
312
312
  EXPECT_TRUE(session.want_write());
313
313
  int send_result = -1;
314
- EXPECT_QUICHE_BUG(send_result = nghttp2_session_send(session.raw_ptr()),
315
- "Extension frame payload for stream 1 is null!");
316
- EXPECT_EQ(NGHTTP2_ERR_CALLBACK_FAILURE, send_result);
314
+ EXPECT_QUICHE_BUG(
315
+ {
316
+ send_result = nghttp2_session_send(session.raw_ptr());
317
+ EXPECT_EQ(NGHTTP2_ERR_CALLBACK_FAILURE, send_result);
318
+ },
319
+ "Extension frame payload for stream 1 is null!");
317
320
  }
318
321
 
319
322
  } // namespace
@@ -38,7 +38,7 @@ nghttp2_option* GetOptions() {
38
38
  return options;
39
39
  }
40
40
 
41
- class Nghttp2Test : public testing::Test {
41
+ class Nghttp2Test : public quiche::test::QuicheTest {
42
42
  public:
43
43
  Nghttp2Test() : session_(MakeSessionPtr(nullptr)) {}
44
44
 
@@ -0,0 +1,22 @@
1
+ #include "quiche/http2/adapter/noop_header_validator.h"
2
+
3
+ #include "absl/strings/escaping.h"
4
+ #include "quiche/common/platform/api/quiche_logging.h"
5
+
6
+ namespace http2 {
7
+ namespace adapter {
8
+
9
+ HeaderValidatorBase::HeaderStatus NoopHeaderValidator::ValidateSingleHeader(
10
+ absl::string_view key, absl::string_view value) {
11
+ if (key == ":status") {
12
+ status_ = std::string(value);
13
+ }
14
+ return HEADER_OK;
15
+ }
16
+
17
+ bool NoopHeaderValidator::FinishHeaderBlock(HeaderType /* type */) {
18
+ return true;
19
+ }
20
+
21
+ } // namespace adapter
22
+ } // namespace http2
@@ -0,0 +1,25 @@
1
+ #ifndef QUICHE_HTTP2_ADAPTER_NOOP_HEADER_VALIDATOR_H_
2
+ #define QUICHE_HTTP2_ADAPTER_NOOP_HEADER_VALIDATOR_H_
3
+
4
+ #include "absl/strings/string_view.h"
5
+ #include "quiche/http2/adapter/header_validator_base.h"
6
+ #include "quiche/common/platform/api/quiche_export.h"
7
+
8
+ namespace http2 {
9
+ namespace adapter {
10
+
11
+ // A validator that does not actually perform any validation.
12
+ class QUICHE_EXPORT_PRIVATE NoopHeaderValidator : public HeaderValidatorBase {
13
+ public:
14
+ NoopHeaderValidator() = default;
15
+
16
+ HeaderStatus ValidateSingleHeader(absl::string_view key,
17
+ absl::string_view value) override;
18
+
19
+ bool FinishHeaderBlock(HeaderType type) override;
20
+ };
21
+
22
+ } // namespace adapter
23
+ } // namespace http2
24
+
25
+ #endif // QUICHE_HTTP2_ADAPTER_NOOP_HEADER_VALIDATOR_H_