protocol-quic 0.0.0

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 (343) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data/ext/ngtcp2/AUTHORS +44 -0
  4. data/ext/ngtcp2/CMakeLists.txt +431 -0
  5. data/ext/ngtcp2/CMakeOptions.txt +17 -0
  6. data/ext/ngtcp2/COPYING +22 -0
  7. data/ext/ngtcp2/ChangeLog +0 -0
  8. data/ext/ngtcp2/Makefile.am +60 -0
  9. data/ext/ngtcp2/NEWS +0 -0
  10. data/ext/ngtcp2/README +1 -0
  11. data/ext/ngtcp2/README.rst +258 -0
  12. data/ext/ngtcp2/ci/build_boringssl.sh +10 -0
  13. data/ext/ngtcp2/ci/build_nghttp3.sh +9 -0
  14. data/ext/ngtcp2/ci/build_openssl1.sh +8 -0
  15. data/ext/ngtcp2/ci/build_openssl1_cross.sh +9 -0
  16. data/ext/ngtcp2/ci/build_openssl3.sh +8 -0
  17. data/ext/ngtcp2/ci/build_picotls.sh +26 -0
  18. data/ext/ngtcp2/ci/build_wolfssl.sh +9 -0
  19. data/ext/ngtcp2/ci/gen-certificate.sh +8 -0
  20. data/ext/ngtcp2/cmake/ExtractValidFlags.cmake +31 -0
  21. data/ext/ngtcp2/cmake/FindCUnit.cmake +40 -0
  22. data/ext/ngtcp2/cmake/FindJemalloc.cmake +40 -0
  23. data/ext/ngtcp2/cmake/FindLibev.cmake +38 -0
  24. data/ext/ngtcp2/cmake/FindLibnghttp3.cmake +41 -0
  25. data/ext/ngtcp2/cmake/Findwolfssl.cmake +41 -0
  26. data/ext/ngtcp2/cmake/Version.cmake +11 -0
  27. data/ext/ngtcp2/cmakeconfig.h.in +36 -0
  28. data/ext/ngtcp2/configure.ac +755 -0
  29. data/ext/ngtcp2/crypto/CMakeLists.txt +56 -0
  30. data/ext/ngtcp2/crypto/Makefile.am +49 -0
  31. data/ext/ngtcp2/crypto/boringssl/CMakeLists.txt +64 -0
  32. data/ext/ngtcp2/crypto/boringssl/Makefile.am +39 -0
  33. data/ext/ngtcp2/crypto/boringssl/boringssl.c +630 -0
  34. data/ext/ngtcp2/crypto/boringssl/libngtcp2_crypto_boringssl.pc.in +33 -0
  35. data/ext/ngtcp2/crypto/gnutls/CMakeLists.txt +86 -0
  36. data/ext/ngtcp2/crypto/gnutls/Makefile.am +43 -0
  37. data/ext/ngtcp2/crypto/gnutls/gnutls.c +644 -0
  38. data/ext/ngtcp2/crypto/gnutls/libngtcp2_crypto_gnutls.pc.in +33 -0
  39. data/ext/ngtcp2/crypto/includes/CMakeLists.txt +56 -0
  40. data/ext/ngtcp2/crypto/includes/Makefile.am +45 -0
  41. data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto.h +893 -0
  42. data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_boringssl.h +104 -0
  43. data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_gnutls.h +107 -0
  44. data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_openssl.h +132 -0
  45. data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_picotls.h +246 -0
  46. data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_wolfssl.h +106 -0
  47. data/ext/ngtcp2/crypto/openssl/CMakeLists.txt +86 -0
  48. data/ext/ngtcp2/crypto/openssl/Makefile.am +43 -0
  49. data/ext/ngtcp2/crypto/openssl/libngtcp2_crypto_openssl.pc.in +33 -0
  50. data/ext/ngtcp2/crypto/openssl/openssl.c +807 -0
  51. data/ext/ngtcp2/crypto/picotls/CMakeLists.txt +65 -0
  52. data/ext/ngtcp2/crypto/picotls/Makefile.am +39 -0
  53. data/ext/ngtcp2/crypto/picotls/libngtcp2_crypto_picotls.pc.in +33 -0
  54. data/ext/ngtcp2/crypto/picotls/picotls.c +707 -0
  55. data/ext/ngtcp2/crypto/shared.c +1431 -0
  56. data/ext/ngtcp2/crypto/shared.h +350 -0
  57. data/ext/ngtcp2/crypto/wolfssl/CMakeLists.txt +84 -0
  58. data/ext/ngtcp2/crypto/wolfssl/Makefile.am +43 -0
  59. data/ext/ngtcp2/crypto/wolfssl/libngtcp2_crypto_wolfssl.pc.in +33 -0
  60. data/ext/ngtcp2/crypto/wolfssl/wolfssl.c +534 -0
  61. data/ext/ngtcp2/doc/Makefile.am +65 -0
  62. data/ext/ngtcp2/doc/make.bat +35 -0
  63. data/ext/ngtcp2/doc/mkapiref.py +356 -0
  64. data/ext/ngtcp2/doc/source/conf.py.in +94 -0
  65. data/ext/ngtcp2/doc/source/index.rst +22 -0
  66. data/ext/ngtcp2/doc/source/programmers-guide.rst +476 -0
  67. data/ext/ngtcp2/docker/Dockerfile +39 -0
  68. data/ext/ngtcp2/examples/CMakeLists.txt +361 -0
  69. data/ext/ngtcp2/examples/Makefile.am +228 -0
  70. data/ext/ngtcp2/examples/client.cc +3049 -0
  71. data/ext/ngtcp2/examples/client.h +192 -0
  72. data/ext/ngtcp2/examples/client_base.cc +202 -0
  73. data/ext/ngtcp2/examples/client_base.h +213 -0
  74. data/ext/ngtcp2/examples/debug.cc +298 -0
  75. data/ext/ngtcp2/examples/debug.h +124 -0
  76. data/ext/ngtcp2/examples/examplestest.cc +84 -0
  77. data/ext/ngtcp2/examples/gtlssimpleclient.c +720 -0
  78. data/ext/ngtcp2/examples/h09client.cc +2601 -0
  79. data/ext/ngtcp2/examples/h09client.h +196 -0
  80. data/ext/ngtcp2/examples/h09server.cc +3024 -0
  81. data/ext/ngtcp2/examples/h09server.h +237 -0
  82. data/ext/ngtcp2/examples/http.cc +138 -0
  83. data/ext/ngtcp2/examples/http.h +44 -0
  84. data/ext/ngtcp2/examples/network.h +80 -0
  85. data/ext/ngtcp2/examples/server.cc +3731 -0
  86. data/ext/ngtcp2/examples/server.h +256 -0
  87. data/ext/ngtcp2/examples/server_base.cc +58 -0
  88. data/ext/ngtcp2/examples/server_base.h +195 -0
  89. data/ext/ngtcp2/examples/shared.cc +385 -0
  90. data/ext/ngtcp2/examples/shared.h +96 -0
  91. data/ext/ngtcp2/examples/simpleclient.c +683 -0
  92. data/ext/ngtcp2/examples/template.h +71 -0
  93. data/ext/ngtcp2/examples/tests/README.rst +60 -0
  94. data/ext/ngtcp2/examples/tests/__init__.py +0 -0
  95. data/ext/ngtcp2/examples/tests/config.ini.in +32 -0
  96. data/ext/ngtcp2/examples/tests/conftest.py +28 -0
  97. data/ext/ngtcp2/examples/tests/ngtcp2test/__init__.py +6 -0
  98. data/ext/ngtcp2/examples/tests/ngtcp2test/certs.py +476 -0
  99. data/ext/ngtcp2/examples/tests/ngtcp2test/client.py +187 -0
  100. data/ext/ngtcp2/examples/tests/ngtcp2test/env.py +191 -0
  101. data/ext/ngtcp2/examples/tests/ngtcp2test/log.py +101 -0
  102. data/ext/ngtcp2/examples/tests/ngtcp2test/server.py +137 -0
  103. data/ext/ngtcp2/examples/tests/ngtcp2test/tls.py +983 -0
  104. data/ext/ngtcp2/examples/tests/test_01_handshake.py +30 -0
  105. data/ext/ngtcp2/examples/tests/test_02_resume.py +46 -0
  106. data/ext/ngtcp2/examples/tests/test_03_earlydata.py +56 -0
  107. data/ext/ngtcp2/examples/tests/test_04_clientcert.py +57 -0
  108. data/ext/ngtcp2/examples/tests/test_05_ciphers.py +46 -0
  109. data/ext/ngtcp2/examples/tls_client_context.h +52 -0
  110. data/ext/ngtcp2/examples/tls_client_context_boringssl.cc +126 -0
  111. data/ext/ngtcp2/examples/tls_client_context_boringssl.h +49 -0
  112. data/ext/ngtcp2/examples/tls_client_context_gnutls.cc +74 -0
  113. data/ext/ngtcp2/examples/tls_client_context_gnutls.h +50 -0
  114. data/ext/ngtcp2/examples/tls_client_context_openssl.cc +137 -0
  115. data/ext/ngtcp2/examples/tls_client_context_openssl.h +49 -0
  116. data/ext/ngtcp2/examples/tls_client_context_picotls.cc +158 -0
  117. data/ext/ngtcp2/examples/tls_client_context_picotls.h +53 -0
  118. data/ext/ngtcp2/examples/tls_client_context_wolfssl.cc +177 -0
  119. data/ext/ngtcp2/examples/tls_client_context_wolfssl.h +51 -0
  120. data/ext/ngtcp2/examples/tls_client_session.h +52 -0
  121. data/ext/ngtcp2/examples/tls_client_session_boringssl.cc +110 -0
  122. data/ext/ngtcp2/examples/tls_client_session_boringssl.h +52 -0
  123. data/ext/ngtcp2/examples/tls_client_session_gnutls.cc +190 -0
  124. data/ext/ngtcp2/examples/tls_client_session_gnutls.h +52 -0
  125. data/ext/ngtcp2/examples/tls_client_session_openssl.cc +113 -0
  126. data/ext/ngtcp2/examples/tls_client_session_openssl.h +52 -0
  127. data/ext/ngtcp2/examples/tls_client_session_picotls.cc +147 -0
  128. data/ext/ngtcp2/examples/tls_client_session_picotls.h +52 -0
  129. data/ext/ngtcp2/examples/tls_client_session_wolfssl.cc +160 -0
  130. data/ext/ngtcp2/examples/tls_client_session_wolfssl.h +52 -0
  131. data/ext/ngtcp2/examples/tls_server_context.h +52 -0
  132. data/ext/ngtcp2/examples/tls_server_context_boringssl.cc +257 -0
  133. data/ext/ngtcp2/examples/tls_server_context_boringssl.h +54 -0
  134. data/ext/ngtcp2/examples/tls_server_context_gnutls.cc +99 -0
  135. data/ext/ngtcp2/examples/tls_server_context_gnutls.h +59 -0
  136. data/ext/ngtcp2/examples/tls_server_context_openssl.cc +338 -0
  137. data/ext/ngtcp2/examples/tls_server_context_openssl.h +54 -0
  138. data/ext/ngtcp2/examples/tls_server_context_picotls.cc +321 -0
  139. data/ext/ngtcp2/examples/tls_server_context_picotls.h +58 -0
  140. data/ext/ngtcp2/examples/tls_server_context_wolfssl.cc +284 -0
  141. data/ext/ngtcp2/examples/tls_server_context_wolfssl.h +55 -0
  142. data/ext/ngtcp2/examples/tls_server_session.h +52 -0
  143. data/ext/ngtcp2/examples/tls_server_session_boringssl.cc +84 -0
  144. data/ext/ngtcp2/examples/tls_server_session_boringssl.h +47 -0
  145. data/ext/ngtcp2/examples/tls_server_session_gnutls.cc +155 -0
  146. data/ext/ngtcp2/examples/tls_server_session_gnutls.h +46 -0
  147. data/ext/ngtcp2/examples/tls_server_session_openssl.cc +54 -0
  148. data/ext/ngtcp2/examples/tls_server_session_openssl.h +47 -0
  149. data/ext/ngtcp2/examples/tls_server_session_picotls.cc +70 -0
  150. data/ext/ngtcp2/examples/tls_server_session_picotls.h +47 -0
  151. data/ext/ngtcp2/examples/tls_server_session_wolfssl.cc +55 -0
  152. data/ext/ngtcp2/examples/tls_server_session_wolfssl.h +47 -0
  153. data/ext/ngtcp2/examples/tls_session_base_gnutls.cc +87 -0
  154. data/ext/ngtcp2/examples/tls_session_base_gnutls.h +51 -0
  155. data/ext/ngtcp2/examples/tls_session_base_openssl.cc +54 -0
  156. data/ext/ngtcp2/examples/tls_session_base_openssl.h +52 -0
  157. data/ext/ngtcp2/examples/tls_session_base_picotls.cc +56 -0
  158. data/ext/ngtcp2/examples/tls_session_base_picotls.h +54 -0
  159. data/ext/ngtcp2/examples/tls_session_base_wolfssl.cc +54 -0
  160. data/ext/ngtcp2/examples/tls_session_base_wolfssl.h +54 -0
  161. data/ext/ngtcp2/examples/tls_shared_picotls.cc +59 -0
  162. data/ext/ngtcp2/examples/tls_shared_picotls.h +36 -0
  163. data/ext/ngtcp2/examples/util.cc +646 -0
  164. data/ext/ngtcp2/examples/util.h +361 -0
  165. data/ext/ngtcp2/examples/util_gnutls.cc +136 -0
  166. data/ext/ngtcp2/examples/util_openssl.cc +131 -0
  167. data/ext/ngtcp2/examples/util_test.cc +237 -0
  168. data/ext/ngtcp2/examples/util_test.h +45 -0
  169. data/ext/ngtcp2/examples/util_wolfssl.cc +130 -0
  170. data/ext/ngtcp2/fuzz/corpus/decode_frame/ack +0 -0
  171. data/ext/ngtcp2/fuzz/corpus/decode_frame/ack_ecn +0 -0
  172. data/ext/ngtcp2/fuzz/corpus/decode_frame/connection_close +0 -0
  173. data/ext/ngtcp2/fuzz/corpus/decode_frame/crypto +1 -0
  174. data/ext/ngtcp2/fuzz/corpus/decode_frame/data_blocked +1 -0
  175. data/ext/ngtcp2/fuzz/corpus/decode_frame/datagram +1 -0
  176. data/ext/ngtcp2/fuzz/corpus/decode_frame/datagram_len +1 -0
  177. data/ext/ngtcp2/fuzz/corpus/decode_frame/max_data +1 -0
  178. data/ext/ngtcp2/fuzz/corpus/decode_frame/max_stream_data +0 -0
  179. data/ext/ngtcp2/fuzz/corpus/decode_frame/max_streams +0 -0
  180. data/ext/ngtcp2/fuzz/corpus/decode_frame/new_connection_id +1 -0
  181. data/ext/ngtcp2/fuzz/corpus/decode_frame/new_token +1 -0
  182. data/ext/ngtcp2/fuzz/corpus/decode_frame/path_challenge +1 -0
  183. data/ext/ngtcp2/fuzz/corpus/decode_frame/path_response +1 -0
  184. data/ext/ngtcp2/fuzz/corpus/decode_frame/reset_stream +0 -0
  185. data/ext/ngtcp2/fuzz/corpus/decode_frame/retire_connection_id +1 -0
  186. data/ext/ngtcp2/fuzz/corpus/decode_frame/stop_sending +0 -0
  187. data/ext/ngtcp2/fuzz/corpus/decode_frame/stream +0 -0
  188. data/ext/ngtcp2/fuzz/corpus/decode_frame/stream_data_blocked +0 -0
  189. data/ext/ngtcp2/fuzz/corpus/decode_frame/stream_len +0 -0
  190. data/ext/ngtcp2/fuzz/corpus/decode_frame/streams_blocked +0 -0
  191. data/ext/ngtcp2/fuzz/corpus/ksl/random +0 -0
  192. data/ext/ngtcp2/fuzz/decode_frame.cc +25 -0
  193. data/ext/ngtcp2/fuzz/ksl.cc +77 -0
  194. data/ext/ngtcp2/interop/Dockerfile +39 -0
  195. data/ext/ngtcp2/interop/run_endpoint.sh +93 -0
  196. data/ext/ngtcp2/lib/CMakeLists.txt +110 -0
  197. data/ext/ngtcp2/lib/Makefile.am +122 -0
  198. data/ext/ngtcp2/lib/includes/CMakeLists.txt +4 -0
  199. data/ext/ngtcp2/lib/includes/Makefile.am +25 -0
  200. data/ext/ngtcp2/lib/includes/ngtcp2/ngtcp2.h +5843 -0
  201. data/ext/ngtcp2/lib/includes/ngtcp2/version.h.in +51 -0
  202. data/ext/ngtcp2/lib/libngtcp2.pc.in +33 -0
  203. data/ext/ngtcp2/lib/ngtcp2_acktr.c +335 -0
  204. data/ext/ngtcp2/lib/ngtcp2_acktr.h +221 -0
  205. data/ext/ngtcp2/lib/ngtcp2_addr.c +117 -0
  206. data/ext/ngtcp2/lib/ngtcp2_addr.h +69 -0
  207. data/ext/ngtcp2/lib/ngtcp2_balloc.c +90 -0
  208. data/ext/ngtcp2/lib/ngtcp2_balloc.h +91 -0
  209. data/ext/ngtcp2/lib/ngtcp2_bbr.c +693 -0
  210. data/ext/ngtcp2/lib/ngtcp2_bbr.h +157 -0
  211. data/ext/ngtcp2/lib/ngtcp2_bbr2.c +1490 -0
  212. data/ext/ngtcp2/lib/ngtcp2_bbr2.h +149 -0
  213. data/ext/ngtcp2/lib/ngtcp2_buf.c +56 -0
  214. data/ext/ngtcp2/lib/ngtcp2_buf.h +108 -0
  215. data/ext/ngtcp2/lib/ngtcp2_cc.c +616 -0
  216. data/ext/ngtcp2/lib/ngtcp2_cc.h +422 -0
  217. data/ext/ngtcp2/lib/ngtcp2_cid.c +147 -0
  218. data/ext/ngtcp2/lib/ngtcp2_cid.h +175 -0
  219. data/ext/ngtcp2/lib/ngtcp2_conn.c +13731 -0
  220. data/ext/ngtcp2/lib/ngtcp2_conn.h +1119 -0
  221. data/ext/ngtcp2/lib/ngtcp2_conn_stat.h +131 -0
  222. data/ext/ngtcp2/lib/ngtcp2_conv.c +291 -0
  223. data/ext/ngtcp2/lib/ngtcp2_conv.h +208 -0
  224. data/ext/ngtcp2/lib/ngtcp2_crypto.c +895 -0
  225. data/ext/ngtcp2/lib/ngtcp2_crypto.h +148 -0
  226. data/ext/ngtcp2/lib/ngtcp2_err.c +154 -0
  227. data/ext/ngtcp2/lib/ngtcp2_err.h +34 -0
  228. data/ext/ngtcp2/lib/ngtcp2_gaptr.c +167 -0
  229. data/ext/ngtcp2/lib/ngtcp2_gaptr.h +98 -0
  230. data/ext/ngtcp2/lib/ngtcp2_idtr.c +79 -0
  231. data/ext/ngtcp2/lib/ngtcp2_idtr.h +89 -0
  232. data/ext/ngtcp2/lib/ngtcp2_ksl.c +819 -0
  233. data/ext/ngtcp2/lib/ngtcp2_ksl.h +345 -0
  234. data/ext/ngtcp2/lib/ngtcp2_log.c +822 -0
  235. data/ext/ngtcp2/lib/ngtcp2_log.h +123 -0
  236. data/ext/ngtcp2/lib/ngtcp2_macro.h +58 -0
  237. data/ext/ngtcp2/lib/ngtcp2_map.c +336 -0
  238. data/ext/ngtcp2/lib/ngtcp2_map.h +136 -0
  239. data/ext/ngtcp2/lib/ngtcp2_mem.c +113 -0
  240. data/ext/ngtcp2/lib/ngtcp2_mem.h +72 -0
  241. data/ext/ngtcp2/lib/ngtcp2_net.h +136 -0
  242. data/ext/ngtcp2/lib/ngtcp2_objalloc.c +40 -0
  243. data/ext/ngtcp2/lib/ngtcp2_objalloc.h +140 -0
  244. data/ext/ngtcp2/lib/ngtcp2_opl.c +46 -0
  245. data/ext/ngtcp2/lib/ngtcp2_opl.h +65 -0
  246. data/ext/ngtcp2/lib/ngtcp2_path.c +77 -0
  247. data/ext/ngtcp2/lib/ngtcp2_path.h +49 -0
  248. data/ext/ngtcp2/lib/ngtcp2_pkt.c +2527 -0
  249. data/ext/ngtcp2/lib/ngtcp2_pkt.h +1235 -0
  250. data/ext/ngtcp2/lib/ngtcp2_pmtud.c +160 -0
  251. data/ext/ngtcp2/lib/ngtcp2_pmtud.h +123 -0
  252. data/ext/ngtcp2/lib/ngtcp2_ppe.c +230 -0
  253. data/ext/ngtcp2/lib/ngtcp2_ppe.h +153 -0
  254. data/ext/ngtcp2/lib/ngtcp2_pq.c +164 -0
  255. data/ext/ngtcp2/lib/ngtcp2_pq.h +126 -0
  256. data/ext/ngtcp2/lib/ngtcp2_pv.c +172 -0
  257. data/ext/ngtcp2/lib/ngtcp2_pv.h +194 -0
  258. data/ext/ngtcp2/lib/ngtcp2_qlog.c +1219 -0
  259. data/ext/ngtcp2/lib/ngtcp2_qlog.h +161 -0
  260. data/ext/ngtcp2/lib/ngtcp2_range.c +61 -0
  261. data/ext/ngtcp2/lib/ngtcp2_range.h +80 -0
  262. data/ext/ngtcp2/lib/ngtcp2_rcvry.h +40 -0
  263. data/ext/ngtcp2/lib/ngtcp2_ringbuf.c +121 -0
  264. data/ext/ngtcp2/lib/ngtcp2_ringbuf.h +132 -0
  265. data/ext/ngtcp2/lib/ngtcp2_rob.c +319 -0
  266. data/ext/ngtcp2/lib/ngtcp2_rob.h +197 -0
  267. data/ext/ngtcp2/lib/ngtcp2_rst.c +138 -0
  268. data/ext/ngtcp2/lib/ngtcp2_rst.h +86 -0
  269. data/ext/ngtcp2/lib/ngtcp2_rtb.c +1676 -0
  270. data/ext/ngtcp2/lib/ngtcp2_rtb.h +468 -0
  271. data/ext/ngtcp2/lib/ngtcp2_str.c +233 -0
  272. data/ext/ngtcp2/lib/ngtcp2_str.h +94 -0
  273. data/ext/ngtcp2/lib/ngtcp2_strm.c +698 -0
  274. data/ext/ngtcp2/lib/ngtcp2_strm.h +310 -0
  275. data/ext/ngtcp2/lib/ngtcp2_unreachable.c +71 -0
  276. data/ext/ngtcp2/lib/ngtcp2_unreachable.h +46 -0
  277. data/ext/ngtcp2/lib/ngtcp2_vec.c +243 -0
  278. data/ext/ngtcp2/lib/ngtcp2_vec.h +120 -0
  279. data/ext/ngtcp2/lib/ngtcp2_version.c +39 -0
  280. data/ext/ngtcp2/lib/ngtcp2_window_filter.c +99 -0
  281. data/ext/ngtcp2/lib/ngtcp2_window_filter.h +65 -0
  282. data/ext/ngtcp2/m4/ax_check_compile_flag.m4 +74 -0
  283. data/ext/ngtcp2/m4/ax_cxx_compile_stdcxx.m4 +1009 -0
  284. data/ext/ngtcp2/tests/CMakeLists.txt +68 -0
  285. data/ext/ngtcp2/tests/Makefile.am +94 -0
  286. data/ext/ngtcp2/tests/main.c +358 -0
  287. data/ext/ngtcp2/tests/ngtcp2_acktr_test.c +367 -0
  288. data/ext/ngtcp2/tests/ngtcp2_acktr_test.h +37 -0
  289. data/ext/ngtcp2/tests/ngtcp2_conn_test.c +9821 -0
  290. data/ext/ngtcp2/tests/ngtcp2_conn_test.h +104 -0
  291. data/ext/ngtcp2/tests/ngtcp2_conv_test.c +430 -0
  292. data/ext/ngtcp2/tests/ngtcp2_conv_test.h +46 -0
  293. data/ext/ngtcp2/tests/ngtcp2_crypto_test.c +667 -0
  294. data/ext/ngtcp2/tests/ngtcp2_crypto_test.h +35 -0
  295. data/ext/ngtcp2/tests/ngtcp2_gaptr_test.c +127 -0
  296. data/ext/ngtcp2/tests/ngtcp2_gaptr_test.h +36 -0
  297. data/ext/ngtcp2/tests/ngtcp2_idtr_test.c +79 -0
  298. data/ext/ngtcp2/tests/ngtcp2_idtr_test.h +34 -0
  299. data/ext/ngtcp2/tests/ngtcp2_ksl_test.c +502 -0
  300. data/ext/ngtcp2/tests/ngtcp2_ksl_test.h +39 -0
  301. data/ext/ngtcp2/tests/ngtcp2_map_test.c +206 -0
  302. data/ext/ngtcp2/tests/ngtcp2_map_test.h +38 -0
  303. data/ext/ngtcp2/tests/ngtcp2_pkt_test.c +1645 -0
  304. data/ext/ngtcp2/tests/ngtcp2_pkt_test.h +68 -0
  305. data/ext/ngtcp2/tests/ngtcp2_pmtud_test.c +153 -0
  306. data/ext/ngtcp2/tests/ngtcp2_pmtud_test.h +34 -0
  307. data/ext/ngtcp2/tests/ngtcp2_pv_test.c +129 -0
  308. data/ext/ngtcp2/tests/ngtcp2_pv_test.h +35 -0
  309. data/ext/ngtcp2/tests/ngtcp2_range_test.c +105 -0
  310. data/ext/ngtcp2/tests/ngtcp2_range_test.h +36 -0
  311. data/ext/ngtcp2/tests/ngtcp2_ringbuf_test.c +91 -0
  312. data/ext/ngtcp2/tests/ngtcp2_ringbuf_test.h +35 -0
  313. data/ext/ngtcp2/tests/ngtcp2_rob_test.c +552 -0
  314. data/ext/ngtcp2/tests/ngtcp2_rob_test.h +37 -0
  315. data/ext/ngtcp2/tests/ngtcp2_rtb_test.c +470 -0
  316. data/ext/ngtcp2/tests/ngtcp2_rtb_test.h +38 -0
  317. data/ext/ngtcp2/tests/ngtcp2_str_test.c +96 -0
  318. data/ext/ngtcp2/tests/ngtcp2_str_test.h +36 -0
  319. data/ext/ngtcp2/tests/ngtcp2_strm_test.c +575 -0
  320. data/ext/ngtcp2/tests/ngtcp2_strm_test.h +36 -0
  321. data/ext/ngtcp2/tests/ngtcp2_test_helper.c +404 -0
  322. data/ext/ngtcp2/tests/ngtcp2_test_helper.h +191 -0
  323. data/ext/ngtcp2/tests/ngtcp2_vec_test.c +426 -0
  324. data/ext/ngtcp2/tests/ngtcp2_vec_test.h +36 -0
  325. data/ext/ngtcp2/third-party/CMakeLists.txt +34 -0
  326. data/ext/ngtcp2/third-party/Makefile.am +31 -0
  327. data/ext/ngtcp2/third-party/http-parser/AUTHORS +68 -0
  328. data/ext/ngtcp2/third-party/http-parser/LICENSE-MIT +23 -0
  329. data/ext/ngtcp2/third-party/http-parser/Makefile +157 -0
  330. data/ext/ngtcp2/third-party/http-parser/README.md +246 -0
  331. data/ext/ngtcp2/third-party/http-parser/bench.c +111 -0
  332. data/ext/ngtcp2/third-party/http-parser/contrib/parsertrace.c +160 -0
  333. data/ext/ngtcp2/third-party/http-parser/contrib/url_parser.c +47 -0
  334. data/ext/ngtcp2/third-party/http-parser/http_parser.c +2419 -0
  335. data/ext/ngtcp2/third-party/http-parser/http_parser.gyp +111 -0
  336. data/ext/ngtcp2/third-party/http-parser/http_parser.h +431 -0
  337. data/ext/ngtcp2/third-party/http-parser/test.c +4411 -0
  338. data/lib/protocol/quic/version.rb +10 -0
  339. data/lib/protocol/quic.rb +9 -0
  340. data/license.md +21 -0
  341. data.tar.gz.sig +1 -0
  342. metadata +424 -0
  343. metadata.gz.sig +1 -0
@@ -0,0 +1,192 @@
1
+ /*
2
+ * ngtcp2
3
+ *
4
+ * Copyright (c) 2017 ngtcp2 contributors
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining
7
+ * a copy of this software and associated documentation files (the
8
+ * "Software"), to deal in the Software without restriction, including
9
+ * without limitation the rights to use, copy, modify, merge, publish,
10
+ * distribute, sublicense, and/or sell copies of the Software, and to
11
+ * permit persons to whom the Software is furnished to do so, subject to
12
+ * the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be
15
+ * included in all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+ */
25
+ #ifndef CLIENT_H
26
+ #define CLIENT_H
27
+
28
+ #ifdef HAVE_CONFIG_H
29
+ # include <config.h>
30
+ #endif // HAVE_CONFIG_H
31
+
32
+ #include <vector>
33
+ #include <deque>
34
+ #include <map>
35
+ #include <string_view>
36
+ #include <memory>
37
+
38
+ #include <ngtcp2/ngtcp2.h>
39
+ #include <ngtcp2/ngtcp2_crypto.h>
40
+ #include <nghttp3/nghttp3.h>
41
+
42
+ #include <ev.h>
43
+
44
+ #include "client_base.h"
45
+ #include "tls_client_context.h"
46
+ #include "tls_client_session.h"
47
+ #include "network.h"
48
+ #include "shared.h"
49
+ #include "template.h"
50
+
51
+ using namespace ngtcp2;
52
+
53
+ struct Stream {
54
+ Stream(const Request &req, int64_t stream_id);
55
+ ~Stream();
56
+
57
+ int open_file(const std::string_view &path);
58
+
59
+ Request req;
60
+ int64_t stream_id;
61
+ int fd;
62
+ };
63
+
64
+ class Client;
65
+
66
+ struct Endpoint {
67
+ Address addr;
68
+ ev_io rev;
69
+ Client *client;
70
+ int fd;
71
+ };
72
+
73
+ class Client : public ClientBase {
74
+ public:
75
+ Client(struct ev_loop *loop, uint32_t client_chosen_version,
76
+ uint32_t original_version);
77
+ ~Client();
78
+
79
+ int init(int fd, const Address &local_addr, const Address &remote_addr,
80
+ const char *addr, const char *port, TLSClientContext &tls_ctx);
81
+ void disconnect();
82
+
83
+ int on_read(const Endpoint &ep);
84
+ int on_write();
85
+ int write_streams();
86
+ int feed_data(const Endpoint &ep, const sockaddr *sa, socklen_t salen,
87
+ const ngtcp2_pkt_info *pi, uint8_t *data, size_t datalen);
88
+ int handle_expiry();
89
+ void update_timer();
90
+ int handshake_completed();
91
+ int handshake_confirmed();
92
+ void recv_version_negotiation(const uint32_t *sv, size_t nsv);
93
+
94
+ int send_packet(const Endpoint &ep, const ngtcp2_addr &remote_addr,
95
+ unsigned int ecn, const uint8_t *data, size_t datalen);
96
+ int on_stream_close(int64_t stream_id, uint64_t app_error_code);
97
+ int on_extend_max_streams();
98
+ int handle_error();
99
+ int make_stream_early();
100
+ int change_local_addr();
101
+ void start_change_local_addr_timer();
102
+ int update_key(uint8_t *rx_secret, uint8_t *tx_secret,
103
+ ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_iv,
104
+ ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_iv,
105
+ const uint8_t *current_rx_secret,
106
+ const uint8_t *current_tx_secret, size_t secretlen);
107
+ int initiate_key_update();
108
+ void start_key_update_timer();
109
+ void start_delay_stream_timer();
110
+
111
+ int select_preferred_address(Address &selected_addr,
112
+ const ngtcp2_preferred_addr *paddr);
113
+
114
+ std::optional<Endpoint *> endpoint_for(const Address &remote_addr);
115
+
116
+ void set_remote_addr(const ngtcp2_addr &remote_addr);
117
+
118
+ int setup_httpconn();
119
+ int submit_http_request(const Stream *stream);
120
+ int recv_stream_data(uint32_t flags, int64_t stream_id, const uint8_t *data,
121
+ size_t datalen);
122
+ int acked_stream_data_offset(int64_t stream_id, uint64_t datalen);
123
+ void http_consume(int64_t stream_id, size_t nconsumed);
124
+ void http_write_data(int64_t stream_id, const uint8_t *data, size_t datalen);
125
+ int on_stream_reset(int64_t stream_id);
126
+ int on_stream_stop_sending(int64_t stream_id);
127
+ int extend_max_stream_data(int64_t stream_id, uint64_t max_data);
128
+ int stop_sending(int64_t stream_id, uint64_t app_error_code);
129
+ int reset_stream(int64_t stream_id, uint64_t app_error_code);
130
+ int http_stream_close(int64_t stream_id, uint64_t app_error_code);
131
+
132
+ void on_send_blocked(const Endpoint &ep, const ngtcp2_addr &remote_addr,
133
+ unsigned int ecn, size_t datalen);
134
+ void start_wev_endpoint(const Endpoint &ep);
135
+ int send_blocked_packet();
136
+
137
+ const std::vector<uint32_t> &get_offered_versions() const;
138
+
139
+ bool get_early_data() const;
140
+ void early_data_rejected();
141
+
142
+ private:
143
+ std::vector<Endpoint> endpoints_;
144
+ Address remote_addr_;
145
+ ev_io wev_;
146
+ ev_timer timer_;
147
+ ev_timer change_local_addr_timer_;
148
+ ev_timer key_update_timer_;
149
+ ev_timer delay_stream_timer_;
150
+ ev_signal sigintev_;
151
+ struct ev_loop *loop_;
152
+ std::map<int64_t, std::unique_ptr<Stream>> streams_;
153
+ std::vector<uint32_t> offered_versions_;
154
+ nghttp3_conn *httpconn_;
155
+ // addr_ is the server host address.
156
+ const char *addr_;
157
+ // port_ is the server port.
158
+ const char *port_;
159
+ // nstreams_done_ is the number of streams opened.
160
+ size_t nstreams_done_;
161
+ // nstreams_closed_ is the number of streams get closed.
162
+ size_t nstreams_closed_;
163
+ // nkey_update_ is the number of key update occurred.
164
+ size_t nkey_update_;
165
+ uint32_t client_chosen_version_;
166
+ uint32_t original_version_;
167
+ // early_data_ is true if client attempts to do 0RTT data transfer.
168
+ bool early_data_;
169
+ // should_exit_ is true if client should exit rather than waiting
170
+ // for timeout.
171
+ bool should_exit_;
172
+ // should_exit_on_handshake_confirmed_ is true if client should exit
173
+ // when handshake confirmed.
174
+ bool should_exit_on_handshake_confirmed_;
175
+ // handshake_confirmed_ gets true after handshake has been
176
+ // confirmed.
177
+ bool handshake_confirmed_;
178
+
179
+ struct {
180
+ bool send_blocked;
181
+ // blocked field is effective only when send_blocked is true.
182
+ struct {
183
+ const Endpoint *endpoint;
184
+ Address remote_addr;
185
+ unsigned int ecn;
186
+ size_t datalen;
187
+ } blocked;
188
+ std::array<uint8_t, 64_k> data;
189
+ } tx_;
190
+ };
191
+
192
+ #endif // CLIENT_H
@@ -0,0 +1,202 @@
1
+ /*
2
+ * ngtcp2
3
+ *
4
+ * Copyright (c) 2020 ngtcp2 contributors
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining
7
+ * a copy of this software and associated documentation files (the
8
+ * "Software"), to deal in the Software without restriction, including
9
+ * without limitation the rights to use, copy, modify, merge, publish,
10
+ * distribute, sublicense, and/or sell copies of the Software, and to
11
+ * permit persons to whom the Software is furnished to do so, subject to
12
+ * the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be
15
+ * included in all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+ */
25
+ #include "client_base.h"
26
+
27
+ #include <cassert>
28
+ #include <array>
29
+ #include <iostream>
30
+ #include <fstream>
31
+
32
+ #include "debug.h"
33
+ #include "template.h"
34
+ #include "util.h"
35
+
36
+ using namespace ngtcp2;
37
+ using namespace std::literals;
38
+
39
+ extern Config config;
40
+
41
+ static ngtcp2_conn *get_conn(ngtcp2_crypto_conn_ref *conn_ref) {
42
+ auto c = static_cast<ClientBase *>(conn_ref->user_data);
43
+ return c->conn();
44
+ }
45
+
46
+ ClientBase::ClientBase()
47
+ : conn_ref_{get_conn, this}, qlog_(nullptr), conn_(nullptr) {
48
+ ngtcp2_connection_close_error_default(&last_error_);
49
+ }
50
+
51
+ ClientBase::~ClientBase() {
52
+ if (conn_) {
53
+ ngtcp2_conn_del(conn_);
54
+ }
55
+
56
+ if (qlog_) {
57
+ fclose(qlog_);
58
+ }
59
+ }
60
+
61
+ int ClientBase::write_transport_params(const char *path,
62
+ const ngtcp2_transport_params *params) {
63
+ auto f = std::ofstream(path);
64
+ if (!f) {
65
+ return -1;
66
+ }
67
+
68
+ f << "initial_max_streams_bidi=" << params->initial_max_streams_bidi << '\n'
69
+ << "initial_max_streams_uni=" << params->initial_max_streams_uni << '\n'
70
+ << "initial_max_stream_data_bidi_local="
71
+ << params->initial_max_stream_data_bidi_local << '\n'
72
+ << "initial_max_stream_data_bidi_remote="
73
+ << params->initial_max_stream_data_bidi_remote << '\n'
74
+ << "initial_max_stream_data_uni=" << params->initial_max_stream_data_uni
75
+ << '\n'
76
+ << "initial_max_data=" << params->initial_max_data << '\n'
77
+ << "active_connection_id_limit=" << params->active_connection_id_limit
78
+ << '\n'
79
+ << "max_datagram_frame_size=" << params->max_datagram_frame_size << '\n';
80
+
81
+ f.close();
82
+ if (!f) {
83
+ return -1;
84
+ }
85
+
86
+ return 0;
87
+ }
88
+
89
+ int ClientBase::read_transport_params(const char *path,
90
+ ngtcp2_transport_params *params) {
91
+ auto f = std::ifstream(path);
92
+ if (!f) {
93
+ return -1;
94
+ }
95
+
96
+ for (std::string line; std::getline(f, line);) {
97
+ if (util::istarts_with(line, "initial_max_streams_bidi="sv)) {
98
+ if (auto n = util::parse_uint(line.c_str() +
99
+ "initial_max_streams_bidi="sv.size());
100
+ !n) {
101
+ return -1;
102
+ } else {
103
+ params->initial_max_streams_bidi = *n;
104
+ }
105
+ continue;
106
+ }
107
+
108
+ if (util::istarts_with(line, "initial_max_streams_uni="sv)) {
109
+ if (auto n = util::parse_uint(line.c_str() +
110
+ "initial_max_streams_uni="sv.size());
111
+ !n) {
112
+ return -1;
113
+ } else {
114
+ params->initial_max_streams_uni = *n;
115
+ }
116
+ continue;
117
+ }
118
+
119
+ if (util::istarts_with(line, "initial_max_stream_data_bidi_local="sv)) {
120
+ if (auto n = util::parse_uint(
121
+ line.c_str() + "initial_max_stream_data_bidi_local="sv.size());
122
+ !n) {
123
+ return -1;
124
+ } else {
125
+ params->initial_max_stream_data_bidi_local = *n;
126
+ }
127
+ continue;
128
+ }
129
+
130
+ if (util::istarts_with(line, "initial_max_stream_data_bidi_remote="sv)) {
131
+ if (auto n = util::parse_uint(
132
+ line.c_str() + "initial_max_stream_data_bidi_remote="sv.size());
133
+ !n) {
134
+ return -1;
135
+ } else {
136
+ params->initial_max_stream_data_bidi_remote = *n;
137
+ }
138
+ continue;
139
+ }
140
+
141
+ if (util::istarts_with(line, "initial_max_stream_data_uni="sv)) {
142
+ if (auto n = util::parse_uint(line.c_str() +
143
+ "initial_max_stream_data_uni="sv.size());
144
+ !n) {
145
+ return -1;
146
+ } else {
147
+ params->initial_max_stream_data_uni = *n;
148
+ }
149
+ continue;
150
+ }
151
+
152
+ if (util::istarts_with(line, "initial_max_data="sv)) {
153
+ if (auto n =
154
+ util::parse_uint(line.c_str() + "initial_max_data="sv.size());
155
+ !n) {
156
+ return -1;
157
+ } else {
158
+ params->initial_max_data = *n;
159
+ }
160
+ continue;
161
+ }
162
+
163
+ if (util::istarts_with(line, "active_connection_id_limit="sv)) {
164
+ if (auto n = util::parse_uint(line.c_str() +
165
+ "active_connection_id_limit="sv.size());
166
+ !n) {
167
+ return -1;
168
+ } else {
169
+ params->active_connection_id_limit = *n;
170
+ }
171
+ continue;
172
+ }
173
+
174
+ if (util::istarts_with(line, "max_datagram_frame_size="sv)) {
175
+ if (auto n = util::parse_uint(line.c_str() +
176
+ "max_datagram_frame_size="sv.size());
177
+ !n) {
178
+ return -1;
179
+ } else {
180
+ params->max_datagram_frame_size = *n;
181
+ }
182
+ continue;
183
+ }
184
+ }
185
+
186
+ return 0;
187
+ }
188
+
189
+ ngtcp2_conn *ClientBase::conn() const { return conn_; }
190
+
191
+ void qlog_write_cb(void *user_data, uint32_t flags, const void *data,
192
+ size_t datalen) {
193
+ auto c = static_cast<ClientBase *>(user_data);
194
+ c->write_qlog(data, datalen);
195
+ }
196
+
197
+ void ClientBase::write_qlog(const void *data, size_t datalen) {
198
+ assert(qlog_);
199
+ fwrite(data, 1, datalen, qlog_);
200
+ }
201
+
202
+ ngtcp2_crypto_conn_ref *ClientBase::conn_ref() { return &conn_ref_; }
@@ -0,0 +1,213 @@
1
+ /*
2
+ * ngtcp2
3
+ *
4
+ * Copyright (c) 2020 ngtcp2 contributors
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining
7
+ * a copy of this software and associated documentation files (the
8
+ * "Software"), to deal in the Software without restriction, including
9
+ * without limitation the rights to use, copy, modify, merge, publish,
10
+ * distribute, sublicense, and/or sell copies of the Software, and to
11
+ * permit persons to whom the Software is furnished to do so, subject to
12
+ * the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be
15
+ * included in all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+ */
25
+ #ifndef CLIENT_BASE_H
26
+ #define CLIENT_BASE_H
27
+
28
+ #ifdef HAVE_CONFIG_H
29
+ # include <config.h>
30
+ #endif // HAVE_CONFIG_H
31
+
32
+ #include <vector>
33
+ #include <deque>
34
+ #include <string>
35
+ #include <string_view>
36
+ #include <functional>
37
+
38
+ #include <ngtcp2/ngtcp2_crypto.h>
39
+
40
+ #include "tls_client_session.h"
41
+ #include "network.h"
42
+ #include "shared.h"
43
+
44
+ using namespace ngtcp2;
45
+
46
+ struct Request {
47
+ std::string_view scheme;
48
+ std::string authority;
49
+ std::string path;
50
+ };
51
+
52
+ struct Config {
53
+ ngtcp2_cid dcid;
54
+ ngtcp2_cid scid;
55
+ bool scid_present;
56
+ // tx_loss_prob is probability of losing outgoing packet.
57
+ double tx_loss_prob;
58
+ // rx_loss_prob is probability of losing incoming packet.
59
+ double rx_loss_prob;
60
+ // fd is a file descriptor to read input for streams.
61
+ int fd;
62
+ // ciphers is the list of enabled ciphers.
63
+ const char *ciphers;
64
+ // groups is the list of supported groups.
65
+ const char *groups;
66
+ // nstreams is the number of streams to open.
67
+ size_t nstreams;
68
+ // data is the pointer to memory region which maps file denoted by
69
+ // fd.
70
+ uint8_t *data;
71
+ // datalen is the length of file denoted by fd.
72
+ size_t datalen;
73
+ // version is a QUIC version to use.
74
+ uint32_t version;
75
+ // quiet suppresses the output normally shown except for the error
76
+ // messages.
77
+ bool quiet;
78
+ // timeout is an idle timeout for QUIC connection.
79
+ ngtcp2_duration timeout;
80
+ // session_file is a path to a file to write, and read TLS session.
81
+ const char *session_file;
82
+ // tp_file is a path to a file to write, and read QUIC transport
83
+ // parameters.
84
+ const char *tp_file;
85
+ // show_secret is true if transport secrets should be printed out.
86
+ bool show_secret;
87
+ // change_local_addr is the duration after which client changes
88
+ // local address.
89
+ ngtcp2_duration change_local_addr;
90
+ // key_update is the duration after which client initiates key
91
+ // update.
92
+ ngtcp2_duration key_update;
93
+ // delay_stream is the duration after which client sends the first
94
+ // 1-RTT stream.
95
+ ngtcp2_duration delay_stream;
96
+ // nat_rebinding is true if simulated NAT rebinding is enabled.
97
+ bool nat_rebinding;
98
+ // no_preferred_addr is true if client do not follow preferred
99
+ // address offered by server.
100
+ bool no_preferred_addr;
101
+ std::string_view http_method;
102
+ // download is a path to a directory where a downloaded file is
103
+ // saved. If it is empty, no file is saved.
104
+ std::string_view download;
105
+ // requests contains URIs to request.
106
+ std::vector<Request> requests;
107
+ // no_quic_dump is true if hexdump of QUIC STREAM and CRYPTO data
108
+ // should be disabled.
109
+ bool no_quic_dump;
110
+ // no_http_dump is true if hexdump of HTTP response body should be
111
+ // disabled.
112
+ bool no_http_dump;
113
+ // qlog_file is the path to write qlog.
114
+ std::string_view qlog_file;
115
+ // qlog_dir is the path to directory where qlog is stored. qlog_dir
116
+ // and qlog_file are mutually exclusive.
117
+ std::string_view qlog_dir;
118
+ // max_data is the initial connection-level flow control window.
119
+ uint64_t max_data;
120
+ // max_stream_data_bidi_local is the initial stream-level flow
121
+ // control window for a bidirectional stream that the local endpoint
122
+ // initiates.
123
+ uint64_t max_stream_data_bidi_local;
124
+ // max_stream_data_bidi_remote is the initial stream-level flow
125
+ // control window for a bidirectional stream that the remote
126
+ // endpoint initiates.
127
+ uint64_t max_stream_data_bidi_remote;
128
+ // max_stream_data_uni is the initial stream-level flow control
129
+ // window for a unidirectional stream.
130
+ uint64_t max_stream_data_uni;
131
+ // max_streams_bidi is the number of the concurrent bidirectional
132
+ // streams.
133
+ uint64_t max_streams_bidi;
134
+ // max_streams_uni is the number of the concurrent unidirectional
135
+ // streams.
136
+ uint64_t max_streams_uni;
137
+ // max_window is the maximum connection-level flow control window
138
+ // size if auto-tuning is enabled.
139
+ uint64_t max_window;
140
+ // max_stream_window is the maximum stream-level flow control window
141
+ // size if auto-tuning is enabled.
142
+ uint64_t max_stream_window;
143
+ // exit_on_first_stream_close is the flag that if it is true, client
144
+ // exits when a first HTTP stream gets closed. It is not
145
+ // necessarily the same time when the underlying QUIC stream closes
146
+ // due to the QPACK synchronization.
147
+ bool exit_on_first_stream_close;
148
+ // exit_on_all_streams_close is the flag that if it is true, client
149
+ // exits when all HTTP streams get closed.
150
+ bool exit_on_all_streams_close;
151
+ // disable_early_data disables early data.
152
+ bool disable_early_data;
153
+ // static_secret is used to derive keying materials for Stateless
154
+ // Retry token.
155
+ std::array<uint8_t, 32> static_secret;
156
+ // cc_algo is the congestion controller algorithm.
157
+ ngtcp2_cc_algo cc_algo;
158
+ // token_file is a path to file to read or write token from
159
+ // NEW_TOKEN frame.
160
+ std::string_view token_file;
161
+ // sni is the value sent in TLS SNI, overriding DNS name of the
162
+ // remote host.
163
+ std::string_view sni;
164
+ // initial_rtt is an initial RTT.
165
+ ngtcp2_duration initial_rtt;
166
+ // max_udp_payload_size is the maximum UDP payload size that client
167
+ // transmits.
168
+ size_t max_udp_payload_size;
169
+ // handshake_timeout is the period of time before giving up QUIC
170
+ // connection establishment.
171
+ ngtcp2_duration handshake_timeout;
172
+ // preferred_versions includes QUIC versions in the order of
173
+ // preference. Client uses this field to select a version from the
174
+ // version set offered in Version Negotiation packet.
175
+ std::vector<uint32_t> preferred_versions;
176
+ // available_versions includes QUIC versions that are sent in
177
+ // available_versions field of version_information
178
+ // transport_parameter.
179
+ std::vector<uint32_t> available_versions;
180
+ // no_pmtud disables Path MTU Discovery.
181
+ bool no_pmtud;
182
+ // ack_thresh is the minimum number of the received ACK eliciting
183
+ // packets that triggers immediate acknowledgement.
184
+ size_t ack_thresh;
185
+ };
186
+
187
+ class ClientBase {
188
+ public:
189
+ ClientBase();
190
+ ~ClientBase();
191
+
192
+ ngtcp2_conn *conn() const;
193
+
194
+ int write_transport_params(const char *path,
195
+ const ngtcp2_transport_params *params);
196
+ int read_transport_params(const char *path, ngtcp2_transport_params *params);
197
+
198
+ void write_qlog(const void *data, size_t datalen);
199
+
200
+ ngtcp2_crypto_conn_ref *conn_ref();
201
+
202
+ protected:
203
+ ngtcp2_crypto_conn_ref conn_ref_;
204
+ TLSClientSession tls_session_;
205
+ FILE *qlog_;
206
+ ngtcp2_conn *conn_;
207
+ ngtcp2_connection_close_error last_error_;
208
+ };
209
+
210
+ void qlog_write_cb(void *user_data, uint32_t flags, const void *data,
211
+ size_t datalen);
212
+
213
+ #endif // CLIENT_BASE_H