ires 0.1.3 → 0.1.4

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 (1024) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +32 -45
  3. data/ext/Gopkg.lock +31 -1
  4. data/ext/ires/image.go +227 -0
  5. data/ext/ires/ires.go +47 -59
  6. data/ext/ires/uri.go +143 -0
  7. data/ext/main.go +18 -9
  8. data/ext/vendor/github.com/PuerkitoBio/purell/LICENSE +12 -0
  9. data/ext/vendor/github.com/PuerkitoBio/purell/README.md +187 -0
  10. data/ext/vendor/github.com/PuerkitoBio/purell/bench_test.go +57 -0
  11. data/ext/vendor/github.com/PuerkitoBio/purell/benchmarks/v0.1.0 +9 -0
  12. data/ext/vendor/github.com/PuerkitoBio/purell/example_test.go +35 -0
  13. data/ext/vendor/github.com/PuerkitoBio/purell/purell.go +379 -0
  14. data/ext/vendor/github.com/PuerkitoBio/purell/purell_test.go +768 -0
  15. data/ext/vendor/github.com/PuerkitoBio/purell/urlnorm_test.go +53 -0
  16. data/ext/vendor/github.com/PuerkitoBio/urlesc/LICENSE +27 -0
  17. data/ext/vendor/github.com/PuerkitoBio/urlesc/README.md +16 -0
  18. data/ext/vendor/github.com/PuerkitoBio/urlesc/urlesc.go +180 -0
  19. data/ext/vendor/github.com/PuerkitoBio/urlesc/urlesc_test.go +641 -0
  20. data/ext/vendor/github.com/{satori/go.uuid → goware/urlx}/LICENSE +3 -1
  21. data/ext/vendor/github.com/goware/urlx/README.md +172 -0
  22. data/ext/vendor/github.com/goware/urlx/urlx.go +196 -0
  23. data/ext/vendor/github.com/goware/urlx/urlx_test.go +232 -0
  24. data/ext/vendor/golang.org/x/net/AUTHORS +3 -0
  25. data/ext/vendor/golang.org/x/net/CONTRIBUTING.md +31 -0
  26. data/ext/vendor/golang.org/x/net/CONTRIBUTORS +3 -0
  27. data/ext/vendor/golang.org/x/net/LICENSE +27 -0
  28. data/ext/vendor/golang.org/x/net/PATENTS +22 -0
  29. data/ext/vendor/golang.org/x/net/README.md +16 -0
  30. data/ext/vendor/golang.org/x/net/bpf/asm.go +41 -0
  31. data/ext/vendor/golang.org/x/net/bpf/constants.go +218 -0
  32. data/ext/vendor/golang.org/x/net/bpf/doc.go +82 -0
  33. data/ext/vendor/golang.org/x/net/bpf/instructions.go +704 -0
  34. data/ext/vendor/golang.org/x/net/bpf/instructions_test.go +525 -0
  35. data/ext/vendor/golang.org/x/net/bpf/setter.go +10 -0
  36. data/ext/vendor/golang.org/x/net/bpf/testdata/all_instructions.bpf +1 -0
  37. data/ext/vendor/golang.org/x/net/bpf/testdata/all_instructions.txt +79 -0
  38. data/ext/vendor/golang.org/x/net/bpf/vm.go +140 -0
  39. data/ext/vendor/golang.org/x/net/bpf/vm_aluop_test.go +512 -0
  40. data/ext/vendor/golang.org/x/net/bpf/vm_bpf_test.go +192 -0
  41. data/ext/vendor/golang.org/x/net/bpf/vm_extension_test.go +49 -0
  42. data/ext/vendor/golang.org/x/net/bpf/vm_instructions.go +174 -0
  43. data/ext/vendor/golang.org/x/net/bpf/vm_jump_test.go +380 -0
  44. data/ext/vendor/golang.org/x/net/bpf/vm_load_test.go +246 -0
  45. data/ext/vendor/golang.org/x/net/bpf/vm_ret_test.go +115 -0
  46. data/ext/vendor/golang.org/x/net/bpf/vm_scratch_test.go +247 -0
  47. data/ext/vendor/golang.org/x/net/bpf/vm_test.go +144 -0
  48. data/ext/vendor/golang.org/x/net/codereview.cfg +1 -0
  49. data/ext/vendor/golang.org/x/net/context/context.go +54 -0
  50. data/ext/vendor/golang.org/x/net/context/context_test.go +583 -0
  51. data/ext/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go +74 -0
  52. data/ext/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_17_test.go +29 -0
  53. data/ext/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17.go +147 -0
  54. data/ext/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17_test.go +79 -0
  55. data/ext/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_test.go +105 -0
  56. data/ext/vendor/golang.org/x/net/context/go17.go +72 -0
  57. data/ext/vendor/golang.org/x/net/context/go19.go +20 -0
  58. data/ext/vendor/golang.org/x/net/context/pre_go17.go +300 -0
  59. data/ext/vendor/golang.org/x/net/context/pre_go19.go +109 -0
  60. data/ext/vendor/golang.org/x/net/context/withtimeout_test.go +31 -0
  61. data/ext/vendor/golang.org/x/net/dict/dict.go +210 -0
  62. data/ext/vendor/golang.org/x/net/dns/dnsmessage/example_test.go +132 -0
  63. data/ext/vendor/golang.org/x/net/dns/dnsmessage/message.go +1997 -0
  64. data/ext/vendor/golang.org/x/net/dns/dnsmessage/message_test.go +1116 -0
  65. data/ext/vendor/golang.org/x/net/html/atom/atom.go +78 -0
  66. data/ext/vendor/golang.org/x/net/html/atom/atom_test.go +109 -0
  67. data/ext/vendor/golang.org/x/net/html/atom/gen.go +709 -0
  68. data/ext/vendor/golang.org/x/net/html/atom/table.go +777 -0
  69. data/ext/vendor/golang.org/x/net/html/atom/table_test.go +373 -0
  70. data/ext/vendor/golang.org/x/net/html/charset/charset.go +257 -0
  71. data/ext/vendor/golang.org/x/net/html/charset/charset_test.go +237 -0
  72. data/ext/vendor/golang.org/x/net/html/charset/testdata/HTTP-charset.html +48 -0
  73. data/ext/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html +48 -0
  74. data/ext/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html +49 -0
  75. data/ext/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html +49 -0
  76. data/ext/vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html +47 -0
  77. data/ext/vendor/golang.org/x/net/html/charset/testdata/README +9 -0
  78. data/ext/vendor/golang.org/x/net/html/charset/testdata/UTF-16BE-BOM.html +0 -0
  79. data/ext/vendor/golang.org/x/net/html/charset/testdata/UTF-16LE-BOM.html +0 -0
  80. data/ext/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html +49 -0
  81. data/ext/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html +48 -0
  82. data/ext/vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html +48 -0
  83. data/ext/vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html +48 -0
  84. data/ext/vendor/golang.org/x/net/html/const.go +104 -0
  85. data/ext/vendor/golang.org/x/net/html/doc.go +106 -0
  86. data/ext/vendor/golang.org/x/net/html/doctype.go +156 -0
  87. data/ext/vendor/golang.org/x/net/html/entity.go +2253 -0
  88. data/ext/vendor/golang.org/x/net/html/entity_test.go +29 -0
  89. data/ext/vendor/golang.org/x/net/html/escape.go +258 -0
  90. data/ext/vendor/golang.org/x/net/html/escape_test.go +97 -0
  91. data/ext/vendor/golang.org/x/net/html/example_test.go +40 -0
  92. data/ext/vendor/golang.org/x/net/html/foreign.go +226 -0
  93. data/ext/vendor/golang.org/x/net/html/node.go +193 -0
  94. data/ext/vendor/golang.org/x/net/html/node_test.go +146 -0
  95. data/ext/vendor/golang.org/x/net/html/parse.go +2094 -0
  96. data/ext/vendor/golang.org/x/net/html/parse_test.go +388 -0
  97. data/ext/vendor/golang.org/x/net/html/render.go +271 -0
  98. data/ext/vendor/golang.org/x/net/html/render_test.go +156 -0
  99. data/ext/vendor/golang.org/x/net/html/testdata/go1.html +2237 -0
  100. data/ext/vendor/golang.org/x/net/html/testdata/webkit/README +28 -0
  101. data/ext/vendor/golang.org/x/net/html/testdata/webkit/adoption01.dat +194 -0
  102. data/ext/vendor/golang.org/x/net/html/testdata/webkit/adoption02.dat +31 -0
  103. data/ext/vendor/golang.org/x/net/html/testdata/webkit/comments01.dat +135 -0
  104. data/ext/vendor/golang.org/x/net/html/testdata/webkit/doctype01.dat +370 -0
  105. data/ext/vendor/golang.org/x/net/html/testdata/webkit/entities01.dat +603 -0
  106. data/ext/vendor/golang.org/x/net/html/testdata/webkit/entities02.dat +249 -0
  107. data/ext/vendor/golang.org/x/net/html/testdata/webkit/html5test-com.dat +246 -0
  108. data/ext/vendor/golang.org/x/net/html/testdata/webkit/inbody01.dat +43 -0
  109. data/ext/vendor/golang.org/x/net/html/testdata/webkit/isindex.dat +40 -0
  110. data/ext/vendor/golang.org/x/net/html/testdata/webkit/pending-spec-changes-plain-text-unsafe.dat +0 -0
  111. data/ext/vendor/golang.org/x/net/html/testdata/webkit/pending-spec-changes.dat +52 -0
  112. data/ext/vendor/golang.org/x/net/html/testdata/webkit/plain-text-unsafe.dat +0 -0
  113. data/ext/vendor/golang.org/x/net/html/testdata/webkit/scriptdata01.dat +308 -0
  114. data/ext/vendor/golang.org/x/net/html/testdata/webkit/scripted/adoption01.dat +15 -0
  115. data/ext/vendor/golang.org/x/net/html/testdata/webkit/scripted/webkit01.dat +28 -0
  116. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tables01.dat +212 -0
  117. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests1.dat +1952 -0
  118. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat +799 -0
  119. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat +482 -0
  120. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests12.dat +62 -0
  121. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat +74 -0
  122. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat +208 -0
  123. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests16.dat +2299 -0
  124. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat +153 -0
  125. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat +269 -0
  126. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat +1237 -0
  127. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat +763 -0
  128. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests20.dat +455 -0
  129. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests21.dat +221 -0
  130. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests22.dat +157 -0
  131. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests23.dat +155 -0
  132. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests24.dat +79 -0
  133. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests25.dat +219 -0
  134. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests26.dat +313 -0
  135. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests3.dat +305 -0
  136. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests4.dat +59 -0
  137. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests5.dat +191 -0
  138. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests6.dat +663 -0
  139. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests7.dat +390 -0
  140. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests8.dat +148 -0
  141. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests9.dat +457 -0
  142. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests_innerHTML_1.dat +741 -0
  143. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tricky01.dat +261 -0
  144. data/ext/vendor/golang.org/x/net/html/testdata/webkit/webkit01.dat +610 -0
  145. data/ext/vendor/golang.org/x/net/html/testdata/webkit/webkit02.dat +159 -0
  146. data/ext/vendor/golang.org/x/net/html/token.go +1219 -0
  147. data/ext/vendor/golang.org/x/net/html/token_test.go +748 -0
  148. data/ext/vendor/golang.org/x/net/http2/Dockerfile +51 -0
  149. data/ext/vendor/golang.org/x/net/http2/Makefile +3 -0
  150. data/ext/vendor/golang.org/x/net/http2/README +20 -0
  151. data/ext/vendor/golang.org/x/net/http2/ciphers.go +641 -0
  152. data/ext/vendor/golang.org/x/net/http2/ciphers_test.go +309 -0
  153. data/ext/vendor/golang.org/x/net/http2/client_conn_pool.go +256 -0
  154. data/ext/vendor/golang.org/x/net/http2/configure_transport.go +80 -0
  155. data/ext/vendor/golang.org/x/net/http2/databuffer.go +146 -0
  156. data/ext/vendor/golang.org/x/net/http2/databuffer_test.go +157 -0
  157. data/ext/vendor/golang.org/x/net/http2/errors.go +133 -0
  158. data/ext/vendor/golang.org/x/net/http2/errors_test.go +24 -0
  159. data/ext/vendor/golang.org/x/net/http2/flow.go +50 -0
  160. data/ext/vendor/golang.org/x/net/http2/flow_test.go +53 -0
  161. data/ext/vendor/golang.org/x/net/http2/frame.go +1579 -0
  162. data/ext/vendor/golang.org/x/net/http2/frame_test.go +1191 -0
  163. data/ext/vendor/golang.org/x/net/http2/go16.go +16 -0
  164. data/ext/vendor/golang.org/x/net/http2/go17.go +106 -0
  165. data/ext/vendor/golang.org/x/net/http2/go17_not18.go +36 -0
  166. data/ext/vendor/golang.org/x/net/http2/go18.go +56 -0
  167. data/ext/vendor/golang.org/x/net/http2/go18_test.go +79 -0
  168. data/ext/vendor/golang.org/x/net/http2/go19.go +16 -0
  169. data/ext/vendor/golang.org/x/net/http2/go19_test.go +60 -0
  170. data/ext/vendor/golang.org/x/net/http2/gotrack.go +170 -0
  171. data/ext/vendor/golang.org/x/net/http2/gotrack_test.go +33 -0
  172. data/ext/vendor/golang.org/x/net/http2/h2demo/Makefile +8 -0
  173. data/ext/vendor/golang.org/x/net/http2/h2demo/README +16 -0
  174. data/ext/vendor/golang.org/x/net/http2/h2demo/h2demo.go +538 -0
  175. data/ext/vendor/golang.org/x/net/http2/h2demo/launch.go +302 -0
  176. data/ext/vendor/golang.org/x/net/http2/h2demo/rootCA.key +27 -0
  177. data/ext/vendor/golang.org/x/net/http2/h2demo/rootCA.pem +26 -0
  178. data/ext/vendor/golang.org/x/net/http2/h2demo/rootCA.srl +1 -0
  179. data/ext/vendor/golang.org/x/net/http2/h2demo/server.crt +20 -0
  180. data/ext/vendor/golang.org/x/net/http2/h2demo/server.key +27 -0
  181. data/ext/vendor/golang.org/x/net/http2/h2demo/tmpl.go +1991 -0
  182. data/ext/vendor/golang.org/x/net/http2/h2i/README.md +97 -0
  183. data/ext/vendor/golang.org/x/net/http2/h2i/h2i.go +522 -0
  184. data/ext/vendor/golang.org/x/net/http2/headermap.go +78 -0
  185. data/ext/vendor/golang.org/x/net/http2/hpack/encode.go +240 -0
  186. data/ext/vendor/golang.org/x/net/http2/hpack/encode_test.go +386 -0
  187. data/ext/vendor/golang.org/x/net/http2/hpack/hpack.go +490 -0
  188. data/ext/vendor/golang.org/x/net/http2/hpack/hpack_test.go +722 -0
  189. data/ext/vendor/golang.org/x/net/http2/hpack/huffman.go +212 -0
  190. data/ext/vendor/golang.org/x/net/http2/hpack/tables.go +479 -0
  191. data/ext/vendor/golang.org/x/net/http2/hpack/tables_test.go +214 -0
  192. data/ext/vendor/golang.org/x/net/http2/http2.go +391 -0
  193. data/ext/vendor/golang.org/x/net/http2/http2_test.go +199 -0
  194. data/ext/vendor/golang.org/x/net/http2/not_go16.go +21 -0
  195. data/ext/vendor/golang.org/x/net/http2/not_go17.go +87 -0
  196. data/ext/vendor/golang.org/x/net/http2/not_go18.go +29 -0
  197. data/ext/vendor/golang.org/x/net/http2/not_go19.go +16 -0
  198. data/ext/vendor/golang.org/x/net/http2/pipe.go +163 -0
  199. data/ext/vendor/golang.org/x/net/http2/pipe_test.go +130 -0
  200. data/ext/vendor/golang.org/x/net/http2/server.go +2857 -0
  201. data/ext/vendor/golang.org/x/net/http2/server_push_test.go +521 -0
  202. data/ext/vendor/golang.org/x/net/http2/server_test.go +3721 -0
  203. data/ext/vendor/golang.org/x/net/http2/testdata/draft-ietf-httpbis-http2.xml +5021 -0
  204. data/ext/vendor/golang.org/x/net/http2/transport.go +2285 -0
  205. data/ext/vendor/golang.org/x/net/http2/transport_test.go +3714 -0
  206. data/ext/vendor/golang.org/x/net/http2/write.go +370 -0
  207. data/ext/vendor/golang.org/x/net/http2/writesched.go +242 -0
  208. data/ext/vendor/golang.org/x/net/http2/writesched_priority.go +452 -0
  209. data/ext/vendor/golang.org/x/net/http2/writesched_priority_test.go +541 -0
  210. data/ext/vendor/golang.org/x/net/http2/writesched_random.go +72 -0
  211. data/ext/vendor/golang.org/x/net/http2/writesched_random_test.go +44 -0
  212. data/ext/vendor/golang.org/x/net/http2/writesched_test.go +125 -0
  213. data/ext/vendor/golang.org/x/net/http2/z_spec_test.go +356 -0
  214. data/ext/vendor/golang.org/x/net/icmp/dstunreach.go +41 -0
  215. data/ext/vendor/golang.org/x/net/icmp/echo.go +45 -0
  216. data/ext/vendor/golang.org/x/net/icmp/endpoint.go +113 -0
  217. data/ext/vendor/golang.org/x/net/icmp/example_test.go +63 -0
  218. data/ext/vendor/golang.org/x/net/icmp/extension.go +89 -0
  219. data/ext/vendor/golang.org/x/net/icmp/extension_test.go +259 -0
  220. data/ext/vendor/golang.org/x/net/icmp/helper_posix.go +75 -0
  221. data/ext/vendor/golang.org/x/net/icmp/interface.go +236 -0
  222. data/ext/vendor/golang.org/x/net/icmp/ipv4.go +61 -0
  223. data/ext/vendor/golang.org/x/net/icmp/ipv4_test.go +83 -0
  224. data/ext/vendor/golang.org/x/net/icmp/ipv6.go +23 -0
  225. data/ext/vendor/golang.org/x/net/icmp/listen_posix.go +100 -0
  226. data/ext/vendor/golang.org/x/net/icmp/listen_stub.go +33 -0
  227. data/ext/vendor/golang.org/x/net/icmp/message.go +152 -0
  228. data/ext/vendor/golang.org/x/net/icmp/message_test.go +134 -0
  229. data/ext/vendor/golang.org/x/net/icmp/messagebody.go +41 -0
  230. data/ext/vendor/golang.org/x/net/icmp/mpls.go +77 -0
  231. data/ext/vendor/golang.org/x/net/icmp/multipart.go +109 -0
  232. data/ext/vendor/golang.org/x/net/icmp/multipart_test.go +442 -0
  233. data/ext/vendor/golang.org/x/net/icmp/packettoobig.go +43 -0
  234. data/ext/vendor/golang.org/x/net/icmp/paramprob.go +63 -0
  235. data/ext/vendor/golang.org/x/net/icmp/ping_test.go +200 -0
  236. data/ext/vendor/golang.org/x/net/icmp/sys_freebsd.go +11 -0
  237. data/ext/vendor/golang.org/x/net/icmp/timeexceeded.go +39 -0
  238. data/ext/vendor/golang.org/x/net/idna/example_test.go +70 -0
  239. data/ext/vendor/golang.org/x/net/idna/idna.go +680 -0
  240. data/ext/vendor/golang.org/x/net/idna/idna_test.go +108 -0
  241. data/ext/vendor/golang.org/x/net/idna/punycode.go +203 -0
  242. data/ext/vendor/golang.org/x/net/idna/punycode_test.go +198 -0
  243. data/ext/vendor/golang.org/x/net/idna/tables.go +4477 -0
  244. data/ext/vendor/golang.org/x/net/idna/trie.go +72 -0
  245. data/ext/vendor/golang.org/x/net/idna/trieval.go +114 -0
  246. data/ext/vendor/golang.org/x/net/internal/iana/const.go +180 -0
  247. data/ext/vendor/golang.org/x/net/internal/iana/gen.go +293 -0
  248. data/ext/vendor/golang.org/x/net/internal/nettest/helper_bsd.go +53 -0
  249. data/ext/vendor/golang.org/x/net/internal/nettest/helper_nobsd.go +15 -0
  250. data/ext/vendor/golang.org/x/net/internal/nettest/helper_posix.go +31 -0
  251. data/ext/vendor/golang.org/x/net/internal/nettest/helper_stub.go +32 -0
  252. data/ext/vendor/golang.org/x/net/internal/nettest/helper_unix.go +29 -0
  253. data/ext/vendor/golang.org/x/net/internal/nettest/helper_windows.go +42 -0
  254. data/ext/vendor/golang.org/x/net/internal/nettest/interface.go +94 -0
  255. data/ext/vendor/golang.org/x/net/internal/nettest/rlimit.go +11 -0
  256. data/ext/vendor/golang.org/x/net/internal/nettest/stack.go +147 -0
  257. data/ext/vendor/golang.org/x/net/internal/socket/cmsghdr.go +11 -0
  258. data/ext/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go +13 -0
  259. data/ext/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go +14 -0
  260. data/ext/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go +14 -0
  261. data/ext/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go +14 -0
  262. data/ext/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go +17 -0
  263. data/ext/vendor/golang.org/x/net/internal/socket/defs_darwin.go +44 -0
  264. data/ext/vendor/golang.org/x/net/internal/socket/defs_dragonfly.go +44 -0
  265. data/ext/vendor/golang.org/x/net/internal/socket/defs_freebsd.go +44 -0
  266. data/ext/vendor/golang.org/x/net/internal/socket/defs_linux.go +49 -0
  267. data/ext/vendor/golang.org/x/net/internal/socket/defs_netbsd.go +47 -0
  268. data/ext/vendor/golang.org/x/net/internal/socket/defs_openbsd.go +44 -0
  269. data/ext/vendor/golang.org/x/net/internal/socket/defs_solaris.go +44 -0
  270. data/ext/vendor/golang.org/x/net/internal/socket/error_unix.go +31 -0
  271. data/ext/vendor/golang.org/x/net/internal/socket/error_windows.go +26 -0
  272. data/ext/vendor/golang.org/x/net/internal/socket/iovec_32bit.go +19 -0
  273. data/ext/vendor/golang.org/x/net/internal/socket/iovec_64bit.go +19 -0
  274. data/ext/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go +19 -0
  275. data/ext/vendor/golang.org/x/net/internal/socket/iovec_stub.go +11 -0
  276. data/ext/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go +21 -0
  277. data/ext/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go +42 -0
  278. data/ext/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go +39 -0
  279. data/ext/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go +16 -0
  280. data/ext/vendor/golang.org/x/net/internal/socket/msghdr_linux.go +36 -0
  281. data/ext/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go +24 -0
  282. data/ext/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go +24 -0
  283. data/ext/vendor/golang.org/x/net/internal/socket/msghdr_openbsd.go +14 -0
  284. data/ext/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go +36 -0
  285. data/ext/vendor/golang.org/x/net/internal/socket/msghdr_stub.go +14 -0
  286. data/ext/vendor/golang.org/x/net/internal/socket/rawconn.go +66 -0
  287. data/ext/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go +74 -0
  288. data/ext/vendor/golang.org/x/net/internal/socket/rawconn_msg.go +77 -0
  289. data/ext/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go +18 -0
  290. data/ext/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go +18 -0
  291. data/ext/vendor/golang.org/x/net/internal/socket/rawconn_stub.go +25 -0
  292. data/ext/vendor/golang.org/x/net/internal/socket/reflect.go +62 -0
  293. data/ext/vendor/golang.org/x/net/internal/socket/socket.go +285 -0
  294. data/ext/vendor/golang.org/x/net/internal/socket/socket_go1_9_test.go +259 -0
  295. data/ext/vendor/golang.org/x/net/internal/socket/socket_test.go +46 -0
  296. data/ext/vendor/golang.org/x/net/internal/socket/sys.go +33 -0
  297. data/ext/vendor/golang.org/x/net/internal/socket/sys_bsd.go +17 -0
  298. data/ext/vendor/golang.org/x/net/internal/socket/sys_bsdvar.go +14 -0
  299. data/ext/vendor/golang.org/x/net/internal/socket/sys_darwin.go +7 -0
  300. data/ext/vendor/golang.org/x/net/internal/socket/sys_dragonfly.go +7 -0
  301. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux.go +27 -0
  302. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_386.go +55 -0
  303. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_386.s +11 -0
  304. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_amd64.go +10 -0
  305. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_arm.go +10 -0
  306. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_arm64.go +10 -0
  307. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_mips.go +10 -0
  308. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_mips64.go +10 -0
  309. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_mips64le.go +10 -0
  310. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_mipsle.go +10 -0
  311. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64.go +10 -0
  312. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64le.go +10 -0
  313. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.go +55 -0
  314. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.s +11 -0
  315. data/ext/vendor/golang.org/x/net/internal/socket/sys_netbsd.go +25 -0
  316. data/ext/vendor/golang.org/x/net/internal/socket/sys_posix.go +168 -0
  317. data/ext/vendor/golang.org/x/net/internal/socket/sys_solaris.go +71 -0
  318. data/ext/vendor/golang.org/x/net/internal/socket/sys_solaris_amd64.s +11 -0
  319. data/ext/vendor/golang.org/x/net/internal/socket/sys_stub.go +64 -0
  320. data/ext/vendor/golang.org/x/net/internal/socket/sys_unix.go +33 -0
  321. data/ext/vendor/golang.org/x/net/internal/socket/sys_windows.go +70 -0
  322. data/ext/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go +59 -0
  323. data/ext/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go +61 -0
  324. data/ext/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go +59 -0
  325. data/ext/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go +61 -0
  326. data/ext/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go +59 -0
  327. data/ext/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go +61 -0
  328. data/ext/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go +59 -0
  329. data/ext/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go +63 -0
  330. data/ext/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go +66 -0
  331. data/ext/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go +63 -0
  332. data/ext/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go +66 -0
  333. data/ext/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go +63 -0
  334. data/ext/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go +66 -0
  335. data/ext/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go +66 -0
  336. data/ext/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go +63 -0
  337. data/ext/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go +66 -0
  338. data/ext/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go +66 -0
  339. data/ext/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go +66 -0
  340. data/ext/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go +65 -0
  341. data/ext/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go +68 -0
  342. data/ext/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go +59 -0
  343. data/ext/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go +59 -0
  344. data/ext/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go +61 -0
  345. data/ext/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go +59 -0
  346. data/ext/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go +60 -0
  347. data/ext/vendor/golang.org/x/net/internal/timeseries/timeseries.go +525 -0
  348. data/ext/vendor/golang.org/x/net/internal/timeseries/timeseries_test.go +170 -0
  349. data/ext/vendor/golang.org/x/net/ipv4/batch.go +191 -0
  350. data/ext/vendor/golang.org/x/net/ipv4/bpf_test.go +93 -0
  351. data/ext/vendor/golang.org/x/net/ipv4/control.go +144 -0
  352. data/ext/vendor/golang.org/x/net/ipv4/control_bsd.go +40 -0
  353. data/ext/vendor/golang.org/x/net/ipv4/control_pktinfo.go +39 -0
  354. data/ext/vendor/golang.org/x/net/ipv4/control_stub.go +13 -0
  355. data/ext/vendor/golang.org/x/net/ipv4/control_test.go +21 -0
  356. data/ext/vendor/golang.org/x/net/ipv4/control_unix.go +73 -0
  357. data/ext/vendor/golang.org/x/net/ipv4/control_windows.go +16 -0
  358. data/ext/vendor/golang.org/x/net/ipv4/defs_darwin.go +77 -0
  359. data/ext/vendor/golang.org/x/net/ipv4/defs_dragonfly.go +38 -0
  360. data/ext/vendor/golang.org/x/net/ipv4/defs_freebsd.go +75 -0
  361. data/ext/vendor/golang.org/x/net/ipv4/defs_linux.go +122 -0
  362. data/ext/vendor/golang.org/x/net/ipv4/defs_netbsd.go +37 -0
  363. data/ext/vendor/golang.org/x/net/ipv4/defs_openbsd.go +37 -0
  364. data/ext/vendor/golang.org/x/net/ipv4/defs_solaris.go +84 -0
  365. data/ext/vendor/golang.org/x/net/ipv4/dgramopt.go +265 -0
  366. data/ext/vendor/golang.org/x/net/ipv4/doc.go +244 -0
  367. data/ext/vendor/golang.org/x/net/ipv4/endpoint.go +187 -0
  368. data/ext/vendor/golang.org/x/net/ipv4/example_test.go +224 -0
  369. data/ext/vendor/golang.org/x/net/ipv4/gen.go +199 -0
  370. data/ext/vendor/golang.org/x/net/ipv4/genericopt.go +57 -0
  371. data/ext/vendor/golang.org/x/net/ipv4/header.go +159 -0
  372. data/ext/vendor/golang.org/x/net/ipv4/header_test.go +228 -0
  373. data/ext/vendor/golang.org/x/net/ipv4/helper.go +63 -0
  374. data/ext/vendor/golang.org/x/net/ipv4/iana.go +34 -0
  375. data/ext/vendor/golang.org/x/net/ipv4/icmp.go +57 -0
  376. data/ext/vendor/golang.org/x/net/ipv4/icmp_linux.go +25 -0
  377. data/ext/vendor/golang.org/x/net/ipv4/icmp_stub.go +25 -0
  378. data/ext/vendor/golang.org/x/net/ipv4/icmp_test.go +95 -0
  379. data/ext/vendor/golang.org/x/net/ipv4/multicast_test.go +334 -0
  380. data/ext/vendor/golang.org/x/net/ipv4/multicastlistener_test.go +265 -0
  381. data/ext/vendor/golang.org/x/net/ipv4/multicastsockopt_test.go +195 -0
  382. data/ext/vendor/golang.org/x/net/ipv4/packet.go +69 -0
  383. data/ext/vendor/golang.org/x/net/ipv4/packet_go1_8.go +56 -0
  384. data/ext/vendor/golang.org/x/net/ipv4/packet_go1_9.go +67 -0
  385. data/ext/vendor/golang.org/x/net/ipv4/payload.go +23 -0
  386. data/ext/vendor/golang.org/x/net/ipv4/payload_cmsg.go +36 -0
  387. data/ext/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_8.go +59 -0
  388. data/ext/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_9.go +67 -0
  389. data/ext/vendor/golang.org/x/net/ipv4/payload_nocmsg.go +42 -0
  390. data/ext/vendor/golang.org/x/net/ipv4/readwrite_go1_8_test.go +248 -0
  391. data/ext/vendor/golang.org/x/net/ipv4/readwrite_go1_9_test.go +388 -0
  392. data/ext/vendor/golang.org/x/net/ipv4/readwrite_test.go +140 -0
  393. data/ext/vendor/golang.org/x/net/ipv4/sockopt.go +44 -0
  394. data/ext/vendor/golang.org/x/net/ipv4/sockopt_posix.go +71 -0
  395. data/ext/vendor/golang.org/x/net/ipv4/sockopt_stub.go +42 -0
  396. data/ext/vendor/golang.org/x/net/ipv4/sys_asmreq.go +119 -0
  397. data/ext/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go +25 -0
  398. data/ext/vendor/golang.org/x/net/ipv4/sys_asmreqn.go +42 -0
  399. data/ext/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go +21 -0
  400. data/ext/vendor/golang.org/x/net/ipv4/sys_bpf.go +23 -0
  401. data/ext/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go +16 -0
  402. data/ext/vendor/golang.org/x/net/ipv4/sys_bsd.go +37 -0
  403. data/ext/vendor/golang.org/x/net/ipv4/sys_darwin.go +93 -0
  404. data/ext/vendor/golang.org/x/net/ipv4/sys_dragonfly.go +35 -0
  405. data/ext/vendor/golang.org/x/net/ipv4/sys_freebsd.go +76 -0
  406. data/ext/vendor/golang.org/x/net/ipv4/sys_linux.go +59 -0
  407. data/ext/vendor/golang.org/x/net/ipv4/sys_solaris.go +57 -0
  408. data/ext/vendor/golang.org/x/net/ipv4/sys_ssmreq.go +54 -0
  409. data/ext/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go +21 -0
  410. data/ext/vendor/golang.org/x/net/ipv4/sys_stub.go +13 -0
  411. data/ext/vendor/golang.org/x/net/ipv4/sys_windows.go +67 -0
  412. data/ext/vendor/golang.org/x/net/ipv4/unicast_test.go +247 -0
  413. data/ext/vendor/golang.org/x/net/ipv4/unicastsockopt_test.go +148 -0
  414. data/ext/vendor/golang.org/x/net/ipv4/zsys_darwin.go +99 -0
  415. data/ext/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go +31 -0
  416. data/ext/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go +93 -0
  417. data/ext/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go +95 -0
  418. data/ext/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go +95 -0
  419. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_386.go +148 -0
  420. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go +150 -0
  421. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go +148 -0
  422. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go +150 -0
  423. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go +148 -0
  424. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go +150 -0
  425. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go +150 -0
  426. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go +148 -0
  427. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go +148 -0
  428. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go +150 -0
  429. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go +150 -0
  430. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go +150 -0
  431. data/ext/vendor/golang.org/x/net/ipv4/zsys_netbsd.go +30 -0
  432. data/ext/vendor/golang.org/x/net/ipv4/zsys_openbsd.go +30 -0
  433. data/ext/vendor/golang.org/x/net/ipv4/zsys_solaris.go +100 -0
  434. data/ext/vendor/golang.org/x/net/ipv6/batch.go +119 -0
  435. data/ext/vendor/golang.org/x/net/ipv6/bpf_test.go +96 -0
  436. data/ext/vendor/golang.org/x/net/ipv6/control.go +187 -0
  437. data/ext/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go +48 -0
  438. data/ext/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go +94 -0
  439. data/ext/vendor/golang.org/x/net/ipv6/control_stub.go +13 -0
  440. data/ext/vendor/golang.org/x/net/ipv6/control_test.go +21 -0
  441. data/ext/vendor/golang.org/x/net/ipv6/control_unix.go +55 -0
  442. data/ext/vendor/golang.org/x/net/ipv6/control_windows.go +16 -0
  443. data/ext/vendor/golang.org/x/net/ipv6/defs_darwin.go +112 -0
  444. data/ext/vendor/golang.org/x/net/ipv6/defs_dragonfly.go +84 -0
  445. data/ext/vendor/golang.org/x/net/ipv6/defs_freebsd.go +105 -0
  446. data/ext/vendor/golang.org/x/net/ipv6/defs_linux.go +147 -0
  447. data/ext/vendor/golang.org/x/net/ipv6/defs_netbsd.go +80 -0
  448. data/ext/vendor/golang.org/x/net/ipv6/defs_openbsd.go +89 -0
  449. data/ext/vendor/golang.org/x/net/ipv6/defs_solaris.go +114 -0
  450. data/ext/vendor/golang.org/x/net/ipv6/dgramopt.go +302 -0
  451. data/ext/vendor/golang.org/x/net/ipv6/doc.go +243 -0
  452. data/ext/vendor/golang.org/x/net/ipv6/endpoint.go +128 -0
  453. data/ext/vendor/golang.org/x/net/ipv6/example_test.go +216 -0
  454. data/ext/vendor/golang.org/x/net/ipv6/gen.go +199 -0
  455. data/ext/vendor/golang.org/x/net/ipv6/genericopt.go +58 -0
  456. data/ext/vendor/golang.org/x/net/ipv6/header.go +55 -0
  457. data/ext/vendor/golang.org/x/net/ipv6/header_test.go +55 -0
  458. data/ext/vendor/golang.org/x/net/ipv6/helper.go +57 -0
  459. data/ext/vendor/golang.org/x/net/ipv6/iana.go +82 -0
  460. data/ext/vendor/golang.org/x/net/ipv6/icmp.go +60 -0
  461. data/ext/vendor/golang.org/x/net/ipv6/icmp_bsd.go +29 -0
  462. data/ext/vendor/golang.org/x/net/ipv6/icmp_linux.go +27 -0
  463. data/ext/vendor/golang.org/x/net/ipv6/icmp_solaris.go +27 -0
  464. data/ext/vendor/golang.org/x/net/ipv6/icmp_stub.go +23 -0
  465. data/ext/vendor/golang.org/x/net/ipv6/icmp_test.go +96 -0
  466. data/ext/vendor/golang.org/x/net/ipv6/icmp_windows.go +22 -0
  467. data/ext/vendor/golang.org/x/net/ipv6/mocktransponder_test.go +32 -0
  468. data/ext/vendor/golang.org/x/net/ipv6/multicast_test.go +264 -0
  469. data/ext/vendor/golang.org/x/net/ipv6/multicastlistener_test.go +261 -0
  470. data/ext/vendor/golang.org/x/net/ipv6/multicastsockopt_test.go +157 -0
  471. data/ext/vendor/golang.org/x/net/ipv6/payload.go +23 -0
  472. data/ext/vendor/golang.org/x/net/ipv6/payload_cmsg.go +35 -0
  473. data/ext/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_8.go +55 -0
  474. data/ext/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_9.go +57 -0
  475. data/ext/vendor/golang.org/x/net/ipv6/payload_nocmsg.go +41 -0
  476. data/ext/vendor/golang.org/x/net/ipv6/readwrite_go1_8_test.go +242 -0
  477. data/ext/vendor/golang.org/x/net/ipv6/readwrite_go1_9_test.go +373 -0
  478. data/ext/vendor/golang.org/x/net/ipv6/readwrite_test.go +148 -0
  479. data/ext/vendor/golang.org/x/net/ipv6/sockopt.go +43 -0
  480. data/ext/vendor/golang.org/x/net/ipv6/sockopt_posix.go +87 -0
  481. data/ext/vendor/golang.org/x/net/ipv6/sockopt_stub.go +46 -0
  482. data/ext/vendor/golang.org/x/net/ipv6/sockopt_test.go +133 -0
  483. data/ext/vendor/golang.org/x/net/ipv6/sys_asmreq.go +24 -0
  484. data/ext/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go +17 -0
  485. data/ext/vendor/golang.org/x/net/ipv6/sys_bpf.go +23 -0
  486. data/ext/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go +16 -0
  487. data/ext/vendor/golang.org/x/net/ipv6/sys_bsd.go +57 -0
  488. data/ext/vendor/golang.org/x/net/ipv6/sys_darwin.go +106 -0
  489. data/ext/vendor/golang.org/x/net/ipv6/sys_freebsd.go +92 -0
  490. data/ext/vendor/golang.org/x/net/ipv6/sys_linux.go +74 -0
  491. data/ext/vendor/golang.org/x/net/ipv6/sys_solaris.go +74 -0
  492. data/ext/vendor/golang.org/x/net/ipv6/sys_ssmreq.go +54 -0
  493. data/ext/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go +21 -0
  494. data/ext/vendor/golang.org/x/net/ipv6/sys_stub.go +13 -0
  495. data/ext/vendor/golang.org/x/net/ipv6/sys_windows.go +75 -0
  496. data/ext/vendor/golang.org/x/net/ipv6/unicast_test.go +184 -0
  497. data/ext/vendor/golang.org/x/net/ipv6/unicastsockopt_test.go +120 -0
  498. data/ext/vendor/golang.org/x/net/ipv6/zsys_darwin.go +131 -0
  499. data/ext/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go +88 -0
  500. data/ext/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go +122 -0
  501. data/ext/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go +124 -0
  502. data/ext/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go +124 -0
  503. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_386.go +170 -0
  504. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go +172 -0
  505. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go +170 -0
  506. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go +172 -0
  507. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go +170 -0
  508. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go +172 -0
  509. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go +172 -0
  510. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go +170 -0
  511. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go +170 -0
  512. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go +172 -0
  513. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go +172 -0
  514. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go +172 -0
  515. data/ext/vendor/golang.org/x/net/ipv6/zsys_netbsd.go +84 -0
  516. data/ext/vendor/golang.org/x/net/ipv6/zsys_openbsd.go +93 -0
  517. data/ext/vendor/golang.org/x/net/ipv6/zsys_solaris.go +131 -0
  518. data/ext/vendor/golang.org/x/net/lex/httplex/httplex.go +351 -0
  519. data/ext/vendor/golang.org/x/net/lex/httplex/httplex_test.go +119 -0
  520. data/ext/vendor/golang.org/x/net/lif/address.go +105 -0
  521. data/ext/vendor/golang.org/x/net/lif/address_test.go +123 -0
  522. data/ext/vendor/golang.org/x/net/lif/binary.go +115 -0
  523. data/ext/vendor/golang.org/x/net/lif/defs_solaris.go +90 -0
  524. data/ext/vendor/golang.org/x/net/lif/lif.go +43 -0
  525. data/ext/vendor/golang.org/x/net/lif/link.go +126 -0
  526. data/ext/vendor/golang.org/x/net/lif/link_test.go +63 -0
  527. data/ext/vendor/golang.org/x/net/lif/sys.go +21 -0
  528. data/ext/vendor/golang.org/x/net/lif/sys_solaris_amd64.s +8 -0
  529. data/ext/vendor/golang.org/x/net/lif/syscall.go +28 -0
  530. data/ext/vendor/golang.org/x/net/lif/zsys_solaris_amd64.go +103 -0
  531. data/ext/vendor/golang.org/x/net/nettest/conntest.go +456 -0
  532. data/ext/vendor/golang.org/x/net/nettest/conntest_go16.go +24 -0
  533. data/ext/vendor/golang.org/x/net/nettest/conntest_go17.go +24 -0
  534. data/ext/vendor/golang.org/x/net/nettest/conntest_test.go +76 -0
  535. data/ext/vendor/golang.org/x/net/netutil/listen.go +48 -0
  536. data/ext/vendor/golang.org/x/net/netutil/listen_test.go +101 -0
  537. data/ext/vendor/golang.org/x/net/proxy/direct.go +18 -0
  538. data/ext/vendor/golang.org/x/net/proxy/per_host.go +140 -0
  539. data/ext/vendor/golang.org/x/net/proxy/per_host_test.go +55 -0
  540. data/ext/vendor/golang.org/x/net/proxy/proxy.go +134 -0
  541. data/ext/vendor/golang.org/x/net/proxy/proxy_test.go +215 -0
  542. data/ext/vendor/golang.org/x/net/proxy/socks5.go +214 -0
  543. data/ext/vendor/golang.org/x/net/publicsuffix/gen.go +713 -0
  544. data/ext/vendor/golang.org/x/net/publicsuffix/list.go +135 -0
  545. data/ext/vendor/golang.org/x/net/publicsuffix/list_test.go +416 -0
  546. data/ext/vendor/golang.org/x/net/publicsuffix/table.go +9419 -0
  547. data/ext/vendor/golang.org/x/net/publicsuffix/table_test.go +16756 -0
  548. data/ext/vendor/golang.org/x/net/route/address.go +425 -0
  549. data/ext/vendor/golang.org/x/net/route/address_darwin_test.go +63 -0
  550. data/ext/vendor/golang.org/x/net/route/address_test.go +103 -0
  551. data/ext/vendor/golang.org/x/net/route/binary.go +90 -0
  552. data/ext/vendor/golang.org/x/net/route/defs_darwin.go +114 -0
  553. data/ext/vendor/golang.org/x/net/route/defs_dragonfly.go +113 -0
  554. data/ext/vendor/golang.org/x/net/route/defs_freebsd.go +337 -0
  555. data/ext/vendor/golang.org/x/net/route/defs_netbsd.go +112 -0
  556. data/ext/vendor/golang.org/x/net/route/defs_openbsd.go +116 -0
  557. data/ext/vendor/golang.org/x/net/route/interface.go +64 -0
  558. data/ext/vendor/golang.org/x/net/route/interface_announce.go +32 -0
  559. data/ext/vendor/golang.org/x/net/route/interface_classic.go +66 -0
  560. data/ext/vendor/golang.org/x/net/route/interface_freebsd.go +78 -0
  561. data/ext/vendor/golang.org/x/net/route/interface_multicast.go +30 -0
  562. data/ext/vendor/golang.org/x/net/route/interface_openbsd.go +90 -0
  563. data/ext/vendor/golang.org/x/net/route/message.go +72 -0
  564. data/ext/vendor/golang.org/x/net/route/message_darwin_test.go +34 -0
  565. data/ext/vendor/golang.org/x/net/route/message_freebsd_test.go +92 -0
  566. data/ext/vendor/golang.org/x/net/route/message_test.go +239 -0
  567. data/ext/vendor/golang.org/x/net/route/route.go +123 -0
  568. data/ext/vendor/golang.org/x/net/route/route_classic.go +67 -0
  569. data/ext/vendor/golang.org/x/net/route/route_openbsd.go +65 -0
  570. data/ext/vendor/golang.org/x/net/route/route_test.go +390 -0
  571. data/ext/vendor/golang.org/x/net/route/sys.go +39 -0
  572. data/ext/vendor/golang.org/x/net/route/sys_darwin.go +87 -0
  573. data/ext/vendor/golang.org/x/net/route/sys_dragonfly.go +76 -0
  574. data/ext/vendor/golang.org/x/net/route/sys_freebsd.go +155 -0
  575. data/ext/vendor/golang.org/x/net/route/sys_netbsd.go +71 -0
  576. data/ext/vendor/golang.org/x/net/route/sys_openbsd.go +80 -0
  577. data/ext/vendor/golang.org/x/net/route/syscall.go +28 -0
  578. data/ext/vendor/golang.org/x/net/route/zsys_darwin.go +99 -0
  579. data/ext/vendor/golang.org/x/net/route/zsys_dragonfly.go +98 -0
  580. data/ext/vendor/golang.org/x/net/route/zsys_freebsd_386.go +126 -0
  581. data/ext/vendor/golang.org/x/net/route/zsys_freebsd_amd64.go +123 -0
  582. data/ext/vendor/golang.org/x/net/route/zsys_freebsd_arm.go +123 -0
  583. data/ext/vendor/golang.org/x/net/route/zsys_netbsd.go +97 -0
  584. data/ext/vendor/golang.org/x/net/route/zsys_openbsd.go +101 -0
  585. data/ext/vendor/golang.org/x/net/trace/events.go +532 -0
  586. data/ext/vendor/golang.org/x/net/trace/histogram.go +365 -0
  587. data/ext/vendor/golang.org/x/net/trace/histogram_test.go +325 -0
  588. data/ext/vendor/golang.org/x/net/trace/trace.go +1082 -0
  589. data/ext/vendor/golang.org/x/net/trace/trace_go16.go +21 -0
  590. data/ext/vendor/golang.org/x/net/trace/trace_go17.go +21 -0
  591. data/ext/vendor/golang.org/x/net/trace/trace_test.go +178 -0
  592. data/ext/vendor/golang.org/x/net/webdav/file.go +796 -0
  593. data/ext/vendor/golang.org/x/net/webdav/file_go1.6.go +17 -0
  594. data/ext/vendor/golang.org/x/net/webdav/file_go1.7.go +16 -0
  595. data/ext/vendor/golang.org/x/net/webdav/file_test.go +1184 -0
  596. data/ext/vendor/golang.org/x/net/webdav/if.go +173 -0
  597. data/ext/vendor/golang.org/x/net/webdav/if_test.go +322 -0
  598. data/ext/vendor/golang.org/x/net/webdav/internal/xml/README +11 -0
  599. data/ext/vendor/golang.org/x/net/webdav/internal/xml/atom_test.go +56 -0
  600. data/ext/vendor/golang.org/x/net/webdav/internal/xml/example_test.go +151 -0
  601. data/ext/vendor/golang.org/x/net/webdav/internal/xml/marshal.go +1223 -0
  602. data/ext/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go +1939 -0
  603. data/ext/vendor/golang.org/x/net/webdav/internal/xml/read.go +692 -0
  604. data/ext/vendor/golang.org/x/net/webdav/internal/xml/read_test.go +744 -0
  605. data/ext/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go +371 -0
  606. data/ext/vendor/golang.org/x/net/webdav/internal/xml/xml.go +1998 -0
  607. data/ext/vendor/golang.org/x/net/webdav/internal/xml/xml_test.go +752 -0
  608. data/ext/vendor/golang.org/x/net/webdav/litmus_test_server.go +94 -0
  609. data/ext/vendor/golang.org/x/net/webdav/lock.go +445 -0
  610. data/ext/vendor/golang.org/x/net/webdav/lock_test.go +731 -0
  611. data/ext/vendor/golang.org/x/net/webdav/prop.go +418 -0
  612. data/ext/vendor/golang.org/x/net/webdav/prop_test.go +613 -0
  613. data/ext/vendor/golang.org/x/net/webdav/webdav.go +702 -0
  614. data/ext/vendor/golang.org/x/net/webdav/webdav_test.go +344 -0
  615. data/ext/vendor/golang.org/x/net/webdav/xml.go +519 -0
  616. data/ext/vendor/golang.org/x/net/webdav/xml_test.go +906 -0
  617. data/ext/vendor/golang.org/x/net/websocket/client.go +106 -0
  618. data/ext/vendor/golang.org/x/net/websocket/dial.go +24 -0
  619. data/ext/vendor/golang.org/x/net/websocket/dial_test.go +43 -0
  620. data/ext/vendor/golang.org/x/net/websocket/exampledial_test.go +31 -0
  621. data/ext/vendor/golang.org/x/net/websocket/examplehandler_test.go +26 -0
  622. data/ext/vendor/golang.org/x/net/websocket/hybi.go +583 -0
  623. data/ext/vendor/golang.org/x/net/websocket/hybi_test.go +608 -0
  624. data/ext/vendor/golang.org/x/net/websocket/server.go +113 -0
  625. data/ext/vendor/golang.org/x/net/websocket/websocket.go +448 -0
  626. data/ext/vendor/golang.org/x/net/websocket/websocket_test.go +665 -0
  627. data/ext/vendor/golang.org/x/net/xsrftoken/xsrf.go +94 -0
  628. data/ext/vendor/golang.org/x/net/xsrftoken/xsrf_test.go +83 -0
  629. data/ext/vendor/golang.org/x/text/AUTHORS +3 -0
  630. data/ext/vendor/golang.org/x/text/CONTRIBUTING.md +31 -0
  631. data/ext/vendor/golang.org/x/text/CONTRIBUTORS +3 -0
  632. data/ext/vendor/golang.org/x/text/LICENSE +27 -0
  633. data/ext/vendor/golang.org/x/text/PATENTS +22 -0
  634. data/ext/vendor/golang.org/x/text/README.md +91 -0
  635. data/ext/vendor/golang.org/x/text/cases/cases.go +162 -0
  636. data/ext/vendor/golang.org/x/text/cases/context.go +376 -0
  637. data/ext/vendor/golang.org/x/text/cases/context_test.go +438 -0
  638. data/ext/vendor/golang.org/x/text/cases/example_test.go +53 -0
  639. data/ext/vendor/golang.org/x/text/cases/fold.go +34 -0
  640. data/ext/vendor/golang.org/x/text/cases/fold_test.go +51 -0
  641. data/ext/vendor/golang.org/x/text/cases/gen.go +839 -0
  642. data/ext/vendor/golang.org/x/text/cases/gen_trieval.go +219 -0
  643. data/ext/vendor/golang.org/x/text/cases/icu.go +61 -0
  644. data/ext/vendor/golang.org/x/text/cases/icu_test.go +210 -0
  645. data/ext/vendor/golang.org/x/text/cases/info.go +82 -0
  646. data/ext/vendor/golang.org/x/text/cases/map.go +816 -0
  647. data/ext/vendor/golang.org/x/text/cases/map_test.go +950 -0
  648. data/ext/vendor/golang.org/x/text/cases/tables.go +2251 -0
  649. data/ext/vendor/golang.org/x/text/cases/tables_test.go +1158 -0
  650. data/ext/vendor/golang.org/x/text/cases/trieval.go +215 -0
  651. data/ext/vendor/golang.org/x/text/cmd/gotext/doc.go +35 -0
  652. data/ext/vendor/golang.org/x/text/cmd/gotext/extract.go +195 -0
  653. data/ext/vendor/golang.org/x/text/cmd/gotext/main.go +356 -0
  654. data/ext/vendor/golang.org/x/text/cmd/gotext/message.go +127 -0
  655. data/ext/vendor/golang.org/x/text/codereview.cfg +1 -0
  656. data/ext/vendor/golang.org/x/text/collate/build/builder.go +702 -0
  657. data/ext/vendor/golang.org/x/text/collate/build/builder_test.go +290 -0
  658. data/ext/vendor/golang.org/x/text/collate/build/colelem.go +294 -0
  659. data/ext/vendor/golang.org/x/text/collate/build/colelem_test.go +215 -0
  660. data/ext/vendor/golang.org/x/text/collate/build/contract.go +309 -0
  661. data/ext/vendor/golang.org/x/text/collate/build/contract_test.go +266 -0
  662. data/ext/vendor/golang.org/x/text/collate/build/order.go +393 -0
  663. data/ext/vendor/golang.org/x/text/collate/build/order_test.go +229 -0
  664. data/ext/vendor/golang.org/x/text/collate/build/table.go +81 -0
  665. data/ext/vendor/golang.org/x/text/collate/build/trie.go +290 -0
  666. data/ext/vendor/golang.org/x/text/collate/build/trie_test.go +107 -0
  667. data/ext/vendor/golang.org/x/text/collate/collate.go +403 -0
  668. data/ext/vendor/golang.org/x/text/collate/collate_test.go +482 -0
  669. data/ext/vendor/golang.org/x/text/collate/export_test.go +51 -0
  670. data/ext/vendor/golang.org/x/text/collate/index.go +32 -0
  671. data/ext/vendor/golang.org/x/text/collate/maketables.go +553 -0
  672. data/ext/vendor/golang.org/x/text/collate/option.go +239 -0
  673. data/ext/vendor/golang.org/x/text/collate/option_test.go +209 -0
  674. data/ext/vendor/golang.org/x/text/collate/reg_test.go +230 -0
  675. data/ext/vendor/golang.org/x/text/collate/sort.go +81 -0
  676. data/ext/vendor/golang.org/x/text/collate/sort_test.go +55 -0
  677. data/ext/vendor/golang.org/x/text/collate/table_test.go +291 -0
  678. data/ext/vendor/golang.org/x/text/collate/tables.go +73789 -0
  679. data/ext/vendor/golang.org/x/text/collate/tools/colcmp/Makefile +7 -0
  680. data/ext/vendor/golang.org/x/text/collate/tools/colcmp/chars.go +1156 -0
  681. data/ext/vendor/golang.org/x/text/collate/tools/colcmp/col.go +97 -0
  682. data/ext/vendor/golang.org/x/text/collate/tools/colcmp/colcmp.go +529 -0
  683. data/ext/vendor/golang.org/x/text/collate/tools/colcmp/darwin.go +111 -0
  684. data/ext/vendor/golang.org/x/text/collate/tools/colcmp/gen.go +183 -0
  685. data/ext/vendor/golang.org/x/text/collate/tools/colcmp/icu.go +209 -0
  686. data/ext/vendor/golang.org/x/text/currency/common.go +66 -0
  687. data/ext/vendor/golang.org/x/text/currency/currency.go +185 -0
  688. data/ext/vendor/golang.org/x/text/currency/currency_test.go +171 -0
  689. data/ext/vendor/golang.org/x/text/currency/example_test.go +27 -0
  690. data/ext/vendor/golang.org/x/text/currency/format.go +215 -0
  691. data/ext/vendor/golang.org/x/text/currency/format_test.go +70 -0
  692. data/ext/vendor/golang.org/x/text/currency/gen.go +400 -0
  693. data/ext/vendor/golang.org/x/text/currency/gen_common.go +70 -0
  694. data/ext/vendor/golang.org/x/text/currency/query.go +152 -0
  695. data/ext/vendor/golang.org/x/text/currency/query_test.go +107 -0
  696. data/ext/vendor/golang.org/x/text/currency/tables.go +2574 -0
  697. data/ext/vendor/golang.org/x/text/currency/tables_test.go +93 -0
  698. data/ext/vendor/golang.org/x/text/doc.go +13 -0
  699. data/ext/vendor/golang.org/x/text/encoding/charmap/charmap.go +249 -0
  700. data/ext/vendor/golang.org/x/text/encoding/charmap/charmap_test.go +258 -0
  701. data/ext/vendor/golang.org/x/text/encoding/charmap/maketables.go +556 -0
  702. data/ext/vendor/golang.org/x/text/encoding/charmap/tables.go +7410 -0
  703. data/ext/vendor/golang.org/x/text/encoding/encoding.go +335 -0
  704. data/ext/vendor/golang.org/x/text/encoding/encoding_test.go +290 -0
  705. data/ext/vendor/golang.org/x/text/encoding/example_test.go +42 -0
  706. data/ext/vendor/golang.org/x/text/encoding/htmlindex/gen.go +173 -0
  707. data/ext/vendor/golang.org/x/text/encoding/htmlindex/htmlindex.go +86 -0
  708. data/ext/vendor/golang.org/x/text/encoding/htmlindex/htmlindex_test.go +144 -0
  709. data/ext/vendor/golang.org/x/text/encoding/htmlindex/map.go +105 -0
  710. data/ext/vendor/golang.org/x/text/encoding/htmlindex/tables.go +352 -0
  711. data/ext/vendor/golang.org/x/text/encoding/ianaindex/example_test.go +27 -0
  712. data/ext/vendor/golang.org/x/text/encoding/ianaindex/gen.go +192 -0
  713. data/ext/vendor/golang.org/x/text/encoding/ianaindex/ianaindex.go +209 -0
  714. data/ext/vendor/golang.org/x/text/encoding/ianaindex/ianaindex_test.go +192 -0
  715. data/ext/vendor/golang.org/x/text/encoding/ianaindex/tables.go +2348 -0
  716. data/ext/vendor/golang.org/x/text/encoding/internal/enctest/enctest.go +180 -0
  717. data/ext/vendor/golang.org/x/text/encoding/internal/identifier/gen.go +137 -0
  718. data/ext/vendor/golang.org/x/text/encoding/internal/identifier/identifier.go +81 -0
  719. data/ext/vendor/golang.org/x/text/encoding/internal/identifier/mib.go +1621 -0
  720. data/ext/vendor/golang.org/x/text/encoding/internal/internal.go +75 -0
  721. data/ext/vendor/golang.org/x/text/encoding/japanese/all.go +12 -0
  722. data/ext/vendor/golang.org/x/text/encoding/japanese/all_test.go +248 -0
  723. data/ext/vendor/golang.org/x/text/encoding/japanese/eucjp.go +225 -0
  724. data/ext/vendor/golang.org/x/text/encoding/japanese/iso2022jp.go +299 -0
  725. data/ext/vendor/golang.org/x/text/encoding/japanese/maketables.go +161 -0
  726. data/ext/vendor/golang.org/x/text/encoding/japanese/shiftjis.go +189 -0
  727. data/ext/vendor/golang.org/x/text/encoding/japanese/tables.go +26971 -0
  728. data/ext/vendor/golang.org/x/text/encoding/korean/all_test.go +94 -0
  729. data/ext/vendor/golang.org/x/text/encoding/korean/euckr.go +177 -0
  730. data/ext/vendor/golang.org/x/text/encoding/korean/maketables.go +143 -0
  731. data/ext/vendor/golang.org/x/text/encoding/korean/tables.go +34152 -0
  732. data/ext/vendor/golang.org/x/text/encoding/simplifiedchinese/all.go +12 -0
  733. data/ext/vendor/golang.org/x/text/encoding/simplifiedchinese/all_test.go +143 -0
  734. data/ext/vendor/golang.org/x/text/encoding/simplifiedchinese/gbk.go +269 -0
  735. data/ext/vendor/golang.org/x/text/encoding/simplifiedchinese/hzgb2312.go +245 -0
  736. data/ext/vendor/golang.org/x/text/encoding/simplifiedchinese/maketables.go +161 -0
  737. data/ext/vendor/golang.org/x/text/encoding/simplifiedchinese/tables.go +43999 -0
  738. data/ext/vendor/golang.org/x/text/encoding/testdata/candide-gb18030.txt +510 -0
  739. data/ext/vendor/golang.org/x/text/encoding/testdata/candide-utf-16le.txt +0 -0
  740. data/ext/vendor/golang.org/x/text/encoding/testdata/candide-utf-32be.txt +0 -0
  741. data/ext/vendor/golang.org/x/text/encoding/testdata/candide-utf-8.txt +510 -0
  742. data/ext/vendor/golang.org/x/text/encoding/testdata/candide-windows-1252.txt +510 -0
  743. data/ext/vendor/golang.org/x/text/encoding/testdata/rashomon-euc-jp.txt +178 -0
  744. data/ext/vendor/golang.org/x/text/encoding/testdata/rashomon-iso-2022-jp.txt +178 -0
  745. data/ext/vendor/golang.org/x/text/encoding/testdata/rashomon-shift-jis.txt +178 -0
  746. data/ext/vendor/golang.org/x/text/encoding/testdata/rashomon-utf-8.txt +178 -0
  747. data/ext/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-gb-levels-1-and-2-hz-gb2312.txt +107 -0
  748. data/ext/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-gb-levels-1-and-2-utf-8.txt +107 -0
  749. data/ext/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-simplified-gbk.txt +107 -0
  750. data/ext/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-simplified-utf-8.txt +107 -0
  751. data/ext/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-traditional-big5.txt +106 -0
  752. data/ext/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-traditional-utf-8.txt +106 -0
  753. data/ext/vendor/golang.org/x/text/encoding/testdata/unsu-joh-eun-nal-euc-kr.txt +175 -0
  754. data/ext/vendor/golang.org/x/text/encoding/testdata/unsu-joh-eun-nal-utf-8.txt +175 -0
  755. data/ext/vendor/golang.org/x/text/encoding/traditionalchinese/all_test.go +114 -0
  756. data/ext/vendor/golang.org/x/text/encoding/traditionalchinese/big5.go +199 -0
  757. data/ext/vendor/golang.org/x/text/encoding/traditionalchinese/maketables.go +140 -0
  758. data/ext/vendor/golang.org/x/text/encoding/traditionalchinese/tables.go +37142 -0
  759. data/ext/vendor/golang.org/x/text/encoding/unicode/override.go +82 -0
  760. data/ext/vendor/golang.org/x/text/encoding/unicode/unicode.go +434 -0
  761. data/ext/vendor/golang.org/x/text/encoding/unicode/unicode_test.go +499 -0
  762. data/ext/vendor/golang.org/x/text/encoding/unicode/utf32/utf32.go +296 -0
  763. data/ext/vendor/golang.org/x/text/encoding/unicode/utf32/utf32_test.go +248 -0
  764. data/ext/vendor/golang.org/x/text/feature/plural/common.go +70 -0
  765. data/ext/vendor/golang.org/x/text/feature/plural/data_test.go +190 -0
  766. data/ext/vendor/golang.org/x/text/feature/plural/example_test.go +46 -0
  767. data/ext/vendor/golang.org/x/text/feature/plural/gen.go +513 -0
  768. data/ext/vendor/golang.org/x/text/feature/plural/gen_common.go +74 -0
  769. data/ext/vendor/golang.org/x/text/feature/plural/message.go +244 -0
  770. data/ext/vendor/golang.org/x/text/feature/plural/message_test.go +197 -0
  771. data/ext/vendor/golang.org/x/text/feature/plural/plural.go +258 -0
  772. data/ext/vendor/golang.org/x/text/feature/plural/plural_test.go +216 -0
  773. data/ext/vendor/golang.org/x/text/feature/plural/tables.go +540 -0
  774. data/ext/vendor/golang.org/x/text/gen.go +318 -0
  775. data/ext/vendor/golang.org/x/text/internal/catmsg/catmsg.go +366 -0
  776. data/ext/vendor/golang.org/x/text/internal/catmsg/catmsg_test.go +316 -0
  777. data/ext/vendor/golang.org/x/text/internal/catmsg/codec.go +407 -0
  778. data/ext/vendor/golang.org/x/text/internal/catmsg/varint.go +62 -0
  779. data/ext/vendor/golang.org/x/text/internal/catmsg/varint_test.go +123 -0
  780. data/ext/vendor/golang.org/x/text/internal/colltab/collate_test.go +121 -0
  781. data/ext/vendor/golang.org/x/text/internal/colltab/collelem.go +371 -0
  782. data/ext/vendor/golang.org/x/text/internal/colltab/collelem_test.go +183 -0
  783. data/ext/vendor/golang.org/x/text/internal/colltab/colltab.go +105 -0
  784. data/ext/vendor/golang.org/x/text/internal/colltab/colltab_test.go +64 -0
  785. data/ext/vendor/golang.org/x/text/internal/colltab/contract.go +145 -0
  786. data/ext/vendor/golang.org/x/text/internal/colltab/contract_test.go +131 -0
  787. data/ext/vendor/golang.org/x/text/internal/colltab/iter.go +178 -0
  788. data/ext/vendor/golang.org/x/text/internal/colltab/iter_test.go +63 -0
  789. data/ext/vendor/golang.org/x/text/internal/colltab/numeric.go +236 -0
  790. data/ext/vendor/golang.org/x/text/internal/colltab/numeric_test.go +159 -0
  791. data/ext/vendor/golang.org/x/text/internal/colltab/table.go +275 -0
  792. data/ext/vendor/golang.org/x/text/internal/colltab/trie.go +159 -0
  793. data/ext/vendor/golang.org/x/text/internal/colltab/trie_test.go +106 -0
  794. data/ext/vendor/golang.org/x/text/internal/colltab/weighter.go +31 -0
  795. data/ext/vendor/golang.org/x/text/internal/colltab/weighter_test.go +42 -0
  796. data/ext/vendor/golang.org/x/text/internal/export/README +4 -0
  797. data/ext/vendor/golang.org/x/text/internal/export/idna/common_test.go +55 -0
  798. data/ext/vendor/golang.org/x/text/internal/export/idna/example_test.go +68 -0
  799. data/ext/vendor/golang.org/x/text/internal/export/idna/gen.go +276 -0
  800. data/ext/vendor/golang.org/x/text/internal/export/idna/gen_common.go +59 -0
  801. data/ext/vendor/golang.org/x/text/internal/export/idna/gen_test.go +91 -0
  802. data/ext/vendor/golang.org/x/text/internal/export/idna/gen_trieval.go +123 -0
  803. data/ext/vendor/golang.org/x/text/internal/export/idna/idna.go +717 -0
  804. data/ext/vendor/golang.org/x/text/internal/export/idna/idna_test.go +308 -0
  805. data/ext/vendor/golang.org/x/text/internal/export/idna/punycode.go +201 -0
  806. data/ext/vendor/golang.org/x/text/internal/export/idna/punycode_test.go +198 -0
  807. data/ext/vendor/golang.org/x/text/internal/export/idna/tables.go +4557 -0
  808. data/ext/vendor/golang.org/x/text/internal/export/idna/trie.go +70 -0
  809. data/ext/vendor/golang.org/x/text/internal/export/idna/trieval.go +119 -0
  810. data/ext/vendor/golang.org/x/text/internal/format/format.go +41 -0
  811. data/ext/vendor/golang.org/x/text/internal/gen.go +52 -0
  812. data/ext/vendor/golang.org/x/text/internal/gen/code.go +351 -0
  813. data/ext/vendor/golang.org/x/text/internal/gen/gen.go +281 -0
  814. data/ext/vendor/golang.org/x/text/internal/gen_test.go +38 -0
  815. data/ext/vendor/golang.org/x/text/internal/internal.go +51 -0
  816. data/ext/vendor/golang.org/x/text/internal/internal_test.go +38 -0
  817. data/ext/vendor/golang.org/x/text/internal/match.go +67 -0
  818. data/ext/vendor/golang.org/x/text/internal/match_test.go +56 -0
  819. data/ext/vendor/golang.org/x/text/internal/number/common.go +40 -0
  820. data/ext/vendor/golang.org/x/text/internal/number/decimal.go +498 -0
  821. data/ext/vendor/golang.org/x/text/internal/number/decimal_test.go +329 -0
  822. data/ext/vendor/golang.org/x/text/internal/number/format.go +540 -0
  823. data/ext/vendor/golang.org/x/text/internal/number/format_test.go +522 -0
  824. data/ext/vendor/golang.org/x/text/internal/number/gen.go +458 -0
  825. data/ext/vendor/golang.org/x/text/internal/number/gen_common.go +44 -0
  826. data/ext/vendor/golang.org/x/text/internal/number/number.go +154 -0
  827. data/ext/vendor/golang.org/x/text/internal/number/number_test.go +100 -0
  828. data/ext/vendor/golang.org/x/text/internal/number/pattern.go +485 -0
  829. data/ext/vendor/golang.org/x/text/internal/number/pattern_test.go +438 -0
  830. data/ext/vendor/golang.org/x/text/internal/number/roundingmode_string.go +16 -0
  831. data/ext/vendor/golang.org/x/text/internal/number/tables.go +1154 -0
  832. data/ext/vendor/golang.org/x/text/internal/number/tables_test.go +125 -0
  833. data/ext/vendor/golang.org/x/text/internal/stringset/set.go +86 -0
  834. data/ext/vendor/golang.org/x/text/internal/stringset/set_test.go +53 -0
  835. data/ext/vendor/golang.org/x/text/internal/tables.go +117 -0
  836. data/ext/vendor/golang.org/x/text/internal/tag/tag.go +100 -0
  837. data/ext/vendor/golang.org/x/text/internal/tag/tag_test.go +67 -0
  838. data/ext/vendor/golang.org/x/text/internal/testtext/codesize.go +53 -0
  839. data/ext/vendor/golang.org/x/text/internal/testtext/flag.go +22 -0
  840. data/ext/vendor/golang.org/x/text/internal/testtext/gc.go +14 -0
  841. data/ext/vendor/golang.org/x/text/internal/testtext/gccgo.go +11 -0
  842. data/ext/vendor/golang.org/x/text/internal/testtext/go1_6.go +23 -0
  843. data/ext/vendor/golang.org/x/text/internal/testtext/go1_7.go +17 -0
  844. data/ext/vendor/golang.org/x/text/internal/testtext/text.go +105 -0
  845. data/ext/vendor/golang.org/x/text/internal/triegen/compact.go +58 -0
  846. data/ext/vendor/golang.org/x/text/internal/triegen/data_test.go +875 -0
  847. data/ext/vendor/golang.org/x/text/internal/triegen/example_compact_test.go +71 -0
  848. data/ext/vendor/golang.org/x/text/internal/triegen/example_test.go +148 -0
  849. data/ext/vendor/golang.org/x/text/internal/triegen/gen_test.go +68 -0
  850. data/ext/vendor/golang.org/x/text/internal/triegen/print.go +251 -0
  851. data/ext/vendor/golang.org/x/text/internal/triegen/triegen.go +494 -0
  852. data/ext/vendor/golang.org/x/text/internal/ucd/example_test.go +81 -0
  853. data/ext/vendor/golang.org/x/text/internal/ucd/ucd.go +371 -0
  854. data/ext/vendor/golang.org/x/text/internal/ucd/ucd_test.go +105 -0
  855. data/ext/vendor/golang.org/x/text/internal/utf8internal/utf8internal.go +87 -0
  856. data/ext/vendor/golang.org/x/text/language/Makefile +16 -0
  857. data/ext/vendor/golang.org/x/text/language/common.go +16 -0
  858. data/ext/vendor/golang.org/x/text/language/coverage.go +197 -0
  859. data/ext/vendor/golang.org/x/text/language/coverage_test.go +154 -0
  860. data/ext/vendor/golang.org/x/text/language/display/dict.go +92 -0
  861. data/ext/vendor/golang.org/x/text/language/display/dict_test.go +39 -0
  862. data/ext/vendor/golang.org/x/text/language/display/display.go +420 -0
  863. data/ext/vendor/golang.org/x/text/language/display/display_test.go +705 -0
  864. data/ext/vendor/golang.org/x/text/language/display/examples_test.go +116 -0
  865. data/ext/vendor/golang.org/x/text/language/display/lookup.go +251 -0
  866. data/ext/vendor/golang.org/x/text/language/display/maketables.go +602 -0
  867. data/ext/vendor/golang.org/x/text/language/display/tables.go +50344 -0
  868. data/ext/vendor/golang.org/x/text/language/doc.go +102 -0
  869. data/ext/vendor/golang.org/x/text/language/examples_test.go +413 -0
  870. data/ext/vendor/golang.org/x/text/language/gen.go +1706 -0
  871. data/ext/vendor/golang.org/x/text/language/gen_common.go +20 -0
  872. data/ext/vendor/golang.org/x/text/language/gen_index.go +162 -0
  873. data/ext/vendor/golang.org/x/text/language/go1_1.go +38 -0
  874. data/ext/vendor/golang.org/x/text/language/go1_2.go +11 -0
  875. data/ext/vendor/golang.org/x/text/language/httpexample_test.go +48 -0
  876. data/ext/vendor/golang.org/x/text/language/index.go +769 -0
  877. data/ext/vendor/golang.org/x/text/language/language.go +887 -0
  878. data/ext/vendor/golang.org/x/text/language/language_test.go +878 -0
  879. data/ext/vendor/golang.org/x/text/language/lookup.go +396 -0
  880. data/ext/vendor/golang.org/x/text/language/lookup_test.go +457 -0
  881. data/ext/vendor/golang.org/x/text/language/match.go +933 -0
  882. data/ext/vendor/golang.org/x/text/language/match_test.go +505 -0
  883. data/ext/vendor/golang.org/x/text/language/parse.go +859 -0
  884. data/ext/vendor/golang.org/x/text/language/parse_test.go +517 -0
  885. data/ext/vendor/golang.org/x/text/language/tables.go +3675 -0
  886. data/ext/vendor/golang.org/x/text/language/tags.go +143 -0
  887. data/ext/vendor/golang.org/x/text/language/testdata/CLDRLocaleMatcherTest.txt +389 -0
  888. data/ext/vendor/golang.org/x/text/language/testdata/GoLocaleMatcherTest.txt +226 -0
  889. data/ext/vendor/golang.org/x/text/message/catalog.go +28 -0
  890. data/ext/vendor/golang.org/x/text/message/catalog/catalog.go +292 -0
  891. data/ext/vendor/golang.org/x/text/message/catalog/catalog_test.go +194 -0
  892. data/ext/vendor/golang.org/x/text/message/catalog/dict.go +90 -0
  893. data/ext/vendor/golang.org/x/text/message/doc.go +100 -0
  894. data/ext/vendor/golang.org/x/text/message/examples_test.go +42 -0
  895. data/ext/vendor/golang.org/x/text/message/fmt_test.go +1889 -0
  896. data/ext/vendor/golang.org/x/text/message/format.go +532 -0
  897. data/ext/vendor/golang.org/x/text/message/message.go +169 -0
  898. data/ext/vendor/golang.org/x/text/message/message_test.go +181 -0
  899. data/ext/vendor/golang.org/x/text/message/print.go +1194 -0
  900. data/ext/vendor/golang.org/x/text/number/doc.go +28 -0
  901. data/ext/vendor/golang.org/x/text/number/examples_test.go +28 -0
  902. data/ext/vendor/golang.org/x/text/number/format.go +122 -0
  903. data/ext/vendor/golang.org/x/text/number/format_test.go +107 -0
  904. data/ext/vendor/golang.org/x/text/number/number.go +77 -0
  905. data/ext/vendor/golang.org/x/text/number/number_test.go +190 -0
  906. data/ext/vendor/golang.org/x/text/number/option.go +177 -0
  907. data/ext/vendor/golang.org/x/text/runes/cond.go +187 -0
  908. data/ext/vendor/golang.org/x/text/runes/cond_test.go +282 -0
  909. data/ext/vendor/golang.org/x/text/runes/example_test.go +60 -0
  910. data/ext/vendor/golang.org/x/text/runes/runes.go +355 -0
  911. data/ext/vendor/golang.org/x/text/runes/runes_test.go +664 -0
  912. data/ext/vendor/golang.org/x/text/search/index.go +35 -0
  913. data/ext/vendor/golang.org/x/text/search/pattern.go +155 -0
  914. data/ext/vendor/golang.org/x/text/search/pattern_test.go +357 -0
  915. data/ext/vendor/golang.org/x/text/search/search.go +237 -0
  916. data/ext/vendor/golang.org/x/text/search/tables.go +12448 -0
  917. data/ext/vendor/golang.org/x/text/secure/bidirule/bench_test.go +54 -0
  918. data/ext/vendor/golang.org/x/text/secure/bidirule/bidirule.go +340 -0
  919. data/ext/vendor/golang.org/x/text/secure/bidirule/bidirule_test.go +851 -0
  920. data/ext/vendor/golang.org/x/text/secure/doc.go +6 -0
  921. data/ext/vendor/golang.org/x/text/secure/precis/benchmark_test.go +82 -0
  922. data/ext/vendor/golang.org/x/text/secure/precis/class.go +36 -0
  923. data/ext/vendor/golang.org/x/text/secure/precis/class_test.go +50 -0
  924. data/ext/vendor/golang.org/x/text/secure/precis/context.go +139 -0
  925. data/ext/vendor/golang.org/x/text/secure/precis/doc.go +14 -0
  926. data/ext/vendor/golang.org/x/text/secure/precis/enforce_test.go +396 -0
  927. data/ext/vendor/golang.org/x/text/secure/precis/gen.go +310 -0
  928. data/ext/vendor/golang.org/x/text/secure/precis/gen_trieval.go +68 -0
  929. data/ext/vendor/golang.org/x/text/secure/precis/nickname.go +72 -0
  930. data/ext/vendor/golang.org/x/text/secure/precis/options.go +157 -0
  931. data/ext/vendor/golang.org/x/text/secure/precis/profile.go +402 -0
  932. data/ext/vendor/golang.org/x/text/secure/precis/profile_test.go +149 -0
  933. data/ext/vendor/golang.org/x/text/secure/precis/profiles.go +78 -0
  934. data/ext/vendor/golang.org/x/text/secure/precis/tables.go +3887 -0
  935. data/ext/vendor/golang.org/x/text/secure/precis/tables_test.go +69 -0
  936. data/ext/vendor/golang.org/x/text/secure/precis/transformer.go +32 -0
  937. data/ext/vendor/golang.org/x/text/secure/precis/trieval.go +64 -0
  938. data/ext/vendor/golang.org/x/text/transform/examples_test.go +37 -0
  939. data/ext/vendor/golang.org/x/text/transform/transform.go +705 -0
  940. data/ext/vendor/golang.org/x/text/transform/transform_test.go +1317 -0
  941. data/ext/vendor/golang.org/x/text/unicode/bidi/bidi.go +198 -0
  942. data/ext/vendor/golang.org/x/text/unicode/bidi/bracket.go +335 -0
  943. data/ext/vendor/golang.org/x/text/unicode/bidi/core.go +1058 -0
  944. data/ext/vendor/golang.org/x/text/unicode/bidi/core_test.go +224 -0
  945. data/ext/vendor/golang.org/x/text/unicode/bidi/gen.go +133 -0
  946. data/ext/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go +57 -0
  947. data/ext/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go +64 -0
  948. data/ext/vendor/golang.org/x/text/unicode/bidi/prop.go +206 -0
  949. data/ext/vendor/golang.org/x/text/unicode/bidi/ranges_test.go +53 -0
  950. data/ext/vendor/golang.org/x/text/unicode/bidi/tables.go +1813 -0
  951. data/ext/vendor/golang.org/x/text/unicode/bidi/tables_test.go +82 -0
  952. data/ext/vendor/golang.org/x/text/unicode/bidi/trieval.go +60 -0
  953. data/ext/vendor/golang.org/x/text/unicode/cldr/base.go +100 -0
  954. data/ext/vendor/golang.org/x/text/unicode/cldr/cldr.go +130 -0
  955. data/ext/vendor/golang.org/x/text/unicode/cldr/cldr_test.go +27 -0
  956. data/ext/vendor/golang.org/x/text/unicode/cldr/collate.go +359 -0
  957. data/ext/vendor/golang.org/x/text/unicode/cldr/collate_test.go +275 -0
  958. data/ext/vendor/golang.org/x/text/unicode/cldr/data_test.go +186 -0
  959. data/ext/vendor/golang.org/x/text/unicode/cldr/decode.go +171 -0
  960. data/ext/vendor/golang.org/x/text/unicode/cldr/examples_test.go +21 -0
  961. data/ext/vendor/golang.org/x/text/unicode/cldr/makexml.go +400 -0
  962. data/ext/vendor/golang.org/x/text/unicode/cldr/resolve.go +602 -0
  963. data/ext/vendor/golang.org/x/text/unicode/cldr/resolve_test.go +368 -0
  964. data/ext/vendor/golang.org/x/text/unicode/cldr/slice.go +144 -0
  965. data/ext/vendor/golang.org/x/text/unicode/cldr/slice_test.go +175 -0
  966. data/ext/vendor/golang.org/x/text/unicode/cldr/xml.go +1487 -0
  967. data/ext/vendor/golang.org/x/text/unicode/doc.go +8 -0
  968. data/ext/vendor/golang.org/x/text/unicode/norm/composition.go +508 -0
  969. data/ext/vendor/golang.org/x/text/unicode/norm/composition_test.go +130 -0
  970. data/ext/vendor/golang.org/x/text/unicode/norm/example_iter_test.go +82 -0
  971. data/ext/vendor/golang.org/x/text/unicode/norm/example_test.go +27 -0
  972. data/ext/vendor/golang.org/x/text/unicode/norm/forminfo.go +259 -0
  973. data/ext/vendor/golang.org/x/text/unicode/norm/forminfo_test.go +54 -0
  974. data/ext/vendor/golang.org/x/text/unicode/norm/input.go +109 -0
  975. data/ext/vendor/golang.org/x/text/unicode/norm/iter.go +457 -0
  976. data/ext/vendor/golang.org/x/text/unicode/norm/iter_test.go +98 -0
  977. data/ext/vendor/golang.org/x/text/unicode/norm/maketables.go +976 -0
  978. data/ext/vendor/golang.org/x/text/unicode/norm/norm_test.go +14 -0
  979. data/ext/vendor/golang.org/x/text/unicode/norm/normalize.go +609 -0
  980. data/ext/vendor/golang.org/x/text/unicode/norm/normalize_test.go +1287 -0
  981. data/ext/vendor/golang.org/x/text/unicode/norm/readwriter.go +125 -0
  982. data/ext/vendor/golang.org/x/text/unicode/norm/readwriter_test.go +56 -0
  983. data/ext/vendor/golang.org/x/text/unicode/norm/tables.go +7651 -0
  984. data/ext/vendor/golang.org/x/text/unicode/norm/transform.go +88 -0
  985. data/ext/vendor/golang.org/x/text/unicode/norm/transform_test.go +101 -0
  986. data/ext/vendor/golang.org/x/text/unicode/norm/trie.go +54 -0
  987. data/ext/vendor/golang.org/x/text/unicode/norm/triegen.go +117 -0
  988. data/ext/vendor/golang.org/x/text/unicode/norm/ucd_test.go +275 -0
  989. data/ext/vendor/golang.org/x/text/unicode/rangetable/gen.go +115 -0
  990. data/ext/vendor/golang.org/x/text/unicode/rangetable/merge.go +260 -0
  991. data/ext/vendor/golang.org/x/text/unicode/rangetable/merge_test.go +184 -0
  992. data/ext/vendor/golang.org/x/text/unicode/rangetable/rangetable.go +70 -0
  993. data/ext/vendor/golang.org/x/text/unicode/rangetable/rangetable_test.go +55 -0
  994. data/ext/vendor/golang.org/x/text/unicode/rangetable/tables.go +6376 -0
  995. data/ext/vendor/golang.org/x/text/unicode/runenames/bits.go +59 -0
  996. data/ext/vendor/golang.org/x/text/unicode/runenames/example_test.go +118 -0
  997. data/ext/vendor/golang.org/x/text/unicode/runenames/gen.go +195 -0
  998. data/ext/vendor/golang.org/x/text/unicode/runenames/gen_bits.go +63 -0
  999. data/ext/vendor/golang.org/x/text/unicode/runenames/runenames.go +48 -0
  1000. data/ext/vendor/golang.org/x/text/unicode/runenames/runenames_test.go +46 -0
  1001. data/ext/vendor/golang.org/x/text/unicode/runenames/tables.go +15514 -0
  1002. data/ext/vendor/golang.org/x/text/width/common_test.go +92 -0
  1003. data/ext/vendor/golang.org/x/text/width/example_test.go +52 -0
  1004. data/ext/vendor/golang.org/x/text/width/gen.go +115 -0
  1005. data/ext/vendor/golang.org/x/text/width/gen_common.go +96 -0
  1006. data/ext/vendor/golang.org/x/text/width/gen_trieval.go +34 -0
  1007. data/ext/vendor/golang.org/x/text/width/kind_string.go +16 -0
  1008. data/ext/vendor/golang.org/x/text/width/runes_test.go +461 -0
  1009. data/ext/vendor/golang.org/x/text/width/tables.go +1316 -0
  1010. data/ext/vendor/golang.org/x/text/width/tables_test.go +59 -0
  1011. data/ext/vendor/golang.org/x/text/width/transform.go +239 -0
  1012. data/ext/vendor/golang.org/x/text/width/transform_test.go +701 -0
  1013. data/ext/vendor/golang.org/x/text/width/trieval.go +30 -0
  1014. data/ext/vendor/golang.org/x/text/width/width.go +206 -0
  1015. data/lib/ires/version.rb +1 -1
  1016. data/shared/darwin/ires.so +0 -0
  1017. data/shared/linux/ires.so +0 -0
  1018. metadata +1011 -23
  1019. data/ext/operate/image.go +0 -176
  1020. data/ext/util/uri/uri.go +0 -105
  1021. data/ext/vendor/github.com/satori/go.uuid/README.md +0 -65
  1022. data/ext/vendor/github.com/satori/go.uuid/benchmarks_test.go +0 -121
  1023. data/ext/vendor/github.com/satori/go.uuid/uuid.go +0 -488
  1024. data/ext/vendor/github.com/satori/go.uuid/uuid_test.go +0 -633
@@ -0,0 +1,2285 @@
1
+ // Copyright 2015 The Go Authors. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style
3
+ // license that can be found in the LICENSE file.
4
+
5
+ // Transport code.
6
+
7
+ package http2
8
+
9
+ import (
10
+ "bufio"
11
+ "bytes"
12
+ "compress/gzip"
13
+ "crypto/rand"
14
+ "crypto/tls"
15
+ "errors"
16
+ "fmt"
17
+ "io"
18
+ "io/ioutil"
19
+ "log"
20
+ "math"
21
+ mathrand "math/rand"
22
+ "net"
23
+ "net/http"
24
+ "sort"
25
+ "strconv"
26
+ "strings"
27
+ "sync"
28
+ "time"
29
+
30
+ "golang.org/x/net/http2/hpack"
31
+ "golang.org/x/net/idna"
32
+ "golang.org/x/net/lex/httplex"
33
+ )
34
+
35
+ const (
36
+ // transportDefaultConnFlow is how many connection-level flow control
37
+ // tokens we give the server at start-up, past the default 64k.
38
+ transportDefaultConnFlow = 1 << 30
39
+
40
+ // transportDefaultStreamFlow is how many stream-level flow
41
+ // control tokens we announce to the peer, and how many bytes
42
+ // we buffer per stream.
43
+ transportDefaultStreamFlow = 4 << 20
44
+
45
+ // transportDefaultStreamMinRefresh is the minimum number of bytes we'll send
46
+ // a stream-level WINDOW_UPDATE for at a time.
47
+ transportDefaultStreamMinRefresh = 4 << 10
48
+
49
+ defaultUserAgent = "Go-http-client/2.0"
50
+ )
51
+
52
+ // Transport is an HTTP/2 Transport.
53
+ //
54
+ // A Transport internally caches connections to servers. It is safe
55
+ // for concurrent use by multiple goroutines.
56
+ type Transport struct {
57
+ // DialTLS specifies an optional dial function for creating
58
+ // TLS connections for requests.
59
+ //
60
+ // If DialTLS is nil, tls.Dial is used.
61
+ //
62
+ // If the returned net.Conn has a ConnectionState method like tls.Conn,
63
+ // it will be used to set http.Response.TLS.
64
+ DialTLS func(network, addr string, cfg *tls.Config) (net.Conn, error)
65
+
66
+ // TLSClientConfig specifies the TLS configuration to use with
67
+ // tls.Client. If nil, the default configuration is used.
68
+ TLSClientConfig *tls.Config
69
+
70
+ // ConnPool optionally specifies an alternate connection pool to use.
71
+ // If nil, the default is used.
72
+ ConnPool ClientConnPool
73
+
74
+ // DisableCompression, if true, prevents the Transport from
75
+ // requesting compression with an "Accept-Encoding: gzip"
76
+ // request header when the Request contains no existing
77
+ // Accept-Encoding value. If the Transport requests gzip on
78
+ // its own and gets a gzipped response, it's transparently
79
+ // decoded in the Response.Body. However, if the user
80
+ // explicitly requested gzip it is not automatically
81
+ // uncompressed.
82
+ DisableCompression bool
83
+
84
+ // AllowHTTP, if true, permits HTTP/2 requests using the insecure,
85
+ // plain-text "http" scheme. Note that this does not enable h2c support.
86
+ AllowHTTP bool
87
+
88
+ // MaxHeaderListSize is the http2 SETTINGS_MAX_HEADER_LIST_SIZE to
89
+ // send in the initial settings frame. It is how many bytes
90
+ // of response headers are allowed. Unlike the http2 spec, zero here
91
+ // means to use a default limit (currently 10MB). If you actually
92
+ // want to advertise an ulimited value to the peer, Transport
93
+ // interprets the highest possible value here (0xffffffff or 1<<32-1)
94
+ // to mean no limit.
95
+ MaxHeaderListSize uint32
96
+
97
+ // t1, if non-nil, is the standard library Transport using
98
+ // this transport. Its settings are used (but not its
99
+ // RoundTrip method, etc).
100
+ t1 *http.Transport
101
+
102
+ connPoolOnce sync.Once
103
+ connPoolOrDef ClientConnPool // non-nil version of ConnPool
104
+ }
105
+
106
+ func (t *Transport) maxHeaderListSize() uint32 {
107
+ if t.MaxHeaderListSize == 0 {
108
+ return 10 << 20
109
+ }
110
+ if t.MaxHeaderListSize == 0xffffffff {
111
+ return 0
112
+ }
113
+ return t.MaxHeaderListSize
114
+ }
115
+
116
+ func (t *Transport) disableCompression() bool {
117
+ return t.DisableCompression || (t.t1 != nil && t.t1.DisableCompression)
118
+ }
119
+
120
+ var errTransportVersion = errors.New("http2: ConfigureTransport is only supported starting at Go 1.6")
121
+
122
+ // ConfigureTransport configures a net/http HTTP/1 Transport to use HTTP/2.
123
+ // It requires Go 1.6 or later and returns an error if the net/http package is too old
124
+ // or if t1 has already been HTTP/2-enabled.
125
+ func ConfigureTransport(t1 *http.Transport) error {
126
+ _, err := configureTransport(t1) // in configure_transport.go (go1.6) or not_go16.go
127
+ return err
128
+ }
129
+
130
+ func (t *Transport) connPool() ClientConnPool {
131
+ t.connPoolOnce.Do(t.initConnPool)
132
+ return t.connPoolOrDef
133
+ }
134
+
135
+ func (t *Transport) initConnPool() {
136
+ if t.ConnPool != nil {
137
+ t.connPoolOrDef = t.ConnPool
138
+ } else {
139
+ t.connPoolOrDef = &clientConnPool{t: t}
140
+ }
141
+ }
142
+
143
+ // ClientConn is the state of a single HTTP/2 client connection to an
144
+ // HTTP/2 server.
145
+ type ClientConn struct {
146
+ t *Transport
147
+ tconn net.Conn // usually *tls.Conn, except specialized impls
148
+ tlsState *tls.ConnectionState // nil only for specialized impls
149
+ singleUse bool // whether being used for a single http.Request
150
+
151
+ // readLoop goroutine fields:
152
+ readerDone chan struct{} // closed on error
153
+ readerErr error // set before readerDone is closed
154
+
155
+ idleTimeout time.Duration // or 0 for never
156
+ idleTimer *time.Timer
157
+
158
+ mu sync.Mutex // guards following
159
+ cond *sync.Cond // hold mu; broadcast on flow/closed changes
160
+ flow flow // our conn-level flow control quota (cs.flow is per stream)
161
+ inflow flow // peer's conn-level flow control
162
+ closed bool
163
+ wantSettingsAck bool // we sent a SETTINGS frame and haven't heard back
164
+ goAway *GoAwayFrame // if non-nil, the GoAwayFrame we received
165
+ goAwayDebug string // goAway frame's debug data, retained as a string
166
+ streams map[uint32]*clientStream // client-initiated
167
+ nextStreamID uint32
168
+ pendingRequests int // requests blocked and waiting to be sent because len(streams) == maxConcurrentStreams
169
+ pings map[[8]byte]chan struct{} // in flight ping data to notification channel
170
+ bw *bufio.Writer
171
+ br *bufio.Reader
172
+ fr *Framer
173
+ lastActive time.Time
174
+ // Settings from peer: (also guarded by mu)
175
+ maxFrameSize uint32
176
+ maxConcurrentStreams uint32
177
+ peerMaxHeaderListSize uint64
178
+ initialWindowSize uint32
179
+
180
+ hbuf bytes.Buffer // HPACK encoder writes into this
181
+ henc *hpack.Encoder
182
+ freeBuf [][]byte
183
+
184
+ wmu sync.Mutex // held while writing; acquire AFTER mu if holding both
185
+ werr error // first write error that has occurred
186
+ }
187
+
188
+ // clientStream is the state for a single HTTP/2 stream. One of these
189
+ // is created for each Transport.RoundTrip call.
190
+ type clientStream struct {
191
+ cc *ClientConn
192
+ req *http.Request
193
+ trace *clientTrace // or nil
194
+ ID uint32
195
+ resc chan resAndError
196
+ bufPipe pipe // buffered pipe with the flow-controlled response payload
197
+ startedWrite bool // started request body write; guarded by cc.mu
198
+ requestedGzip bool
199
+ on100 func() // optional code to run if get a 100 continue response
200
+
201
+ flow flow // guarded by cc.mu
202
+ inflow flow // guarded by cc.mu
203
+ bytesRemain int64 // -1 means unknown; owned by transportResponseBody.Read
204
+ readErr error // sticky read error; owned by transportResponseBody.Read
205
+ stopReqBody error // if non-nil, stop writing req body; guarded by cc.mu
206
+ didReset bool // whether we sent a RST_STREAM to the server; guarded by cc.mu
207
+
208
+ peerReset chan struct{} // closed on peer reset
209
+ resetErr error // populated before peerReset is closed
210
+
211
+ done chan struct{} // closed when stream remove from cc.streams map; close calls guarded by cc.mu
212
+
213
+ // owned by clientConnReadLoop:
214
+ firstByte bool // got the first response byte
215
+ pastHeaders bool // got first MetaHeadersFrame (actual headers)
216
+ pastTrailers bool // got optional second MetaHeadersFrame (trailers)
217
+
218
+ trailer http.Header // accumulated trailers
219
+ resTrailer *http.Header // client's Response.Trailer
220
+ }
221
+
222
+ // awaitRequestCancel waits for the user to cancel a request or for the done
223
+ // channel to be signaled. A non-nil error is returned only if the request was
224
+ // canceled.
225
+ func awaitRequestCancel(req *http.Request, done <-chan struct{}) error {
226
+ ctx := reqContext(req)
227
+ if req.Cancel == nil && ctx.Done() == nil {
228
+ return nil
229
+ }
230
+ select {
231
+ case <-req.Cancel:
232
+ return errRequestCanceled
233
+ case <-ctx.Done():
234
+ return ctx.Err()
235
+ case <-done:
236
+ return nil
237
+ }
238
+ }
239
+
240
+ // awaitRequestCancel waits for the user to cancel a request, its context to
241
+ // expire, or for the request to be done (any way it might be removed from the
242
+ // cc.streams map: peer reset, successful completion, TCP connection breakage,
243
+ // etc). If the request is canceled, then cs will be canceled and closed.
244
+ func (cs *clientStream) awaitRequestCancel(req *http.Request) {
245
+ if err := awaitRequestCancel(req, cs.done); err != nil {
246
+ cs.cancelStream()
247
+ cs.bufPipe.CloseWithError(err)
248
+ }
249
+ }
250
+
251
+ func (cs *clientStream) cancelStream() {
252
+ cc := cs.cc
253
+ cc.mu.Lock()
254
+ didReset := cs.didReset
255
+ cs.didReset = true
256
+ cc.mu.Unlock()
257
+
258
+ if !didReset {
259
+ cc.writeStreamReset(cs.ID, ErrCodeCancel, nil)
260
+ cc.forgetStreamID(cs.ID)
261
+ }
262
+ }
263
+
264
+ // checkResetOrDone reports any error sent in a RST_STREAM frame by the
265
+ // server, or errStreamClosed if the stream is complete.
266
+ func (cs *clientStream) checkResetOrDone() error {
267
+ select {
268
+ case <-cs.peerReset:
269
+ return cs.resetErr
270
+ case <-cs.done:
271
+ return errStreamClosed
272
+ default:
273
+ return nil
274
+ }
275
+ }
276
+
277
+ func (cs *clientStream) abortRequestBodyWrite(err error) {
278
+ if err == nil {
279
+ panic("nil error")
280
+ }
281
+ cc := cs.cc
282
+ cc.mu.Lock()
283
+ cs.stopReqBody = err
284
+ cc.cond.Broadcast()
285
+ cc.mu.Unlock()
286
+ }
287
+
288
+ type stickyErrWriter struct {
289
+ w io.Writer
290
+ err *error
291
+ }
292
+
293
+ func (sew stickyErrWriter) Write(p []byte) (n int, err error) {
294
+ if *sew.err != nil {
295
+ return 0, *sew.err
296
+ }
297
+ n, err = sew.w.Write(p)
298
+ *sew.err = err
299
+ return
300
+ }
301
+
302
+ var ErrNoCachedConn = errors.New("http2: no cached connection was available")
303
+
304
+ // RoundTripOpt are options for the Transport.RoundTripOpt method.
305
+ type RoundTripOpt struct {
306
+ // OnlyCachedConn controls whether RoundTripOpt may
307
+ // create a new TCP connection. If set true and
308
+ // no cached connection is available, RoundTripOpt
309
+ // will return ErrNoCachedConn.
310
+ OnlyCachedConn bool
311
+ }
312
+
313
+ func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) {
314
+ return t.RoundTripOpt(req, RoundTripOpt{})
315
+ }
316
+
317
+ // authorityAddr returns a given authority (a host/IP, or host:port / ip:port)
318
+ // and returns a host:port. The port 443 is added if needed.
319
+ func authorityAddr(scheme string, authority string) (addr string) {
320
+ host, port, err := net.SplitHostPort(authority)
321
+ if err != nil { // authority didn't have a port
322
+ port = "443"
323
+ if scheme == "http" {
324
+ port = "80"
325
+ }
326
+ host = authority
327
+ }
328
+ if a, err := idna.ToASCII(host); err == nil {
329
+ host = a
330
+ }
331
+ // IPv6 address literal, without a port:
332
+ if strings.HasPrefix(host, "[") && strings.HasSuffix(host, "]") {
333
+ return host + ":" + port
334
+ }
335
+ return net.JoinHostPort(host, port)
336
+ }
337
+
338
+ // RoundTripOpt is like RoundTrip, but takes options.
339
+ func (t *Transport) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Response, error) {
340
+ if !(req.URL.Scheme == "https" || (req.URL.Scheme == "http" && t.AllowHTTP)) {
341
+ return nil, errors.New("http2: unsupported scheme")
342
+ }
343
+
344
+ addr := authorityAddr(req.URL.Scheme, req.URL.Host)
345
+ for retry := 0; ; retry++ {
346
+ cc, err := t.connPool().GetClientConn(req, addr)
347
+ if err != nil {
348
+ t.vlogf("http2: Transport failed to get client conn for %s: %v", addr, err)
349
+ return nil, err
350
+ }
351
+ traceGotConn(req, cc)
352
+ res, err := cc.RoundTrip(req)
353
+ if err != nil && retry <= 6 {
354
+ afterBodyWrite := false
355
+ if e, ok := err.(afterReqBodyWriteError); ok {
356
+ err = e
357
+ afterBodyWrite = true
358
+ }
359
+ if req, err = shouldRetryRequest(req, err, afterBodyWrite); err == nil {
360
+ // After the first retry, do exponential backoff with 10% jitter.
361
+ if retry == 0 {
362
+ continue
363
+ }
364
+ backoff := float64(uint(1) << (uint(retry) - 1))
365
+ backoff += backoff * (0.1 * mathrand.Float64())
366
+ select {
367
+ case <-time.After(time.Second * time.Duration(backoff)):
368
+ continue
369
+ case <-reqContext(req).Done():
370
+ return nil, reqContext(req).Err()
371
+ }
372
+ }
373
+ }
374
+ if err != nil {
375
+ t.vlogf("RoundTrip failure: %v", err)
376
+ return nil, err
377
+ }
378
+ return res, nil
379
+ }
380
+ }
381
+
382
+ // CloseIdleConnections closes any connections which were previously
383
+ // connected from previous requests but are now sitting idle.
384
+ // It does not interrupt any connections currently in use.
385
+ func (t *Transport) CloseIdleConnections() {
386
+ if cp, ok := t.connPool().(clientConnPoolIdleCloser); ok {
387
+ cp.closeIdleConnections()
388
+ }
389
+ }
390
+
391
+ var (
392
+ errClientConnClosed = errors.New("http2: client conn is closed")
393
+ errClientConnUnusable = errors.New("http2: client conn not usable")
394
+ errClientConnGotGoAway = errors.New("http2: Transport received Server's graceful shutdown GOAWAY")
395
+ )
396
+
397
+ // afterReqBodyWriteError is a wrapper around errors returned by ClientConn.RoundTrip.
398
+ // It is used to signal that err happened after part of Request.Body was sent to the server.
399
+ type afterReqBodyWriteError struct {
400
+ err error
401
+ }
402
+
403
+ func (e afterReqBodyWriteError) Error() string {
404
+ return e.err.Error() + "; some request body already written"
405
+ }
406
+
407
+ // shouldRetryRequest is called by RoundTrip when a request fails to get
408
+ // response headers. It is always called with a non-nil error.
409
+ // It returns either a request to retry (either the same request, or a
410
+ // modified clone), or an error if the request can't be replayed.
411
+ func shouldRetryRequest(req *http.Request, err error, afterBodyWrite bool) (*http.Request, error) {
412
+ if !canRetryError(err) {
413
+ return nil, err
414
+ }
415
+ if !afterBodyWrite {
416
+ return req, nil
417
+ }
418
+ // If the Body is nil (or http.NoBody), it's safe to reuse
419
+ // this request and its Body.
420
+ if req.Body == nil || reqBodyIsNoBody(req.Body) {
421
+ return req, nil
422
+ }
423
+ // Otherwise we depend on the Request having its GetBody
424
+ // func defined.
425
+ getBody := reqGetBody(req) // Go 1.8: getBody = req.GetBody
426
+ if getBody == nil {
427
+ return nil, fmt.Errorf("http2: Transport: cannot retry err [%v] after Request.Body was written; define Request.GetBody to avoid this error", err)
428
+ }
429
+ body, err := getBody()
430
+ if err != nil {
431
+ return nil, err
432
+ }
433
+ newReq := *req
434
+ newReq.Body = body
435
+ return &newReq, nil
436
+ }
437
+
438
+ func canRetryError(err error) bool {
439
+ if err == errClientConnUnusable || err == errClientConnGotGoAway {
440
+ return true
441
+ }
442
+ if se, ok := err.(StreamError); ok {
443
+ return se.Code == ErrCodeRefusedStream
444
+ }
445
+ return false
446
+ }
447
+
448
+ func (t *Transport) dialClientConn(addr string, singleUse bool) (*ClientConn, error) {
449
+ host, _, err := net.SplitHostPort(addr)
450
+ if err != nil {
451
+ return nil, err
452
+ }
453
+ tconn, err := t.dialTLS()("tcp", addr, t.newTLSConfig(host))
454
+ if err != nil {
455
+ return nil, err
456
+ }
457
+ return t.newClientConn(tconn, singleUse)
458
+ }
459
+
460
+ func (t *Transport) newTLSConfig(host string) *tls.Config {
461
+ cfg := new(tls.Config)
462
+ if t.TLSClientConfig != nil {
463
+ *cfg = *cloneTLSConfig(t.TLSClientConfig)
464
+ }
465
+ if !strSliceContains(cfg.NextProtos, NextProtoTLS) {
466
+ cfg.NextProtos = append([]string{NextProtoTLS}, cfg.NextProtos...)
467
+ }
468
+ if cfg.ServerName == "" {
469
+ cfg.ServerName = host
470
+ }
471
+ return cfg
472
+ }
473
+
474
+ func (t *Transport) dialTLS() func(string, string, *tls.Config) (net.Conn, error) {
475
+ if t.DialTLS != nil {
476
+ return t.DialTLS
477
+ }
478
+ return t.dialTLSDefault
479
+ }
480
+
481
+ func (t *Transport) dialTLSDefault(network, addr string, cfg *tls.Config) (net.Conn, error) {
482
+ cn, err := tls.Dial(network, addr, cfg)
483
+ if err != nil {
484
+ return nil, err
485
+ }
486
+ if err := cn.Handshake(); err != nil {
487
+ return nil, err
488
+ }
489
+ if !cfg.InsecureSkipVerify {
490
+ if err := cn.VerifyHostname(cfg.ServerName); err != nil {
491
+ return nil, err
492
+ }
493
+ }
494
+ state := cn.ConnectionState()
495
+ if p := state.NegotiatedProtocol; p != NextProtoTLS {
496
+ return nil, fmt.Errorf("http2: unexpected ALPN protocol %q; want %q", p, NextProtoTLS)
497
+ }
498
+ if !state.NegotiatedProtocolIsMutual {
499
+ return nil, errors.New("http2: could not negotiate protocol mutually")
500
+ }
501
+ return cn, nil
502
+ }
503
+
504
+ // disableKeepAlives reports whether connections should be closed as
505
+ // soon as possible after handling the first request.
506
+ func (t *Transport) disableKeepAlives() bool {
507
+ return t.t1 != nil && t.t1.DisableKeepAlives
508
+ }
509
+
510
+ func (t *Transport) expectContinueTimeout() time.Duration {
511
+ if t.t1 == nil {
512
+ return 0
513
+ }
514
+ return transportExpectContinueTimeout(t.t1)
515
+ }
516
+
517
+ func (t *Transport) NewClientConn(c net.Conn) (*ClientConn, error) {
518
+ return t.newClientConn(c, false)
519
+ }
520
+
521
+ func (t *Transport) newClientConn(c net.Conn, singleUse bool) (*ClientConn, error) {
522
+ cc := &ClientConn{
523
+ t: t,
524
+ tconn: c,
525
+ readerDone: make(chan struct{}),
526
+ nextStreamID: 1,
527
+ maxFrameSize: 16 << 10, // spec default
528
+ initialWindowSize: 65535, // spec default
529
+ maxConcurrentStreams: 1000, // "infinite", per spec. 1000 seems good enough.
530
+ peerMaxHeaderListSize: 0xffffffffffffffff, // "infinite", per spec. Use 2^64-1 instead.
531
+ streams: make(map[uint32]*clientStream),
532
+ singleUse: singleUse,
533
+ wantSettingsAck: true,
534
+ pings: make(map[[8]byte]chan struct{}),
535
+ }
536
+ if d := t.idleConnTimeout(); d != 0 {
537
+ cc.idleTimeout = d
538
+ cc.idleTimer = time.AfterFunc(d, cc.onIdleTimeout)
539
+ }
540
+ if VerboseLogs {
541
+ t.vlogf("http2: Transport creating client conn %p to %v", cc, c.RemoteAddr())
542
+ }
543
+
544
+ cc.cond = sync.NewCond(&cc.mu)
545
+ cc.flow.add(int32(initialWindowSize))
546
+
547
+ // TODO: adjust this writer size to account for frame size +
548
+ // MTU + crypto/tls record padding.
549
+ cc.bw = bufio.NewWriter(stickyErrWriter{c, &cc.werr})
550
+ cc.br = bufio.NewReader(c)
551
+ cc.fr = NewFramer(cc.bw, cc.br)
552
+ cc.fr.ReadMetaHeaders = hpack.NewDecoder(initialHeaderTableSize, nil)
553
+ cc.fr.MaxHeaderListSize = t.maxHeaderListSize()
554
+
555
+ // TODO: SetMaxDynamicTableSize, SetMaxDynamicTableSizeLimit on
556
+ // henc in response to SETTINGS frames?
557
+ cc.henc = hpack.NewEncoder(&cc.hbuf)
558
+
559
+ if cs, ok := c.(connectionStater); ok {
560
+ state := cs.ConnectionState()
561
+ cc.tlsState = &state
562
+ }
563
+
564
+ initialSettings := []Setting{
565
+ {ID: SettingEnablePush, Val: 0},
566
+ {ID: SettingInitialWindowSize, Val: transportDefaultStreamFlow},
567
+ }
568
+ if max := t.maxHeaderListSize(); max != 0 {
569
+ initialSettings = append(initialSettings, Setting{ID: SettingMaxHeaderListSize, Val: max})
570
+ }
571
+
572
+ cc.bw.Write(clientPreface)
573
+ cc.fr.WriteSettings(initialSettings...)
574
+ cc.fr.WriteWindowUpdate(0, transportDefaultConnFlow)
575
+ cc.inflow.add(transportDefaultConnFlow + initialWindowSize)
576
+ cc.bw.Flush()
577
+ if cc.werr != nil {
578
+ return nil, cc.werr
579
+ }
580
+
581
+ go cc.readLoop()
582
+ return cc, nil
583
+ }
584
+
585
+ func (cc *ClientConn) setGoAway(f *GoAwayFrame) {
586
+ cc.mu.Lock()
587
+ defer cc.mu.Unlock()
588
+
589
+ old := cc.goAway
590
+ cc.goAway = f
591
+
592
+ // Merge the previous and current GoAway error frames.
593
+ if cc.goAwayDebug == "" {
594
+ cc.goAwayDebug = string(f.DebugData())
595
+ }
596
+ if old != nil && old.ErrCode != ErrCodeNo {
597
+ cc.goAway.ErrCode = old.ErrCode
598
+ }
599
+ last := f.LastStreamID
600
+ for streamID, cs := range cc.streams {
601
+ if streamID > last {
602
+ select {
603
+ case cs.resc <- resAndError{err: errClientConnGotGoAway}:
604
+ default:
605
+ }
606
+ }
607
+ }
608
+ }
609
+
610
+ // CanTakeNewRequest reports whether the connection can take a new request,
611
+ // meaning it has not been closed or received or sent a GOAWAY.
612
+ func (cc *ClientConn) CanTakeNewRequest() bool {
613
+ cc.mu.Lock()
614
+ defer cc.mu.Unlock()
615
+ return cc.canTakeNewRequestLocked()
616
+ }
617
+
618
+ func (cc *ClientConn) canTakeNewRequestLocked() bool {
619
+ if cc.singleUse && cc.nextStreamID > 1 {
620
+ return false
621
+ }
622
+ return cc.goAway == nil && !cc.closed &&
623
+ int64(cc.nextStreamID)+int64(cc.pendingRequests) < math.MaxInt32
624
+ }
625
+
626
+ // onIdleTimeout is called from a time.AfterFunc goroutine. It will
627
+ // only be called when we're idle, but because we're coming from a new
628
+ // goroutine, there could be a new request coming in at the same time,
629
+ // so this simply calls the synchronized closeIfIdle to shut down this
630
+ // connection. The timer could just call closeIfIdle, but this is more
631
+ // clear.
632
+ func (cc *ClientConn) onIdleTimeout() {
633
+ cc.closeIfIdle()
634
+ }
635
+
636
+ func (cc *ClientConn) closeIfIdle() {
637
+ cc.mu.Lock()
638
+ if len(cc.streams) > 0 {
639
+ cc.mu.Unlock()
640
+ return
641
+ }
642
+ cc.closed = true
643
+ nextID := cc.nextStreamID
644
+ // TODO: do clients send GOAWAY too? maybe? Just Close:
645
+ cc.mu.Unlock()
646
+
647
+ if VerboseLogs {
648
+ cc.vlogf("http2: Transport closing idle conn %p (forSingleUse=%v, maxStream=%v)", cc, cc.singleUse, nextID-2)
649
+ }
650
+ cc.tconn.Close()
651
+ }
652
+
653
+ const maxAllocFrameSize = 512 << 10
654
+
655
+ // frameBuffer returns a scratch buffer suitable for writing DATA frames.
656
+ // They're capped at the min of the peer's max frame size or 512KB
657
+ // (kinda arbitrarily), but definitely capped so we don't allocate 4GB
658
+ // bufers.
659
+ func (cc *ClientConn) frameScratchBuffer() []byte {
660
+ cc.mu.Lock()
661
+ size := cc.maxFrameSize
662
+ if size > maxAllocFrameSize {
663
+ size = maxAllocFrameSize
664
+ }
665
+ for i, buf := range cc.freeBuf {
666
+ if len(buf) >= int(size) {
667
+ cc.freeBuf[i] = nil
668
+ cc.mu.Unlock()
669
+ return buf[:size]
670
+ }
671
+ }
672
+ cc.mu.Unlock()
673
+ return make([]byte, size)
674
+ }
675
+
676
+ func (cc *ClientConn) putFrameScratchBuffer(buf []byte) {
677
+ cc.mu.Lock()
678
+ defer cc.mu.Unlock()
679
+ const maxBufs = 4 // arbitrary; 4 concurrent requests per conn? investigate.
680
+ if len(cc.freeBuf) < maxBufs {
681
+ cc.freeBuf = append(cc.freeBuf, buf)
682
+ return
683
+ }
684
+ for i, old := range cc.freeBuf {
685
+ if old == nil {
686
+ cc.freeBuf[i] = buf
687
+ return
688
+ }
689
+ }
690
+ // forget about it.
691
+ }
692
+
693
+ // errRequestCanceled is a copy of net/http's errRequestCanceled because it's not
694
+ // exported. At least they'll be DeepEqual for h1-vs-h2 comparisons tests.
695
+ var errRequestCanceled = errors.New("net/http: request canceled")
696
+
697
+ func commaSeparatedTrailers(req *http.Request) (string, error) {
698
+ keys := make([]string, 0, len(req.Trailer))
699
+ for k := range req.Trailer {
700
+ k = http.CanonicalHeaderKey(k)
701
+ switch k {
702
+ case "Transfer-Encoding", "Trailer", "Content-Length":
703
+ return "", &badStringError{"invalid Trailer key", k}
704
+ }
705
+ keys = append(keys, k)
706
+ }
707
+ if len(keys) > 0 {
708
+ sort.Strings(keys)
709
+ return strings.Join(keys, ","), nil
710
+ }
711
+ return "", nil
712
+ }
713
+
714
+ func (cc *ClientConn) responseHeaderTimeout() time.Duration {
715
+ if cc.t.t1 != nil {
716
+ return cc.t.t1.ResponseHeaderTimeout
717
+ }
718
+ // No way to do this (yet?) with just an http2.Transport. Probably
719
+ // no need. Request.Cancel this is the new way. We only need to support
720
+ // this for compatibility with the old http.Transport fields when
721
+ // we're doing transparent http2.
722
+ return 0
723
+ }
724
+
725
+ // checkConnHeaders checks whether req has any invalid connection-level headers.
726
+ // per RFC 7540 section 8.1.2.2: Connection-Specific Header Fields.
727
+ // Certain headers are special-cased as okay but not transmitted later.
728
+ func checkConnHeaders(req *http.Request) error {
729
+ if v := req.Header.Get("Upgrade"); v != "" {
730
+ return fmt.Errorf("http2: invalid Upgrade request header: %q", req.Header["Upgrade"])
731
+ }
732
+ if vv := req.Header["Transfer-Encoding"]; len(vv) > 0 && (len(vv) > 1 || vv[0] != "" && vv[0] != "chunked") {
733
+ return fmt.Errorf("http2: invalid Transfer-Encoding request header: %q", vv)
734
+ }
735
+ if vv := req.Header["Connection"]; len(vv) > 0 && (len(vv) > 1 || vv[0] != "" && vv[0] != "close" && vv[0] != "keep-alive") {
736
+ return fmt.Errorf("http2: invalid Connection request header: %q", vv)
737
+ }
738
+ return nil
739
+ }
740
+
741
+ // actualContentLength returns a sanitized version of
742
+ // req.ContentLength, where 0 actually means zero (not unknown) and -1
743
+ // means unknown.
744
+ func actualContentLength(req *http.Request) int64 {
745
+ if req.Body == nil || reqBodyIsNoBody(req.Body) {
746
+ return 0
747
+ }
748
+ if req.ContentLength != 0 {
749
+ return req.ContentLength
750
+ }
751
+ return -1
752
+ }
753
+
754
+ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) {
755
+ if err := checkConnHeaders(req); err != nil {
756
+ return nil, err
757
+ }
758
+ if cc.idleTimer != nil {
759
+ cc.idleTimer.Stop()
760
+ }
761
+
762
+ trailers, err := commaSeparatedTrailers(req)
763
+ if err != nil {
764
+ return nil, err
765
+ }
766
+ hasTrailers := trailers != ""
767
+
768
+ cc.mu.Lock()
769
+ if err := cc.awaitOpenSlotForRequest(req); err != nil {
770
+ cc.mu.Unlock()
771
+ return nil, err
772
+ }
773
+
774
+ body := req.Body
775
+ contentLen := actualContentLength(req)
776
+ hasBody := contentLen != 0
777
+
778
+ // TODO(bradfitz): this is a copy of the logic in net/http. Unify somewhere?
779
+ var requestedGzip bool
780
+ if !cc.t.disableCompression() &&
781
+ req.Header.Get("Accept-Encoding") == "" &&
782
+ req.Header.Get("Range") == "" &&
783
+ req.Method != "HEAD" {
784
+ // Request gzip only, not deflate. Deflate is ambiguous and
785
+ // not as universally supported anyway.
786
+ // See: http://www.gzip.org/zlib/zlib_faq.html#faq38
787
+ //
788
+ // Note that we don't request this for HEAD requests,
789
+ // due to a bug in nginx:
790
+ // http://trac.nginx.org/nginx/ticket/358
791
+ // https://golang.org/issue/5522
792
+ //
793
+ // We don't request gzip if the request is for a range, since
794
+ // auto-decoding a portion of a gzipped document will just fail
795
+ // anyway. See https://golang.org/issue/8923
796
+ requestedGzip = true
797
+ }
798
+
799
+ // we send: HEADERS{1}, CONTINUATION{0,} + DATA{0,} (DATA is
800
+ // sent by writeRequestBody below, along with any Trailers,
801
+ // again in form HEADERS{1}, CONTINUATION{0,})
802
+ hdrs, err := cc.encodeHeaders(req, requestedGzip, trailers, contentLen)
803
+ if err != nil {
804
+ cc.mu.Unlock()
805
+ return nil, err
806
+ }
807
+
808
+ cs := cc.newStream()
809
+ cs.req = req
810
+ cs.trace = requestTrace(req)
811
+ cs.requestedGzip = requestedGzip
812
+ bodyWriter := cc.t.getBodyWriterState(cs, body)
813
+ cs.on100 = bodyWriter.on100
814
+
815
+ cc.wmu.Lock()
816
+ endStream := !hasBody && !hasTrailers
817
+ werr := cc.writeHeaders(cs.ID, endStream, hdrs)
818
+ cc.wmu.Unlock()
819
+ traceWroteHeaders(cs.trace)
820
+ cc.mu.Unlock()
821
+
822
+ if werr != nil {
823
+ if hasBody {
824
+ req.Body.Close() // per RoundTripper contract
825
+ bodyWriter.cancel()
826
+ }
827
+ cc.forgetStreamID(cs.ID)
828
+ // Don't bother sending a RST_STREAM (our write already failed;
829
+ // no need to keep writing)
830
+ traceWroteRequest(cs.trace, werr)
831
+ return nil, werr
832
+ }
833
+
834
+ var respHeaderTimer <-chan time.Time
835
+ if hasBody {
836
+ bodyWriter.scheduleBodyWrite()
837
+ } else {
838
+ traceWroteRequest(cs.trace, nil)
839
+ if d := cc.responseHeaderTimeout(); d != 0 {
840
+ timer := time.NewTimer(d)
841
+ defer timer.Stop()
842
+ respHeaderTimer = timer.C
843
+ }
844
+ }
845
+
846
+ readLoopResCh := cs.resc
847
+ bodyWritten := false
848
+ ctx := reqContext(req)
849
+
850
+ handleReadLoopResponse := func(re resAndError) (*http.Response, error) {
851
+ res := re.res
852
+ if re.err != nil || res.StatusCode > 299 {
853
+ // On error or status code 3xx, 4xx, 5xx, etc abort any
854
+ // ongoing write, assuming that the server doesn't care
855
+ // about our request body. If the server replied with 1xx or
856
+ // 2xx, however, then assume the server DOES potentially
857
+ // want our body (e.g. full-duplex streaming:
858
+ // golang.org/issue/13444). If it turns out the server
859
+ // doesn't, they'll RST_STREAM us soon enough. This is a
860
+ // heuristic to avoid adding knobs to Transport. Hopefully
861
+ // we can keep it.
862
+ bodyWriter.cancel()
863
+ cs.abortRequestBodyWrite(errStopReqBodyWrite)
864
+ }
865
+ if re.err != nil {
866
+ cc.mu.Lock()
867
+ afterBodyWrite := cs.startedWrite
868
+ cc.mu.Unlock()
869
+ cc.forgetStreamID(cs.ID)
870
+ if afterBodyWrite {
871
+ return nil, afterReqBodyWriteError{re.err}
872
+ }
873
+ return nil, re.err
874
+ }
875
+ res.Request = req
876
+ res.TLS = cc.tlsState
877
+ return res, nil
878
+ }
879
+
880
+ for {
881
+ select {
882
+ case re := <-readLoopResCh:
883
+ return handleReadLoopResponse(re)
884
+ case <-respHeaderTimer:
885
+ if !hasBody || bodyWritten {
886
+ cc.writeStreamReset(cs.ID, ErrCodeCancel, nil)
887
+ } else {
888
+ bodyWriter.cancel()
889
+ cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel)
890
+ }
891
+ cc.forgetStreamID(cs.ID)
892
+ return nil, errTimeout
893
+ case <-ctx.Done():
894
+ if !hasBody || bodyWritten {
895
+ cc.writeStreamReset(cs.ID, ErrCodeCancel, nil)
896
+ } else {
897
+ bodyWriter.cancel()
898
+ cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel)
899
+ }
900
+ cc.forgetStreamID(cs.ID)
901
+ return nil, ctx.Err()
902
+ case <-req.Cancel:
903
+ if !hasBody || bodyWritten {
904
+ cc.writeStreamReset(cs.ID, ErrCodeCancel, nil)
905
+ } else {
906
+ bodyWriter.cancel()
907
+ cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel)
908
+ }
909
+ cc.forgetStreamID(cs.ID)
910
+ return nil, errRequestCanceled
911
+ case <-cs.peerReset:
912
+ // processResetStream already removed the
913
+ // stream from the streams map; no need for
914
+ // forgetStreamID.
915
+ return nil, cs.resetErr
916
+ case err := <-bodyWriter.resc:
917
+ // Prefer the read loop's response, if available. Issue 16102.
918
+ select {
919
+ case re := <-readLoopResCh:
920
+ return handleReadLoopResponse(re)
921
+ default:
922
+ }
923
+ if err != nil {
924
+ return nil, err
925
+ }
926
+ bodyWritten = true
927
+ if d := cc.responseHeaderTimeout(); d != 0 {
928
+ timer := time.NewTimer(d)
929
+ defer timer.Stop()
930
+ respHeaderTimer = timer.C
931
+ }
932
+ }
933
+ }
934
+ }
935
+
936
+ // awaitOpenSlotForRequest waits until len(streams) < maxConcurrentStreams.
937
+ // Must hold cc.mu.
938
+ func (cc *ClientConn) awaitOpenSlotForRequest(req *http.Request) error {
939
+ var waitingForConn chan struct{}
940
+ var waitingForConnErr error // guarded by cc.mu
941
+ for {
942
+ cc.lastActive = time.Now()
943
+ if cc.closed || !cc.canTakeNewRequestLocked() {
944
+ return errClientConnUnusable
945
+ }
946
+ if int64(len(cc.streams))+1 <= int64(cc.maxConcurrentStreams) {
947
+ if waitingForConn != nil {
948
+ close(waitingForConn)
949
+ }
950
+ return nil
951
+ }
952
+ // Unfortunately, we cannot wait on a condition variable and channel at
953
+ // the same time, so instead, we spin up a goroutine to check if the
954
+ // request is canceled while we wait for a slot to open in the connection.
955
+ if waitingForConn == nil {
956
+ waitingForConn = make(chan struct{})
957
+ go func() {
958
+ if err := awaitRequestCancel(req, waitingForConn); err != nil {
959
+ cc.mu.Lock()
960
+ waitingForConnErr = err
961
+ cc.cond.Broadcast()
962
+ cc.mu.Unlock()
963
+ }
964
+ }()
965
+ }
966
+ cc.pendingRequests++
967
+ cc.cond.Wait()
968
+ cc.pendingRequests--
969
+ if waitingForConnErr != nil {
970
+ return waitingForConnErr
971
+ }
972
+ }
973
+ }
974
+
975
+ // requires cc.wmu be held
976
+ func (cc *ClientConn) writeHeaders(streamID uint32, endStream bool, hdrs []byte) error {
977
+ first := true // first frame written (HEADERS is first, then CONTINUATION)
978
+ frameSize := int(cc.maxFrameSize)
979
+ for len(hdrs) > 0 && cc.werr == nil {
980
+ chunk := hdrs
981
+ if len(chunk) > frameSize {
982
+ chunk = chunk[:frameSize]
983
+ }
984
+ hdrs = hdrs[len(chunk):]
985
+ endHeaders := len(hdrs) == 0
986
+ if first {
987
+ cc.fr.WriteHeaders(HeadersFrameParam{
988
+ StreamID: streamID,
989
+ BlockFragment: chunk,
990
+ EndStream: endStream,
991
+ EndHeaders: endHeaders,
992
+ })
993
+ first = false
994
+ } else {
995
+ cc.fr.WriteContinuation(streamID, endHeaders, chunk)
996
+ }
997
+ }
998
+ // TODO(bradfitz): this Flush could potentially block (as
999
+ // could the WriteHeaders call(s) above), which means they
1000
+ // wouldn't respond to Request.Cancel being readable. That's
1001
+ // rare, but this should probably be in a goroutine.
1002
+ cc.bw.Flush()
1003
+ return cc.werr
1004
+ }
1005
+
1006
+ // internal error values; they don't escape to callers
1007
+ var (
1008
+ // abort request body write; don't send cancel
1009
+ errStopReqBodyWrite = errors.New("http2: aborting request body write")
1010
+
1011
+ // abort request body write, but send stream reset of cancel.
1012
+ errStopReqBodyWriteAndCancel = errors.New("http2: canceling request")
1013
+ )
1014
+
1015
+ func (cs *clientStream) writeRequestBody(body io.Reader, bodyCloser io.Closer) (err error) {
1016
+ cc := cs.cc
1017
+ sentEnd := false // whether we sent the final DATA frame w/ END_STREAM
1018
+ buf := cc.frameScratchBuffer()
1019
+ defer cc.putFrameScratchBuffer(buf)
1020
+
1021
+ defer func() {
1022
+ traceWroteRequest(cs.trace, err)
1023
+ // TODO: write h12Compare test showing whether
1024
+ // Request.Body is closed by the Transport,
1025
+ // and in multiple cases: server replies <=299 and >299
1026
+ // while still writing request body
1027
+ cerr := bodyCloser.Close()
1028
+ if err == nil {
1029
+ err = cerr
1030
+ }
1031
+ }()
1032
+
1033
+ req := cs.req
1034
+ hasTrailers := req.Trailer != nil
1035
+
1036
+ var sawEOF bool
1037
+ for !sawEOF {
1038
+ n, err := body.Read(buf)
1039
+ if err == io.EOF {
1040
+ sawEOF = true
1041
+ err = nil
1042
+ } else if err != nil {
1043
+ return err
1044
+ }
1045
+
1046
+ remain := buf[:n]
1047
+ for len(remain) > 0 && err == nil {
1048
+ var allowed int32
1049
+ allowed, err = cs.awaitFlowControl(len(remain))
1050
+ switch {
1051
+ case err == errStopReqBodyWrite:
1052
+ return err
1053
+ case err == errStopReqBodyWriteAndCancel:
1054
+ cc.writeStreamReset(cs.ID, ErrCodeCancel, nil)
1055
+ return err
1056
+ case err != nil:
1057
+ return err
1058
+ }
1059
+ cc.wmu.Lock()
1060
+ data := remain[:allowed]
1061
+ remain = remain[allowed:]
1062
+ sentEnd = sawEOF && len(remain) == 0 && !hasTrailers
1063
+ err = cc.fr.WriteData(cs.ID, sentEnd, data)
1064
+ if err == nil {
1065
+ // TODO(bradfitz): this flush is for latency, not bandwidth.
1066
+ // Most requests won't need this. Make this opt-in or
1067
+ // opt-out? Use some heuristic on the body type? Nagel-like
1068
+ // timers? Based on 'n'? Only last chunk of this for loop,
1069
+ // unless flow control tokens are low? For now, always.
1070
+ // If we change this, see comment below.
1071
+ err = cc.bw.Flush()
1072
+ }
1073
+ cc.wmu.Unlock()
1074
+ }
1075
+ if err != nil {
1076
+ return err
1077
+ }
1078
+ }
1079
+
1080
+ if sentEnd {
1081
+ // Already sent END_STREAM (which implies we have no
1082
+ // trailers) and flushed, because currently all
1083
+ // WriteData frames above get a flush. So we're done.
1084
+ return nil
1085
+ }
1086
+
1087
+ var trls []byte
1088
+ if hasTrailers {
1089
+ cc.mu.Lock()
1090
+ trls, err = cc.encodeTrailers(req)
1091
+ cc.mu.Unlock()
1092
+ if err != nil {
1093
+ cc.writeStreamReset(cs.ID, ErrCodeInternal, err)
1094
+ cc.forgetStreamID(cs.ID)
1095
+ return err
1096
+ }
1097
+ }
1098
+
1099
+ cc.wmu.Lock()
1100
+ defer cc.wmu.Unlock()
1101
+
1102
+ // Two ways to send END_STREAM: either with trailers, or
1103
+ // with an empty DATA frame.
1104
+ if len(trls) > 0 {
1105
+ err = cc.writeHeaders(cs.ID, true, trls)
1106
+ } else {
1107
+ err = cc.fr.WriteData(cs.ID, true, nil)
1108
+ }
1109
+ if ferr := cc.bw.Flush(); ferr != nil && err == nil {
1110
+ err = ferr
1111
+ }
1112
+ return err
1113
+ }
1114
+
1115
+ // awaitFlowControl waits for [1, min(maxBytes, cc.cs.maxFrameSize)] flow
1116
+ // control tokens from the server.
1117
+ // It returns either the non-zero number of tokens taken or an error
1118
+ // if the stream is dead.
1119
+ func (cs *clientStream) awaitFlowControl(maxBytes int) (taken int32, err error) {
1120
+ cc := cs.cc
1121
+ cc.mu.Lock()
1122
+ defer cc.mu.Unlock()
1123
+ for {
1124
+ if cc.closed {
1125
+ return 0, errClientConnClosed
1126
+ }
1127
+ if cs.stopReqBody != nil {
1128
+ return 0, cs.stopReqBody
1129
+ }
1130
+ if err := cs.checkResetOrDone(); err != nil {
1131
+ return 0, err
1132
+ }
1133
+ if a := cs.flow.available(); a > 0 {
1134
+ take := a
1135
+ if int(take) > maxBytes {
1136
+
1137
+ take = int32(maxBytes) // can't truncate int; take is int32
1138
+ }
1139
+ if take > int32(cc.maxFrameSize) {
1140
+ take = int32(cc.maxFrameSize)
1141
+ }
1142
+ cs.flow.take(take)
1143
+ return take, nil
1144
+ }
1145
+ cc.cond.Wait()
1146
+ }
1147
+ }
1148
+
1149
+ type badStringError struct {
1150
+ what string
1151
+ str string
1152
+ }
1153
+
1154
+ func (e *badStringError) Error() string { return fmt.Sprintf("%s %q", e.what, e.str) }
1155
+
1156
+ // requires cc.mu be held.
1157
+ func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trailers string, contentLength int64) ([]byte, error) {
1158
+ cc.hbuf.Reset()
1159
+
1160
+ host := req.Host
1161
+ if host == "" {
1162
+ host = req.URL.Host
1163
+ }
1164
+ host, err := httplex.PunycodeHostPort(host)
1165
+ if err != nil {
1166
+ return nil, err
1167
+ }
1168
+
1169
+ var path string
1170
+ if req.Method != "CONNECT" {
1171
+ path = req.URL.RequestURI()
1172
+ if !validPseudoPath(path) {
1173
+ orig := path
1174
+ path = strings.TrimPrefix(path, req.URL.Scheme+"://"+host)
1175
+ if !validPseudoPath(path) {
1176
+ if req.URL.Opaque != "" {
1177
+ return nil, fmt.Errorf("invalid request :path %q from URL.Opaque = %q", orig, req.URL.Opaque)
1178
+ } else {
1179
+ return nil, fmt.Errorf("invalid request :path %q", orig)
1180
+ }
1181
+ }
1182
+ }
1183
+ }
1184
+
1185
+ // Check for any invalid headers and return an error before we
1186
+ // potentially pollute our hpack state. (We want to be able to
1187
+ // continue to reuse the hpack encoder for future requests)
1188
+ for k, vv := range req.Header {
1189
+ if !httplex.ValidHeaderFieldName(k) {
1190
+ return nil, fmt.Errorf("invalid HTTP header name %q", k)
1191
+ }
1192
+ for _, v := range vv {
1193
+ if !httplex.ValidHeaderFieldValue(v) {
1194
+ return nil, fmt.Errorf("invalid HTTP header value %q for header %q", v, k)
1195
+ }
1196
+ }
1197
+ }
1198
+
1199
+ enumerateHeaders := func(f func(name, value string)) {
1200
+ // 8.1.2.3 Request Pseudo-Header Fields
1201
+ // The :path pseudo-header field includes the path and query parts of the
1202
+ // target URI (the path-absolute production and optionally a '?' character
1203
+ // followed by the query production (see Sections 3.3 and 3.4 of
1204
+ // [RFC3986]).
1205
+ f(":authority", host)
1206
+ f(":method", req.Method)
1207
+ if req.Method != "CONNECT" {
1208
+ f(":path", path)
1209
+ f(":scheme", req.URL.Scheme)
1210
+ }
1211
+ if trailers != "" {
1212
+ f("trailer", trailers)
1213
+ }
1214
+
1215
+ var didUA bool
1216
+ for k, vv := range req.Header {
1217
+ if strings.EqualFold(k, "host") || strings.EqualFold(k, "content-length") {
1218
+ // Host is :authority, already sent.
1219
+ // Content-Length is automatic, set below.
1220
+ continue
1221
+ } else if strings.EqualFold(k, "connection") || strings.EqualFold(k, "proxy-connection") ||
1222
+ strings.EqualFold(k, "transfer-encoding") || strings.EqualFold(k, "upgrade") ||
1223
+ strings.EqualFold(k, "keep-alive") {
1224
+ // Per 8.1.2.2 Connection-Specific Header
1225
+ // Fields, don't send connection-specific
1226
+ // fields. We have already checked if any
1227
+ // are error-worthy so just ignore the rest.
1228
+ continue
1229
+ } else if strings.EqualFold(k, "user-agent") {
1230
+ // Match Go's http1 behavior: at most one
1231
+ // User-Agent. If set to nil or empty string,
1232
+ // then omit it. Otherwise if not mentioned,
1233
+ // include the default (below).
1234
+ didUA = true
1235
+ if len(vv) < 1 {
1236
+ continue
1237
+ }
1238
+ vv = vv[:1]
1239
+ if vv[0] == "" {
1240
+ continue
1241
+ }
1242
+
1243
+ }
1244
+
1245
+ for _, v := range vv {
1246
+ f(k, v)
1247
+ }
1248
+ }
1249
+ if shouldSendReqContentLength(req.Method, contentLength) {
1250
+ f("content-length", strconv.FormatInt(contentLength, 10))
1251
+ }
1252
+ if addGzipHeader {
1253
+ f("accept-encoding", "gzip")
1254
+ }
1255
+ if !didUA {
1256
+ f("user-agent", defaultUserAgent)
1257
+ }
1258
+ }
1259
+
1260
+ // Do a first pass over the headers counting bytes to ensure
1261
+ // we don't exceed cc.peerMaxHeaderListSize. This is done as a
1262
+ // separate pass before encoding the headers to prevent
1263
+ // modifying the hpack state.
1264
+ hlSize := uint64(0)
1265
+ enumerateHeaders(func(name, value string) {
1266
+ hf := hpack.HeaderField{Name: name, Value: value}
1267
+ hlSize += uint64(hf.Size())
1268
+ })
1269
+
1270
+ if hlSize > cc.peerMaxHeaderListSize {
1271
+ return nil, errRequestHeaderListSize
1272
+ }
1273
+
1274
+ // Header list size is ok. Write the headers.
1275
+ enumerateHeaders(func(name, value string) {
1276
+ cc.writeHeader(strings.ToLower(name), value)
1277
+ })
1278
+
1279
+ return cc.hbuf.Bytes(), nil
1280
+ }
1281
+
1282
+ // shouldSendReqContentLength reports whether the http2.Transport should send
1283
+ // a "content-length" request header. This logic is basically a copy of the net/http
1284
+ // transferWriter.shouldSendContentLength.
1285
+ // The contentLength is the corrected contentLength (so 0 means actually 0, not unknown).
1286
+ // -1 means unknown.
1287
+ func shouldSendReqContentLength(method string, contentLength int64) bool {
1288
+ if contentLength > 0 {
1289
+ return true
1290
+ }
1291
+ if contentLength < 0 {
1292
+ return false
1293
+ }
1294
+ // For zero bodies, whether we send a content-length depends on the method.
1295
+ // It also kinda doesn't matter for http2 either way, with END_STREAM.
1296
+ switch method {
1297
+ case "POST", "PUT", "PATCH":
1298
+ return true
1299
+ default:
1300
+ return false
1301
+ }
1302
+ }
1303
+
1304
+ // requires cc.mu be held.
1305
+ func (cc *ClientConn) encodeTrailers(req *http.Request) ([]byte, error) {
1306
+ cc.hbuf.Reset()
1307
+
1308
+ hlSize := uint64(0)
1309
+ for k, vv := range req.Trailer {
1310
+ for _, v := range vv {
1311
+ hf := hpack.HeaderField{Name: k, Value: v}
1312
+ hlSize += uint64(hf.Size())
1313
+ }
1314
+ }
1315
+ if hlSize > cc.peerMaxHeaderListSize {
1316
+ return nil, errRequestHeaderListSize
1317
+ }
1318
+
1319
+ for k, vv := range req.Trailer {
1320
+ // Transfer-Encoding, etc.. have already been filtered at the
1321
+ // start of RoundTrip
1322
+ lowKey := strings.ToLower(k)
1323
+ for _, v := range vv {
1324
+ cc.writeHeader(lowKey, v)
1325
+ }
1326
+ }
1327
+ return cc.hbuf.Bytes(), nil
1328
+ }
1329
+
1330
+ func (cc *ClientConn) writeHeader(name, value string) {
1331
+ if VerboseLogs {
1332
+ log.Printf("http2: Transport encoding header %q = %q", name, value)
1333
+ }
1334
+ cc.henc.WriteField(hpack.HeaderField{Name: name, Value: value})
1335
+ }
1336
+
1337
+ type resAndError struct {
1338
+ res *http.Response
1339
+ err error
1340
+ }
1341
+
1342
+ // requires cc.mu be held.
1343
+ func (cc *ClientConn) newStream() *clientStream {
1344
+ cs := &clientStream{
1345
+ cc: cc,
1346
+ ID: cc.nextStreamID,
1347
+ resc: make(chan resAndError, 1),
1348
+ peerReset: make(chan struct{}),
1349
+ done: make(chan struct{}),
1350
+ }
1351
+ cs.flow.add(int32(cc.initialWindowSize))
1352
+ cs.flow.setConnFlow(&cc.flow)
1353
+ cs.inflow.add(transportDefaultStreamFlow)
1354
+ cs.inflow.setConnFlow(&cc.inflow)
1355
+ cc.nextStreamID += 2
1356
+ cc.streams[cs.ID] = cs
1357
+ return cs
1358
+ }
1359
+
1360
+ func (cc *ClientConn) forgetStreamID(id uint32) {
1361
+ cc.streamByID(id, true)
1362
+ }
1363
+
1364
+ func (cc *ClientConn) streamByID(id uint32, andRemove bool) *clientStream {
1365
+ cc.mu.Lock()
1366
+ defer cc.mu.Unlock()
1367
+ cs := cc.streams[id]
1368
+ if andRemove && cs != nil && !cc.closed {
1369
+ cc.lastActive = time.Now()
1370
+ delete(cc.streams, id)
1371
+ if len(cc.streams) == 0 && cc.idleTimer != nil {
1372
+ cc.idleTimer.Reset(cc.idleTimeout)
1373
+ }
1374
+ close(cs.done)
1375
+ // Wake up checkResetOrDone via clientStream.awaitFlowControl and
1376
+ // wake up RoundTrip if there is a pending request.
1377
+ cc.cond.Broadcast()
1378
+ }
1379
+ return cs
1380
+ }
1381
+
1382
+ // clientConnReadLoop is the state owned by the clientConn's frame-reading readLoop.
1383
+ type clientConnReadLoop struct {
1384
+ cc *ClientConn
1385
+ activeRes map[uint32]*clientStream // keyed by streamID
1386
+ closeWhenIdle bool
1387
+ }
1388
+
1389
+ // readLoop runs in its own goroutine and reads and dispatches frames.
1390
+ func (cc *ClientConn) readLoop() {
1391
+ rl := &clientConnReadLoop{
1392
+ cc: cc,
1393
+ activeRes: make(map[uint32]*clientStream),
1394
+ }
1395
+
1396
+ defer rl.cleanup()
1397
+ cc.readerErr = rl.run()
1398
+ if ce, ok := cc.readerErr.(ConnectionError); ok {
1399
+ cc.wmu.Lock()
1400
+ cc.fr.WriteGoAway(0, ErrCode(ce), nil)
1401
+ cc.wmu.Unlock()
1402
+ }
1403
+ }
1404
+
1405
+ // GoAwayError is returned by the Transport when the server closes the
1406
+ // TCP connection after sending a GOAWAY frame.
1407
+ type GoAwayError struct {
1408
+ LastStreamID uint32
1409
+ ErrCode ErrCode
1410
+ DebugData string
1411
+ }
1412
+
1413
+ func (e GoAwayError) Error() string {
1414
+ return fmt.Sprintf("http2: server sent GOAWAY and closed the connection; LastStreamID=%v, ErrCode=%v, debug=%q",
1415
+ e.LastStreamID, e.ErrCode, e.DebugData)
1416
+ }
1417
+
1418
+ func isEOFOrNetReadError(err error) bool {
1419
+ if err == io.EOF {
1420
+ return true
1421
+ }
1422
+ ne, ok := err.(*net.OpError)
1423
+ return ok && ne.Op == "read"
1424
+ }
1425
+
1426
+ func (rl *clientConnReadLoop) cleanup() {
1427
+ cc := rl.cc
1428
+ defer cc.tconn.Close()
1429
+ defer cc.t.connPool().MarkDead(cc)
1430
+ defer close(cc.readerDone)
1431
+
1432
+ if cc.idleTimer != nil {
1433
+ cc.idleTimer.Stop()
1434
+ }
1435
+
1436
+ // Close any response bodies if the server closes prematurely.
1437
+ // TODO: also do this if we've written the headers but not
1438
+ // gotten a response yet.
1439
+ err := cc.readerErr
1440
+ cc.mu.Lock()
1441
+ if cc.goAway != nil && isEOFOrNetReadError(err) {
1442
+ err = GoAwayError{
1443
+ LastStreamID: cc.goAway.LastStreamID,
1444
+ ErrCode: cc.goAway.ErrCode,
1445
+ DebugData: cc.goAwayDebug,
1446
+ }
1447
+ } else if err == io.EOF {
1448
+ err = io.ErrUnexpectedEOF
1449
+ }
1450
+ for _, cs := range rl.activeRes {
1451
+ cs.bufPipe.CloseWithError(err)
1452
+ }
1453
+ for _, cs := range cc.streams {
1454
+ select {
1455
+ case cs.resc <- resAndError{err: err}:
1456
+ default:
1457
+ }
1458
+ close(cs.done)
1459
+ }
1460
+ cc.closed = true
1461
+ cc.cond.Broadcast()
1462
+ cc.mu.Unlock()
1463
+ }
1464
+
1465
+ func (rl *clientConnReadLoop) run() error {
1466
+ cc := rl.cc
1467
+ rl.closeWhenIdle = cc.t.disableKeepAlives() || cc.singleUse
1468
+ gotReply := false // ever saw a HEADERS reply
1469
+ gotSettings := false
1470
+ for {
1471
+ f, err := cc.fr.ReadFrame()
1472
+ if err != nil {
1473
+ cc.vlogf("http2: Transport readFrame error on conn %p: (%T) %v", cc, err, err)
1474
+ }
1475
+ if se, ok := err.(StreamError); ok {
1476
+ if cs := cc.streamByID(se.StreamID, false); cs != nil {
1477
+ cs.cc.writeStreamReset(cs.ID, se.Code, err)
1478
+ cs.cc.forgetStreamID(cs.ID)
1479
+ if se.Cause == nil {
1480
+ se.Cause = cc.fr.errDetail
1481
+ }
1482
+ rl.endStreamError(cs, se)
1483
+ }
1484
+ continue
1485
+ } else if err != nil {
1486
+ return err
1487
+ }
1488
+ if VerboseLogs {
1489
+ cc.vlogf("http2: Transport received %s", summarizeFrame(f))
1490
+ }
1491
+ if !gotSettings {
1492
+ if _, ok := f.(*SettingsFrame); !ok {
1493
+ cc.logf("protocol error: received %T before a SETTINGS frame", f)
1494
+ return ConnectionError(ErrCodeProtocol)
1495
+ }
1496
+ gotSettings = true
1497
+ }
1498
+ maybeIdle := false // whether frame might transition us to idle
1499
+
1500
+ switch f := f.(type) {
1501
+ case *MetaHeadersFrame:
1502
+ err = rl.processHeaders(f)
1503
+ maybeIdle = true
1504
+ gotReply = true
1505
+ case *DataFrame:
1506
+ err = rl.processData(f)
1507
+ maybeIdle = true
1508
+ case *GoAwayFrame:
1509
+ err = rl.processGoAway(f)
1510
+ maybeIdle = true
1511
+ case *RSTStreamFrame:
1512
+ err = rl.processResetStream(f)
1513
+ maybeIdle = true
1514
+ case *SettingsFrame:
1515
+ err = rl.processSettings(f)
1516
+ case *PushPromiseFrame:
1517
+ err = rl.processPushPromise(f)
1518
+ case *WindowUpdateFrame:
1519
+ err = rl.processWindowUpdate(f)
1520
+ case *PingFrame:
1521
+ err = rl.processPing(f)
1522
+ default:
1523
+ cc.logf("Transport: unhandled response frame type %T", f)
1524
+ }
1525
+ if err != nil {
1526
+ if VerboseLogs {
1527
+ cc.vlogf("http2: Transport conn %p received error from processing frame %v: %v", cc, summarizeFrame(f), err)
1528
+ }
1529
+ return err
1530
+ }
1531
+ if rl.closeWhenIdle && gotReply && maybeIdle && len(rl.activeRes) == 0 {
1532
+ cc.closeIfIdle()
1533
+ }
1534
+ }
1535
+ }
1536
+
1537
+ func (rl *clientConnReadLoop) processHeaders(f *MetaHeadersFrame) error {
1538
+ cc := rl.cc
1539
+ if f.StreamEnded() {
1540
+ // Issue 20521: If the stream has ended, streamByID() causes
1541
+ // clientStream.done to be closed, which causes the request's bodyWriter
1542
+ // to be closed with an errStreamClosed, which may be received by
1543
+ // clientConn.RoundTrip before the result of processing these headers.
1544
+ // Deferring stream closure allows the header processing to occur first.
1545
+ // clientConn.RoundTrip may still receive the bodyWriter error first, but
1546
+ // the fix for issue 16102 prioritises any response.
1547
+ defer cc.streamByID(f.StreamID, true)
1548
+ }
1549
+ cs := cc.streamByID(f.StreamID, false)
1550
+ if cs == nil {
1551
+ // We'd get here if we canceled a request while the
1552
+ // server had its response still in flight. So if this
1553
+ // was just something we canceled, ignore it.
1554
+ return nil
1555
+ }
1556
+ if !cs.firstByte {
1557
+ if cs.trace != nil {
1558
+ // TODO(bradfitz): move first response byte earlier,
1559
+ // when we first read the 9 byte header, not waiting
1560
+ // until all the HEADERS+CONTINUATION frames have been
1561
+ // merged. This works for now.
1562
+ traceFirstResponseByte(cs.trace)
1563
+ }
1564
+ cs.firstByte = true
1565
+ }
1566
+ if !cs.pastHeaders {
1567
+ cs.pastHeaders = true
1568
+ } else {
1569
+ return rl.processTrailers(cs, f)
1570
+ }
1571
+
1572
+ res, err := rl.handleResponse(cs, f)
1573
+ if err != nil {
1574
+ if _, ok := err.(ConnectionError); ok {
1575
+ return err
1576
+ }
1577
+ // Any other error type is a stream error.
1578
+ cs.cc.writeStreamReset(f.StreamID, ErrCodeProtocol, err)
1579
+ cs.resc <- resAndError{err: err}
1580
+ return nil // return nil from process* funcs to keep conn alive
1581
+ }
1582
+ if res == nil {
1583
+ // (nil, nil) special case. See handleResponse docs.
1584
+ return nil
1585
+ }
1586
+ if res.Body != noBody {
1587
+ rl.activeRes[cs.ID] = cs
1588
+ }
1589
+ cs.resTrailer = &res.Trailer
1590
+ cs.resc <- resAndError{res: res}
1591
+ return nil
1592
+ }
1593
+
1594
+ // may return error types nil, or ConnectionError. Any other error value
1595
+ // is a StreamError of type ErrCodeProtocol. The returned error in that case
1596
+ // is the detail.
1597
+ //
1598
+ // As a special case, handleResponse may return (nil, nil) to skip the
1599
+ // frame (currently only used for 100 expect continue). This special
1600
+ // case is going away after Issue 13851 is fixed.
1601
+ func (rl *clientConnReadLoop) handleResponse(cs *clientStream, f *MetaHeadersFrame) (*http.Response, error) {
1602
+ if f.Truncated {
1603
+ return nil, errResponseHeaderListSize
1604
+ }
1605
+
1606
+ status := f.PseudoValue("status")
1607
+ if status == "" {
1608
+ return nil, errors.New("missing status pseudo header")
1609
+ }
1610
+ statusCode, err := strconv.Atoi(status)
1611
+ if err != nil {
1612
+ return nil, errors.New("malformed non-numeric status pseudo header")
1613
+ }
1614
+
1615
+ if statusCode == 100 {
1616
+ traceGot100Continue(cs.trace)
1617
+ if cs.on100 != nil {
1618
+ cs.on100() // forces any write delay timer to fire
1619
+ }
1620
+ cs.pastHeaders = false // do it all again
1621
+ return nil, nil
1622
+ }
1623
+
1624
+ header := make(http.Header)
1625
+ res := &http.Response{
1626
+ Proto: "HTTP/2.0",
1627
+ ProtoMajor: 2,
1628
+ Header: header,
1629
+ StatusCode: statusCode,
1630
+ Status: status + " " + http.StatusText(statusCode),
1631
+ }
1632
+ for _, hf := range f.RegularFields() {
1633
+ key := http.CanonicalHeaderKey(hf.Name)
1634
+ if key == "Trailer" {
1635
+ t := res.Trailer
1636
+ if t == nil {
1637
+ t = make(http.Header)
1638
+ res.Trailer = t
1639
+ }
1640
+ foreachHeaderElement(hf.Value, func(v string) {
1641
+ t[http.CanonicalHeaderKey(v)] = nil
1642
+ })
1643
+ } else {
1644
+ header[key] = append(header[key], hf.Value)
1645
+ }
1646
+ }
1647
+
1648
+ streamEnded := f.StreamEnded()
1649
+ isHead := cs.req.Method == "HEAD"
1650
+ if !streamEnded || isHead {
1651
+ res.ContentLength = -1
1652
+ if clens := res.Header["Content-Length"]; len(clens) == 1 {
1653
+ if clen64, err := strconv.ParseInt(clens[0], 10, 64); err == nil {
1654
+ res.ContentLength = clen64
1655
+ } else {
1656
+ // TODO: care? unlike http/1, it won't mess up our framing, so it's
1657
+ // more safe smuggling-wise to ignore.
1658
+ }
1659
+ } else if len(clens) > 1 {
1660
+ // TODO: care? unlike http/1, it won't mess up our framing, so it's
1661
+ // more safe smuggling-wise to ignore.
1662
+ }
1663
+ }
1664
+
1665
+ if streamEnded || isHead {
1666
+ res.Body = noBody
1667
+ return res, nil
1668
+ }
1669
+
1670
+ cs.bufPipe = pipe{b: &dataBuffer{expected: res.ContentLength}}
1671
+ cs.bytesRemain = res.ContentLength
1672
+ res.Body = transportResponseBody{cs}
1673
+ go cs.awaitRequestCancel(cs.req)
1674
+
1675
+ if cs.requestedGzip && res.Header.Get("Content-Encoding") == "gzip" {
1676
+ res.Header.Del("Content-Encoding")
1677
+ res.Header.Del("Content-Length")
1678
+ res.ContentLength = -1
1679
+ res.Body = &gzipReader{body: res.Body}
1680
+ setResponseUncompressed(res)
1681
+ }
1682
+ return res, nil
1683
+ }
1684
+
1685
+ func (rl *clientConnReadLoop) processTrailers(cs *clientStream, f *MetaHeadersFrame) error {
1686
+ if cs.pastTrailers {
1687
+ // Too many HEADERS frames for this stream.
1688
+ return ConnectionError(ErrCodeProtocol)
1689
+ }
1690
+ cs.pastTrailers = true
1691
+ if !f.StreamEnded() {
1692
+ // We expect that any headers for trailers also
1693
+ // has END_STREAM.
1694
+ return ConnectionError(ErrCodeProtocol)
1695
+ }
1696
+ if len(f.PseudoFields()) > 0 {
1697
+ // No pseudo header fields are defined for trailers.
1698
+ // TODO: ConnectionError might be overly harsh? Check.
1699
+ return ConnectionError(ErrCodeProtocol)
1700
+ }
1701
+
1702
+ trailer := make(http.Header)
1703
+ for _, hf := range f.RegularFields() {
1704
+ key := http.CanonicalHeaderKey(hf.Name)
1705
+ trailer[key] = append(trailer[key], hf.Value)
1706
+ }
1707
+ cs.trailer = trailer
1708
+
1709
+ rl.endStream(cs)
1710
+ return nil
1711
+ }
1712
+
1713
+ // transportResponseBody is the concrete type of Transport.RoundTrip's
1714
+ // Response.Body. It is an io.ReadCloser. On Read, it reads from cs.body.
1715
+ // On Close it sends RST_STREAM if EOF wasn't already seen.
1716
+ type transportResponseBody struct {
1717
+ cs *clientStream
1718
+ }
1719
+
1720
+ func (b transportResponseBody) Read(p []byte) (n int, err error) {
1721
+ cs := b.cs
1722
+ cc := cs.cc
1723
+
1724
+ if cs.readErr != nil {
1725
+ return 0, cs.readErr
1726
+ }
1727
+ n, err = b.cs.bufPipe.Read(p)
1728
+ if cs.bytesRemain != -1 {
1729
+ if int64(n) > cs.bytesRemain {
1730
+ n = int(cs.bytesRemain)
1731
+ if err == nil {
1732
+ err = errors.New("net/http: server replied with more than declared Content-Length; truncated")
1733
+ cc.writeStreamReset(cs.ID, ErrCodeProtocol, err)
1734
+ }
1735
+ cs.readErr = err
1736
+ return int(cs.bytesRemain), err
1737
+ }
1738
+ cs.bytesRemain -= int64(n)
1739
+ if err == io.EOF && cs.bytesRemain > 0 {
1740
+ err = io.ErrUnexpectedEOF
1741
+ cs.readErr = err
1742
+ return n, err
1743
+ }
1744
+ }
1745
+ if n == 0 {
1746
+ // No flow control tokens to send back.
1747
+ return
1748
+ }
1749
+
1750
+ cc.mu.Lock()
1751
+ defer cc.mu.Unlock()
1752
+
1753
+ var connAdd, streamAdd int32
1754
+ // Check the conn-level first, before the stream-level.
1755
+ if v := cc.inflow.available(); v < transportDefaultConnFlow/2 {
1756
+ connAdd = transportDefaultConnFlow - v
1757
+ cc.inflow.add(connAdd)
1758
+ }
1759
+ if err == nil { // No need to refresh if the stream is over or failed.
1760
+ // Consider any buffered body data (read from the conn but not
1761
+ // consumed by the client) when computing flow control for this
1762
+ // stream.
1763
+ v := int(cs.inflow.available()) + cs.bufPipe.Len()
1764
+ if v < transportDefaultStreamFlow-transportDefaultStreamMinRefresh {
1765
+ streamAdd = int32(transportDefaultStreamFlow - v)
1766
+ cs.inflow.add(streamAdd)
1767
+ }
1768
+ }
1769
+ if connAdd != 0 || streamAdd != 0 {
1770
+ cc.wmu.Lock()
1771
+ defer cc.wmu.Unlock()
1772
+ if connAdd != 0 {
1773
+ cc.fr.WriteWindowUpdate(0, mustUint31(connAdd))
1774
+ }
1775
+ if streamAdd != 0 {
1776
+ cc.fr.WriteWindowUpdate(cs.ID, mustUint31(streamAdd))
1777
+ }
1778
+ cc.bw.Flush()
1779
+ }
1780
+ return
1781
+ }
1782
+
1783
+ var errClosedResponseBody = errors.New("http2: response body closed")
1784
+
1785
+ func (b transportResponseBody) Close() error {
1786
+ cs := b.cs
1787
+ cc := cs.cc
1788
+
1789
+ serverSentStreamEnd := cs.bufPipe.Err() == io.EOF
1790
+ unread := cs.bufPipe.Len()
1791
+
1792
+ if unread > 0 || !serverSentStreamEnd {
1793
+ cc.mu.Lock()
1794
+ cc.wmu.Lock()
1795
+ if !serverSentStreamEnd {
1796
+ cc.fr.WriteRSTStream(cs.ID, ErrCodeCancel)
1797
+ cs.didReset = true
1798
+ }
1799
+ // Return connection-level flow control.
1800
+ if unread > 0 {
1801
+ cc.inflow.add(int32(unread))
1802
+ cc.fr.WriteWindowUpdate(0, uint32(unread))
1803
+ }
1804
+ cc.bw.Flush()
1805
+ cc.wmu.Unlock()
1806
+ cc.mu.Unlock()
1807
+ }
1808
+
1809
+ cs.bufPipe.BreakWithError(errClosedResponseBody)
1810
+ cc.forgetStreamID(cs.ID)
1811
+ return nil
1812
+ }
1813
+
1814
+ func (rl *clientConnReadLoop) processData(f *DataFrame) error {
1815
+ cc := rl.cc
1816
+ cs := cc.streamByID(f.StreamID, f.StreamEnded())
1817
+ data := f.Data()
1818
+ if cs == nil {
1819
+ cc.mu.Lock()
1820
+ neverSent := cc.nextStreamID
1821
+ cc.mu.Unlock()
1822
+ if f.StreamID >= neverSent {
1823
+ // We never asked for this.
1824
+ cc.logf("http2: Transport received unsolicited DATA frame; closing connection")
1825
+ return ConnectionError(ErrCodeProtocol)
1826
+ }
1827
+ // We probably did ask for this, but canceled. Just ignore it.
1828
+ // TODO: be stricter here? only silently ignore things which
1829
+ // we canceled, but not things which were closed normally
1830
+ // by the peer? Tough without accumulating too much state.
1831
+
1832
+ // But at least return their flow control:
1833
+ if f.Length > 0 {
1834
+ cc.mu.Lock()
1835
+ cc.inflow.add(int32(f.Length))
1836
+ cc.mu.Unlock()
1837
+
1838
+ cc.wmu.Lock()
1839
+ cc.fr.WriteWindowUpdate(0, uint32(f.Length))
1840
+ cc.bw.Flush()
1841
+ cc.wmu.Unlock()
1842
+ }
1843
+ return nil
1844
+ }
1845
+ if !cs.firstByte {
1846
+ cc.logf("protocol error: received DATA before a HEADERS frame")
1847
+ rl.endStreamError(cs, StreamError{
1848
+ StreamID: f.StreamID,
1849
+ Code: ErrCodeProtocol,
1850
+ })
1851
+ return nil
1852
+ }
1853
+ if f.Length > 0 {
1854
+ // Check connection-level flow control.
1855
+ cc.mu.Lock()
1856
+ if cs.inflow.available() >= int32(f.Length) {
1857
+ cs.inflow.take(int32(f.Length))
1858
+ } else {
1859
+ cc.mu.Unlock()
1860
+ return ConnectionError(ErrCodeFlowControl)
1861
+ }
1862
+ // Return any padded flow control now, since we won't
1863
+ // refund it later on body reads.
1864
+ var refund int
1865
+ if pad := int(f.Length) - len(data); pad > 0 {
1866
+ refund += pad
1867
+ }
1868
+ // Return len(data) now if the stream is already closed,
1869
+ // since data will never be read.
1870
+ didReset := cs.didReset
1871
+ if didReset {
1872
+ refund += len(data)
1873
+ }
1874
+ if refund > 0 {
1875
+ cc.inflow.add(int32(refund))
1876
+ cc.wmu.Lock()
1877
+ cc.fr.WriteWindowUpdate(0, uint32(refund))
1878
+ if !didReset {
1879
+ cs.inflow.add(int32(refund))
1880
+ cc.fr.WriteWindowUpdate(cs.ID, uint32(refund))
1881
+ }
1882
+ cc.bw.Flush()
1883
+ cc.wmu.Unlock()
1884
+ }
1885
+ cc.mu.Unlock()
1886
+
1887
+ if len(data) > 0 && !didReset {
1888
+ if _, err := cs.bufPipe.Write(data); err != nil {
1889
+ rl.endStreamError(cs, err)
1890
+ return err
1891
+ }
1892
+ }
1893
+ }
1894
+
1895
+ if f.StreamEnded() {
1896
+ rl.endStream(cs)
1897
+ }
1898
+ return nil
1899
+ }
1900
+
1901
+ var errInvalidTrailers = errors.New("http2: invalid trailers")
1902
+
1903
+ func (rl *clientConnReadLoop) endStream(cs *clientStream) {
1904
+ // TODO: check that any declared content-length matches, like
1905
+ // server.go's (*stream).endStream method.
1906
+ rl.endStreamError(cs, nil)
1907
+ }
1908
+
1909
+ func (rl *clientConnReadLoop) endStreamError(cs *clientStream, err error) {
1910
+ var code func()
1911
+ if err == nil {
1912
+ err = io.EOF
1913
+ code = cs.copyTrailers
1914
+ }
1915
+ cs.bufPipe.closeWithErrorAndCode(err, code)
1916
+ delete(rl.activeRes, cs.ID)
1917
+ if isConnectionCloseRequest(cs.req) {
1918
+ rl.closeWhenIdle = true
1919
+ }
1920
+
1921
+ select {
1922
+ case cs.resc <- resAndError{err: err}:
1923
+ default:
1924
+ }
1925
+ }
1926
+
1927
+ func (cs *clientStream) copyTrailers() {
1928
+ for k, vv := range cs.trailer {
1929
+ t := cs.resTrailer
1930
+ if *t == nil {
1931
+ *t = make(http.Header)
1932
+ }
1933
+ (*t)[k] = vv
1934
+ }
1935
+ }
1936
+
1937
+ func (rl *clientConnReadLoop) processGoAway(f *GoAwayFrame) error {
1938
+ cc := rl.cc
1939
+ cc.t.connPool().MarkDead(cc)
1940
+ if f.ErrCode != 0 {
1941
+ // TODO: deal with GOAWAY more. particularly the error code
1942
+ cc.vlogf("transport got GOAWAY with error code = %v", f.ErrCode)
1943
+ }
1944
+ cc.setGoAway(f)
1945
+ return nil
1946
+ }
1947
+
1948
+ func (rl *clientConnReadLoop) processSettings(f *SettingsFrame) error {
1949
+ cc := rl.cc
1950
+ cc.mu.Lock()
1951
+ defer cc.mu.Unlock()
1952
+
1953
+ if f.IsAck() {
1954
+ if cc.wantSettingsAck {
1955
+ cc.wantSettingsAck = false
1956
+ return nil
1957
+ }
1958
+ return ConnectionError(ErrCodeProtocol)
1959
+ }
1960
+
1961
+ err := f.ForeachSetting(func(s Setting) error {
1962
+ switch s.ID {
1963
+ case SettingMaxFrameSize:
1964
+ cc.maxFrameSize = s.Val
1965
+ case SettingMaxConcurrentStreams:
1966
+ cc.maxConcurrentStreams = s.Val
1967
+ case SettingMaxHeaderListSize:
1968
+ cc.peerMaxHeaderListSize = uint64(s.Val)
1969
+ case SettingInitialWindowSize:
1970
+ // Values above the maximum flow-control
1971
+ // window size of 2^31-1 MUST be treated as a
1972
+ // connection error (Section 5.4.1) of type
1973
+ // FLOW_CONTROL_ERROR.
1974
+ if s.Val > math.MaxInt32 {
1975
+ return ConnectionError(ErrCodeFlowControl)
1976
+ }
1977
+
1978
+ // Adjust flow control of currently-open
1979
+ // frames by the difference of the old initial
1980
+ // window size and this one.
1981
+ delta := int32(s.Val) - int32(cc.initialWindowSize)
1982
+ for _, cs := range cc.streams {
1983
+ cs.flow.add(delta)
1984
+ }
1985
+ cc.cond.Broadcast()
1986
+
1987
+ cc.initialWindowSize = s.Val
1988
+ default:
1989
+ // TODO(bradfitz): handle more settings? SETTINGS_HEADER_TABLE_SIZE probably.
1990
+ cc.vlogf("Unhandled Setting: %v", s)
1991
+ }
1992
+ return nil
1993
+ })
1994
+ if err != nil {
1995
+ return err
1996
+ }
1997
+
1998
+ cc.wmu.Lock()
1999
+ defer cc.wmu.Unlock()
2000
+
2001
+ cc.fr.WriteSettingsAck()
2002
+ cc.bw.Flush()
2003
+ return cc.werr
2004
+ }
2005
+
2006
+ func (rl *clientConnReadLoop) processWindowUpdate(f *WindowUpdateFrame) error {
2007
+ cc := rl.cc
2008
+ cs := cc.streamByID(f.StreamID, false)
2009
+ if f.StreamID != 0 && cs == nil {
2010
+ return nil
2011
+ }
2012
+
2013
+ cc.mu.Lock()
2014
+ defer cc.mu.Unlock()
2015
+
2016
+ fl := &cc.flow
2017
+ if cs != nil {
2018
+ fl = &cs.flow
2019
+ }
2020
+ if !fl.add(int32(f.Increment)) {
2021
+ return ConnectionError(ErrCodeFlowControl)
2022
+ }
2023
+ cc.cond.Broadcast()
2024
+ return nil
2025
+ }
2026
+
2027
+ func (rl *clientConnReadLoop) processResetStream(f *RSTStreamFrame) error {
2028
+ cs := rl.cc.streamByID(f.StreamID, true)
2029
+ if cs == nil {
2030
+ // TODO: return error if server tries to RST_STEAM an idle stream
2031
+ return nil
2032
+ }
2033
+ select {
2034
+ case <-cs.peerReset:
2035
+ // Already reset.
2036
+ // This is the only goroutine
2037
+ // which closes this, so there
2038
+ // isn't a race.
2039
+ default:
2040
+ err := streamError(cs.ID, f.ErrCode)
2041
+ cs.resetErr = err
2042
+ close(cs.peerReset)
2043
+ cs.bufPipe.CloseWithError(err)
2044
+ cs.cc.cond.Broadcast() // wake up checkResetOrDone via clientStream.awaitFlowControl
2045
+ }
2046
+ delete(rl.activeRes, cs.ID)
2047
+ return nil
2048
+ }
2049
+
2050
+ // Ping sends a PING frame to the server and waits for the ack.
2051
+ // Public implementation is in go17.go and not_go17.go
2052
+ func (cc *ClientConn) ping(ctx contextContext) error {
2053
+ c := make(chan struct{})
2054
+ // Generate a random payload
2055
+ var p [8]byte
2056
+ for {
2057
+ if _, err := rand.Read(p[:]); err != nil {
2058
+ return err
2059
+ }
2060
+ cc.mu.Lock()
2061
+ // check for dup before insert
2062
+ if _, found := cc.pings[p]; !found {
2063
+ cc.pings[p] = c
2064
+ cc.mu.Unlock()
2065
+ break
2066
+ }
2067
+ cc.mu.Unlock()
2068
+ }
2069
+ cc.wmu.Lock()
2070
+ if err := cc.fr.WritePing(false, p); err != nil {
2071
+ cc.wmu.Unlock()
2072
+ return err
2073
+ }
2074
+ if err := cc.bw.Flush(); err != nil {
2075
+ cc.wmu.Unlock()
2076
+ return err
2077
+ }
2078
+ cc.wmu.Unlock()
2079
+ select {
2080
+ case <-c:
2081
+ return nil
2082
+ case <-ctx.Done():
2083
+ return ctx.Err()
2084
+ case <-cc.readerDone:
2085
+ // connection closed
2086
+ return cc.readerErr
2087
+ }
2088
+ }
2089
+
2090
+ func (rl *clientConnReadLoop) processPing(f *PingFrame) error {
2091
+ if f.IsAck() {
2092
+ cc := rl.cc
2093
+ cc.mu.Lock()
2094
+ defer cc.mu.Unlock()
2095
+ // If ack, notify listener if any
2096
+ if c, ok := cc.pings[f.Data]; ok {
2097
+ close(c)
2098
+ delete(cc.pings, f.Data)
2099
+ }
2100
+ return nil
2101
+ }
2102
+ cc := rl.cc
2103
+ cc.wmu.Lock()
2104
+ defer cc.wmu.Unlock()
2105
+ if err := cc.fr.WritePing(true, f.Data); err != nil {
2106
+ return err
2107
+ }
2108
+ return cc.bw.Flush()
2109
+ }
2110
+
2111
+ func (rl *clientConnReadLoop) processPushPromise(f *PushPromiseFrame) error {
2112
+ // We told the peer we don't want them.
2113
+ // Spec says:
2114
+ // "PUSH_PROMISE MUST NOT be sent if the SETTINGS_ENABLE_PUSH
2115
+ // setting of the peer endpoint is set to 0. An endpoint that
2116
+ // has set this setting and has received acknowledgement MUST
2117
+ // treat the receipt of a PUSH_PROMISE frame as a connection
2118
+ // error (Section 5.4.1) of type PROTOCOL_ERROR."
2119
+ return ConnectionError(ErrCodeProtocol)
2120
+ }
2121
+
2122
+ func (cc *ClientConn) writeStreamReset(streamID uint32, code ErrCode, err error) {
2123
+ // TODO: map err to more interesting error codes, once the
2124
+ // HTTP community comes up with some. But currently for
2125
+ // RST_STREAM there's no equivalent to GOAWAY frame's debug
2126
+ // data, and the error codes are all pretty vague ("cancel").
2127
+ cc.wmu.Lock()
2128
+ cc.fr.WriteRSTStream(streamID, code)
2129
+ cc.bw.Flush()
2130
+ cc.wmu.Unlock()
2131
+ }
2132
+
2133
+ var (
2134
+ errResponseHeaderListSize = errors.New("http2: response header list larger than advertised limit")
2135
+ errRequestHeaderListSize = errors.New("http2: request header list larger than peer's advertised limit")
2136
+ errPseudoTrailers = errors.New("http2: invalid pseudo header in trailers")
2137
+ )
2138
+
2139
+ func (cc *ClientConn) logf(format string, args ...interface{}) {
2140
+ cc.t.logf(format, args...)
2141
+ }
2142
+
2143
+ func (cc *ClientConn) vlogf(format string, args ...interface{}) {
2144
+ cc.t.vlogf(format, args...)
2145
+ }
2146
+
2147
+ func (t *Transport) vlogf(format string, args ...interface{}) {
2148
+ if VerboseLogs {
2149
+ t.logf(format, args...)
2150
+ }
2151
+ }
2152
+
2153
+ func (t *Transport) logf(format string, args ...interface{}) {
2154
+ log.Printf(format, args...)
2155
+ }
2156
+
2157
+ var noBody io.ReadCloser = ioutil.NopCloser(bytes.NewReader(nil))
2158
+
2159
+ func strSliceContains(ss []string, s string) bool {
2160
+ for _, v := range ss {
2161
+ if v == s {
2162
+ return true
2163
+ }
2164
+ }
2165
+ return false
2166
+ }
2167
+
2168
+ type erringRoundTripper struct{ err error }
2169
+
2170
+ func (rt erringRoundTripper) RoundTrip(*http.Request) (*http.Response, error) { return nil, rt.err }
2171
+
2172
+ // gzipReader wraps a response body so it can lazily
2173
+ // call gzip.NewReader on the first call to Read
2174
+ type gzipReader struct {
2175
+ body io.ReadCloser // underlying Response.Body
2176
+ zr *gzip.Reader // lazily-initialized gzip reader
2177
+ zerr error // sticky error
2178
+ }
2179
+
2180
+ func (gz *gzipReader) Read(p []byte) (n int, err error) {
2181
+ if gz.zerr != nil {
2182
+ return 0, gz.zerr
2183
+ }
2184
+ if gz.zr == nil {
2185
+ gz.zr, err = gzip.NewReader(gz.body)
2186
+ if err != nil {
2187
+ gz.zerr = err
2188
+ return 0, err
2189
+ }
2190
+ }
2191
+ return gz.zr.Read(p)
2192
+ }
2193
+
2194
+ func (gz *gzipReader) Close() error {
2195
+ return gz.body.Close()
2196
+ }
2197
+
2198
+ type errorReader struct{ err error }
2199
+
2200
+ func (r errorReader) Read(p []byte) (int, error) { return 0, r.err }
2201
+
2202
+ // bodyWriterState encapsulates various state around the Transport's writing
2203
+ // of the request body, particularly regarding doing delayed writes of the body
2204
+ // when the request contains "Expect: 100-continue".
2205
+ type bodyWriterState struct {
2206
+ cs *clientStream
2207
+ timer *time.Timer // if non-nil, we're doing a delayed write
2208
+ fnonce *sync.Once // to call fn with
2209
+ fn func() // the code to run in the goroutine, writing the body
2210
+ resc chan error // result of fn's execution
2211
+ delay time.Duration // how long we should delay a delayed write for
2212
+ }
2213
+
2214
+ func (t *Transport) getBodyWriterState(cs *clientStream, body io.Reader) (s bodyWriterState) {
2215
+ s.cs = cs
2216
+ if body == nil {
2217
+ return
2218
+ }
2219
+ resc := make(chan error, 1)
2220
+ s.resc = resc
2221
+ s.fn = func() {
2222
+ cs.cc.mu.Lock()
2223
+ cs.startedWrite = true
2224
+ cs.cc.mu.Unlock()
2225
+ resc <- cs.writeRequestBody(body, cs.req.Body)
2226
+ }
2227
+ s.delay = t.expectContinueTimeout()
2228
+ if s.delay == 0 ||
2229
+ !httplex.HeaderValuesContainsToken(
2230
+ cs.req.Header["Expect"],
2231
+ "100-continue") {
2232
+ return
2233
+ }
2234
+ s.fnonce = new(sync.Once)
2235
+
2236
+ // Arm the timer with a very large duration, which we'll
2237
+ // intentionally lower later. It has to be large now because
2238
+ // we need a handle to it before writing the headers, but the
2239
+ // s.delay value is defined to not start until after the
2240
+ // request headers were written.
2241
+ const hugeDuration = 365 * 24 * time.Hour
2242
+ s.timer = time.AfterFunc(hugeDuration, func() {
2243
+ s.fnonce.Do(s.fn)
2244
+ })
2245
+ return
2246
+ }
2247
+
2248
+ func (s bodyWriterState) cancel() {
2249
+ if s.timer != nil {
2250
+ s.timer.Stop()
2251
+ }
2252
+ }
2253
+
2254
+ func (s bodyWriterState) on100() {
2255
+ if s.timer == nil {
2256
+ // If we didn't do a delayed write, ignore the server's
2257
+ // bogus 100 continue response.
2258
+ return
2259
+ }
2260
+ s.timer.Stop()
2261
+ go func() { s.fnonce.Do(s.fn) }()
2262
+ }
2263
+
2264
+ // scheduleBodyWrite starts writing the body, either immediately (in
2265
+ // the common case) or after the delay timeout. It should not be
2266
+ // called until after the headers have been written.
2267
+ func (s bodyWriterState) scheduleBodyWrite() {
2268
+ if s.timer == nil {
2269
+ // We're not doing a delayed write (see
2270
+ // getBodyWriterState), so just start the writing
2271
+ // goroutine immediately.
2272
+ go s.fn()
2273
+ return
2274
+ }
2275
+ traceWait100Continue(s.cs.trace)
2276
+ if s.timer.Stop() {
2277
+ s.timer.Reset(s.delay)
2278
+ }
2279
+ }
2280
+
2281
+ // isConnectionCloseRequest reports whether req should use its own
2282
+ // connection for a single request and then close the connection.
2283
+ func isConnectionCloseRequest(req *http.Request) bool {
2284
+ return req.Close || httplex.HeaderValuesContainsToken(req.Header["Connection"], "close")
2285
+ }