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,646 @@
1
+ /*
2
+ * ngtcp2
3
+ *
4
+ * Copyright (c) 2017 ngtcp2 contributors
5
+ * Copyright (c) 2012 nghttp2 contributors
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining
8
+ * a copy of this software and associated documentation files (the
9
+ * "Software"), to deal in the Software without restriction, including
10
+ * without limitation the rights to use, copy, modify, merge, publish,
11
+ * distribute, sublicense, and/or sell copies of the Software, and to
12
+ * permit persons to whom the Software is furnished to do so, subject to
13
+ * the following conditions:
14
+ *
15
+ * The above copyright notice and this permission notice shall be
16
+ * included in all copies or substantial portions of the Software.
17
+ *
18
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
+ */
26
+ #include "util.h"
27
+
28
+ #ifdef HAVE_ARPA_INET_H
29
+ # include <arpa/inet.h>
30
+ #endif // HAVE_ARPA_INET_H
31
+ #ifdef HAVE_NETINET_IN_H
32
+ # include <netinet/in.h>
33
+ #endif
34
+ #include <sys/types.h>
35
+ #include <unistd.h>
36
+ #include <fcntl.h>
37
+ #include <netdb.h>
38
+
39
+ #include <cassert>
40
+ #include <cstring>
41
+ #include <chrono>
42
+ #include <array>
43
+ #include <iostream>
44
+ #include <fstream>
45
+ #include <algorithm>
46
+ #include <limits>
47
+ #include <charconv>
48
+
49
+ #include "template.h"
50
+
51
+ using namespace std::literals;
52
+
53
+ namespace ngtcp2 {
54
+
55
+ namespace util {
56
+
57
+ namespace {
58
+ constexpr char LOWER_XDIGITS[] = "0123456789abcdef";
59
+ } // namespace
60
+
61
+ std::string format_hex(uint8_t c) {
62
+ std::string s;
63
+ s.resize(2);
64
+
65
+ s[0] = LOWER_XDIGITS[c >> 4];
66
+ s[1] = LOWER_XDIGITS[c & 0xf];
67
+
68
+ return s;
69
+ }
70
+
71
+ std::string format_hex(const uint8_t *s, size_t len) {
72
+ std::string res;
73
+ res.resize(len * 2);
74
+
75
+ for (size_t i = 0; i < len; ++i) {
76
+ auto c = s[i];
77
+
78
+ res[i * 2] = LOWER_XDIGITS[c >> 4];
79
+ res[i * 2 + 1] = LOWER_XDIGITS[c & 0x0f];
80
+ }
81
+ return res;
82
+ }
83
+
84
+ std::string format_hex(const std::string_view &s) {
85
+ return format_hex(reinterpret_cast<const uint8_t *>(s.data()), s.size());
86
+ }
87
+
88
+ std::string decode_hex(const std::string_view &s) {
89
+ assert(s.size() % 2 == 0);
90
+ std::string res(s.size() / 2, '0');
91
+ auto p = std::begin(res);
92
+ for (auto it = std::begin(s); it != std::end(s); it += 2) {
93
+ *p++ = (hex_to_uint(*it) << 4) | hex_to_uint(*(it + 1));
94
+ }
95
+ return res;
96
+ }
97
+
98
+ namespace {
99
+ // format_fraction2 formats |n| as fraction part of integer. |n| is
100
+ // considered as fraction, and its precision is 3 digits. The last
101
+ // digit is ignored. The precision of the resulting fraction is 2
102
+ // digits.
103
+ std::string format_fraction2(uint32_t n) {
104
+ n /= 10;
105
+
106
+ if (n < 10) {
107
+ return {'.', '0', static_cast<char>('0' + n)};
108
+ }
109
+ return {'.', static_cast<char>('0' + n / 10),
110
+ static_cast<char>('0' + (n % 10))};
111
+ }
112
+ } // namespace
113
+
114
+ namespace {
115
+ // round2even rounds the last digit of |n| so that the n / 10 becomes
116
+ // even.
117
+ uint64_t round2even(uint64_t n) {
118
+ if (n % 10 == 5) {
119
+ if ((n / 10) & 1) {
120
+ n += 10;
121
+ }
122
+ } else {
123
+ n += 5;
124
+ }
125
+ return n;
126
+ }
127
+ } // namespace
128
+
129
+ std::string format_durationf(uint64_t ns) {
130
+ static constexpr const std::string_view units[] = {"us"sv, "ms"sv, "s"sv};
131
+ if (ns < 1000) {
132
+ return format_uint(ns) + "ns";
133
+ }
134
+ auto unit = 0;
135
+ if (ns < 1000000) {
136
+ // do nothing
137
+ } else if (ns < 1000000000) {
138
+ ns /= 1000;
139
+ unit = 1;
140
+ } else {
141
+ ns /= 1000000;
142
+ unit = 2;
143
+ }
144
+
145
+ ns = round2even(ns);
146
+
147
+ if (ns / 1000 >= 1000 && unit < 2) {
148
+ ns /= 1000;
149
+ ++unit;
150
+ }
151
+
152
+ auto res = format_uint(ns / 1000);
153
+ res += format_fraction2(ns % 1000);
154
+ res += units[unit];
155
+
156
+ return res;
157
+ }
158
+
159
+ std::mt19937 make_mt19937() {
160
+ std::random_device rd;
161
+ return std::mt19937(rd());
162
+ }
163
+
164
+ ngtcp2_tstamp timestamp(struct ev_loop *loop) {
165
+ return std::chrono::duration_cast<std::chrono::nanoseconds>(
166
+ std::chrono::steady_clock::now().time_since_epoch())
167
+ .count();
168
+ }
169
+
170
+ bool numeric_host(const char *hostname) {
171
+ return numeric_host(hostname, AF_INET) || numeric_host(hostname, AF_INET6);
172
+ }
173
+
174
+ bool numeric_host(const char *hostname, int family) {
175
+ int rv;
176
+ std::array<uint8_t, sizeof(struct in6_addr)> dst;
177
+
178
+ rv = inet_pton(family, hostname, dst.data());
179
+
180
+ return rv == 1;
181
+ }
182
+
183
+ namespace {
184
+ void hexdump8(FILE *out, const uint8_t *first, const uint8_t *last) {
185
+ auto stop = std::min(first + 8, last);
186
+ for (auto k = first; k != stop; ++k) {
187
+ fprintf(out, "%02x ", *k);
188
+ }
189
+ // each byte needs 3 spaces (2 hex value and space)
190
+ for (; stop != first + 8; ++stop) {
191
+ fputs(" ", out);
192
+ }
193
+ // we have extra space after 8 bytes
194
+ fputc(' ', out);
195
+ }
196
+ } // namespace
197
+
198
+ void hexdump(FILE *out, const uint8_t *src, size_t len) {
199
+ if (len == 0) {
200
+ return;
201
+ }
202
+ size_t buflen = 0;
203
+ auto repeated = false;
204
+ std::array<uint8_t, 16> buf{};
205
+ auto end = src + len;
206
+ auto i = src;
207
+ for (;;) {
208
+ auto nextlen =
209
+ std::min(static_cast<size_t>(16), static_cast<size_t>(end - i));
210
+ if (nextlen == buflen &&
211
+ std::equal(std::begin(buf), std::begin(buf) + buflen, i)) {
212
+ // as long as adjacent 16 bytes block are the same, we just
213
+ // print single '*'.
214
+ if (!repeated) {
215
+ repeated = true;
216
+ fputs("*\n", out);
217
+ }
218
+ i += nextlen;
219
+ continue;
220
+ }
221
+ repeated = false;
222
+ fprintf(out, "%08lx", static_cast<unsigned long>(i - src));
223
+ if (i == end) {
224
+ fputc('\n', out);
225
+ break;
226
+ }
227
+ fputs(" ", out);
228
+ hexdump8(out, i, end);
229
+ hexdump8(out, i + 8, std::max(i + 8, end));
230
+ fputc('|', out);
231
+ auto stop = std::min(i + 16, end);
232
+ buflen = stop - i;
233
+ auto p = buf.data();
234
+ for (; i != stop; ++i) {
235
+ *p++ = *i;
236
+ if (0x20 <= *i && *i <= 0x7e) {
237
+ fputc(*i, out);
238
+ } else {
239
+ fputc('.', out);
240
+ }
241
+ }
242
+ fputs("|\n", out);
243
+ }
244
+ }
245
+
246
+ std::string make_cid_key(const ngtcp2_cid *cid) {
247
+ return std::string(cid->data, cid->data + cid->datalen);
248
+ }
249
+
250
+ std::string make_cid_key(const uint8_t *cid, size_t cidlen) {
251
+ return std::string(cid, cid + cidlen);
252
+ }
253
+
254
+ std::string straddr(const sockaddr *sa, socklen_t salen) {
255
+ std::array<char, NI_MAXHOST> host;
256
+ std::array<char, NI_MAXSERV> port;
257
+
258
+ auto rv = getnameinfo(sa, salen, host.data(), host.size(), port.data(),
259
+ port.size(), NI_NUMERICHOST | NI_NUMERICSERV);
260
+ if (rv != 0) {
261
+ std::cerr << "getnameinfo: " << gai_strerror(rv) << std::endl;
262
+ return "";
263
+ }
264
+ std::string res = "[";
265
+ res.append(host.data(), strlen(host.data()));
266
+ res += "]:";
267
+ res.append(port.data(), strlen(port.data()));
268
+ return res;
269
+ }
270
+
271
+ std::string_view strccalgo(ngtcp2_cc_algo cc_algo) {
272
+ switch (cc_algo) {
273
+ case NGTCP2_CC_ALGO_RENO:
274
+ return "reno"sv;
275
+ case NGTCP2_CC_ALGO_CUBIC:
276
+ return "cubic"sv;
277
+ case NGTCP2_CC_ALGO_BBR:
278
+ return "bbr"sv;
279
+ case NGTCP2_CC_ALGO_BBR2:
280
+ return "bbr2"sv;
281
+ default:
282
+ assert(0);
283
+ abort();
284
+ }
285
+ }
286
+
287
+ namespace {
288
+ constexpr bool rws(char c) { return c == '\t' || c == ' '; }
289
+ } // namespace
290
+
291
+ std::optional<std::unordered_map<std::string, std::string>>
292
+ read_mime_types(const std::string_view &filename) {
293
+ std::ifstream f(filename.data());
294
+ if (!f) {
295
+ return {};
296
+ }
297
+
298
+ std::unordered_map<std::string, std::string> dest;
299
+
300
+ std::string line;
301
+ while (std::getline(f, line)) {
302
+ if (line.empty() || line[0] == '#') {
303
+ continue;
304
+ }
305
+
306
+ auto p = std::find_if(std::begin(line), std::end(line), rws);
307
+ if (p == std::begin(line) || p == std::end(line)) {
308
+ continue;
309
+ }
310
+
311
+ auto media_type = std::string{std::begin(line), p};
312
+ for (;;) {
313
+ auto ext = std::find_if_not(p, std::end(line), rws);
314
+ if (ext == std::end(line)) {
315
+ break;
316
+ }
317
+
318
+ p = std::find_if(ext, std::end(line), rws);
319
+ dest.emplace(std::string{ext, p}, media_type);
320
+ }
321
+ }
322
+
323
+ return dest;
324
+ }
325
+
326
+ std::string format_duration(ngtcp2_duration n) {
327
+ if (n >= 3600 * NGTCP2_SECONDS && (n % (3600 * NGTCP2_SECONDS)) == 0) {
328
+ return format_uint(n / (3600 * NGTCP2_SECONDS)) + 'h';
329
+ }
330
+ if (n >= 60 * NGTCP2_SECONDS && (n % (60 * NGTCP2_SECONDS)) == 0) {
331
+ return format_uint(n / (60 * NGTCP2_SECONDS)) + 'm';
332
+ }
333
+ if (n >= NGTCP2_SECONDS && (n % NGTCP2_SECONDS) == 0) {
334
+ return format_uint(n / NGTCP2_SECONDS) + 's';
335
+ }
336
+ if (n >= NGTCP2_MILLISECONDS && (n % NGTCP2_MILLISECONDS) == 0) {
337
+ return format_uint(n / NGTCP2_MILLISECONDS) + "ms";
338
+ }
339
+ if (n >= NGTCP2_MICROSECONDS && (n % NGTCP2_MICROSECONDS) == 0) {
340
+ return format_uint(n / NGTCP2_MICROSECONDS) + "us";
341
+ }
342
+ return format_uint(n) + "ns";
343
+ }
344
+
345
+ namespace {
346
+ std::optional<std::pair<uint64_t, size_t>>
347
+ parse_uint_internal(const std::string_view &s) {
348
+ uint64_t res = 0;
349
+
350
+ if (s.empty()) {
351
+ return {};
352
+ }
353
+
354
+ for (size_t i = 0; i < s.size(); ++i) {
355
+ auto c = s[i];
356
+ if (c < '0' || '9' < c) {
357
+ return {{res, i}};
358
+ }
359
+
360
+ auto d = c - '0';
361
+ if (res > (std::numeric_limits<uint64_t>::max() - d) / 10) {
362
+ return {};
363
+ }
364
+
365
+ res *= 10;
366
+ res += d;
367
+ }
368
+
369
+ return {{res, s.size()}};
370
+ }
371
+ } // namespace
372
+
373
+ std::optional<uint64_t> parse_uint(const std::string_view &s) {
374
+ auto o = parse_uint_internal(s);
375
+ if (!o) {
376
+ return {};
377
+ }
378
+ auto [res, idx] = *o;
379
+ if (idx != s.size()) {
380
+ return {};
381
+ }
382
+ return res;
383
+ }
384
+
385
+ std::optional<uint64_t> parse_uint_iec(const std::string_view &s) {
386
+ auto o = parse_uint_internal(s);
387
+ if (!o) {
388
+ return {};
389
+ }
390
+ auto [res, idx] = *o;
391
+ if (idx == s.size()) {
392
+ return res;
393
+ }
394
+ if (idx + 1 != s.size()) {
395
+ return {};
396
+ }
397
+
398
+ uint64_t m;
399
+ switch (s[idx]) {
400
+ case 'G':
401
+ case 'g':
402
+ m = 1 << 30;
403
+ break;
404
+ case 'M':
405
+ case 'm':
406
+ m = 1 << 20;
407
+ break;
408
+ case 'K':
409
+ case 'k':
410
+ m = 1 << 10;
411
+ break;
412
+ default:
413
+ return {};
414
+ }
415
+
416
+ if (res > std::numeric_limits<uint64_t>::max() / m) {
417
+ return {};
418
+ }
419
+
420
+ return res * m;
421
+ }
422
+
423
+ std::optional<uint64_t> parse_duration(const std::string_view &s) {
424
+ auto o = parse_uint_internal(s);
425
+ if (!o) {
426
+ return {};
427
+ }
428
+ auto [res, idx] = *o;
429
+ if (idx == s.size()) {
430
+ return res * NGTCP2_SECONDS;
431
+ }
432
+
433
+ uint64_t m;
434
+ if (idx + 1 == s.size()) {
435
+ switch (s[idx]) {
436
+ case 'H':
437
+ case 'h':
438
+ m = 3600 * NGTCP2_SECONDS;
439
+ break;
440
+ case 'M':
441
+ case 'm':
442
+ m = 60 * NGTCP2_SECONDS;
443
+ break;
444
+ case 'S':
445
+ case 's':
446
+ m = NGTCP2_SECONDS;
447
+ break;
448
+ default:
449
+ return {};
450
+ }
451
+ } else if (idx + 2 == s.size() && (s[idx + 1] == 's' || s[idx + 1] == 'S')) {
452
+ switch (s[idx]) {
453
+ case 'M':
454
+ case 'm':
455
+ m = NGTCP2_MILLISECONDS;
456
+ break;
457
+ case 'U':
458
+ case 'u':
459
+ m = NGTCP2_MICROSECONDS;
460
+ break;
461
+ case 'N':
462
+ case 'n':
463
+ return res;
464
+ default:
465
+ return {};
466
+ }
467
+ } else {
468
+ return {};
469
+ }
470
+
471
+ if (res > std::numeric_limits<uint64_t>::max() / m) {
472
+ return {};
473
+ }
474
+
475
+ return res * m;
476
+ }
477
+
478
+ namespace {
479
+ template <typename InputIt> InputIt eat_file(InputIt first, InputIt last) {
480
+ if (first == last) {
481
+ *first++ = '/';
482
+ return first;
483
+ }
484
+
485
+ if (*(last - 1) == '/') {
486
+ return last;
487
+ }
488
+
489
+ auto p = last;
490
+ for (; p != first && *(p - 1) != '/'; --p)
491
+ ;
492
+ if (p == first) {
493
+ // this should not happened in normal case, where we expect path
494
+ // starts with '/'
495
+ *first++ = '/';
496
+ return first;
497
+ }
498
+
499
+ return p;
500
+ }
501
+ } // namespace
502
+
503
+ namespace {
504
+ template <typename InputIt> InputIt eat_dir(InputIt first, InputIt last) {
505
+ auto p = eat_file(first, last);
506
+
507
+ --p;
508
+
509
+ assert(*p == '/');
510
+
511
+ return eat_file(first, p);
512
+ }
513
+ } // namespace
514
+
515
+ std::string normalize_path(const std::string_view &path) {
516
+ assert(path.size() <= 1024);
517
+ assert(path.size() > 0);
518
+ assert(path[0] == '/');
519
+
520
+ std::array<char, 1024> res;
521
+ auto p = res.data();
522
+
523
+ auto first = std::begin(path);
524
+ auto last = std::end(path);
525
+
526
+ *p++ = '/';
527
+ ++first;
528
+ for (; first != last && *first == '/'; ++first)
529
+ ;
530
+
531
+ for (; first != last;) {
532
+ if (*first == '.') {
533
+ if (first + 1 == last) {
534
+ break;
535
+ }
536
+ if (*(first + 1) == '/') {
537
+ first += 2;
538
+ continue;
539
+ }
540
+ if (*(first + 1) == '.') {
541
+ if (first + 2 == last) {
542
+ p = eat_dir(res.data(), p);
543
+ break;
544
+ }
545
+ if (*(first + 2) == '/') {
546
+ p = eat_dir(res.data(), p);
547
+ first += 3;
548
+ continue;
549
+ }
550
+ }
551
+ }
552
+ if (*(p - 1) != '/') {
553
+ p = eat_file(res.data(), p);
554
+ }
555
+ auto slash = std::find(first, last, '/');
556
+ if (slash == last) {
557
+ p = std::copy(first, last, p);
558
+ break;
559
+ }
560
+ p = std::copy(first, slash + 1, p);
561
+ first = slash + 1;
562
+ for (; first != last && *first == '/'; ++first)
563
+ ;
564
+ }
565
+ return std::string{res.data(), p};
566
+ }
567
+
568
+ int make_socket_nonblocking(int fd) {
569
+ int rv;
570
+ int flags;
571
+
572
+ while ((flags = fcntl(fd, F_GETFL, 0)) == -1 && errno == EINTR)
573
+ ;
574
+ if (flags == -1) {
575
+ return -1;
576
+ }
577
+
578
+ while ((rv = fcntl(fd, F_SETFL, flags | O_NONBLOCK)) == -1 && errno == EINTR)
579
+ ;
580
+
581
+ return rv;
582
+ }
583
+
584
+ int create_nonblock_socket(int domain, int type, int protocol) {
585
+ #ifdef SOCK_NONBLOCK
586
+ auto fd = socket(domain, type | SOCK_NONBLOCK, protocol);
587
+ if (fd == -1) {
588
+ return -1;
589
+ }
590
+ #else // !SOCK_NONBLOCK
591
+ auto fd = socket(domain, type, protocol);
592
+ if (fd == -1) {
593
+ return -1;
594
+ }
595
+
596
+ make_socket_nonblocking(fd);
597
+ #endif // !SOCK_NONBLOCK
598
+
599
+ return fd;
600
+ }
601
+
602
+ std::vector<std::string_view> split_str(const std::string_view &s, char delim) {
603
+ size_t len = 1;
604
+ auto last = std::end(s);
605
+ std::string_view::const_iterator d;
606
+ for (auto first = std::begin(s); (d = std::find(first, last, delim)) != last;
607
+ ++len, first = d + 1)
608
+ ;
609
+
610
+ auto list = std::vector<std::string_view>(len);
611
+
612
+ len = 0;
613
+ for (auto first = std::begin(s);; ++len) {
614
+ auto stop = std::find(first, last, delim);
615
+ // xcode clang does not understand std::string_view{first, stop}.
616
+ list[len] = std::string_view{first, static_cast<size_t>(stop - first)};
617
+ if (stop == last) {
618
+ break;
619
+ }
620
+ first = stop + 1;
621
+ }
622
+ return list;
623
+ }
624
+
625
+ std::optional<uint32_t> parse_version(const std::string_view &s) {
626
+ auto k = s;
627
+ if (!util::istarts_with(k, "0x"sv)) {
628
+ return {};
629
+ }
630
+ k = k.substr(2);
631
+ uint32_t v;
632
+ auto rv = std::from_chars(k.data(), k.data() + k.size(), v, 16);
633
+ if (rv.ptr != k.data() + k.size() || rv.ec != std::errc{}) {
634
+ return {};
635
+ }
636
+
637
+ return v;
638
+ }
639
+
640
+ } // namespace util
641
+
642
+ std::ostream &operator<<(std::ostream &os, const ngtcp2_cid &cid) {
643
+ return os << "0x" << util::format_hex(cid.data, cid.datalen);
644
+ }
645
+
646
+ } // namespace ngtcp2