ires 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
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,24 @@
1
+ // Copyright 2014 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
+ package http2
6
+
7
+ import "testing"
8
+
9
+ func TestErrCodeString(t *testing.T) {
10
+ tests := []struct {
11
+ err ErrCode
12
+ want string
13
+ }{
14
+ {ErrCodeProtocol, "PROTOCOL_ERROR"},
15
+ {0xd, "HTTP_1_1_REQUIRED"},
16
+ {0xf, "unknown error code 0xf"},
17
+ }
18
+ for i, tt := range tests {
19
+ got := tt.err.String()
20
+ if got != tt.want {
21
+ t.Errorf("%d. Error = %q; want %q", i, got, tt.want)
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,50 @@
1
+ // Copyright 2014 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
+ // Flow control
6
+
7
+ package http2
8
+
9
+ // flow is the flow control window's size.
10
+ type flow struct {
11
+ // n is the number of DATA bytes we're allowed to send.
12
+ // A flow is kept both on a conn and a per-stream.
13
+ n int32
14
+
15
+ // conn points to the shared connection-level flow that is
16
+ // shared by all streams on that conn. It is nil for the flow
17
+ // that's on the conn directly.
18
+ conn *flow
19
+ }
20
+
21
+ func (f *flow) setConnFlow(cf *flow) { f.conn = cf }
22
+
23
+ func (f *flow) available() int32 {
24
+ n := f.n
25
+ if f.conn != nil && f.conn.n < n {
26
+ n = f.conn.n
27
+ }
28
+ return n
29
+ }
30
+
31
+ func (f *flow) take(n int32) {
32
+ if n > f.available() {
33
+ panic("internal error: took too much")
34
+ }
35
+ f.n -= n
36
+ if f.conn != nil {
37
+ f.conn.n -= n
38
+ }
39
+ }
40
+
41
+ // add adds n bytes (positive or negative) to the flow control window.
42
+ // It returns false if the sum would exceed 2^31-1.
43
+ func (f *flow) add(n int32) bool {
44
+ remain := (1<<31 - 1) - f.n
45
+ if n > remain {
46
+ return false
47
+ }
48
+ f.n += n
49
+ return true
50
+ }
@@ -0,0 +1,53 @@
1
+ // Copyright 2014 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
+ package http2
6
+
7
+ import "testing"
8
+
9
+ func TestFlow(t *testing.T) {
10
+ var st flow
11
+ var conn flow
12
+ st.add(3)
13
+ conn.add(2)
14
+
15
+ if got, want := st.available(), int32(3); got != want {
16
+ t.Errorf("available = %d; want %d", got, want)
17
+ }
18
+ st.setConnFlow(&conn)
19
+ if got, want := st.available(), int32(2); got != want {
20
+ t.Errorf("after parent setup, available = %d; want %d", got, want)
21
+ }
22
+
23
+ st.take(2)
24
+ if got, want := conn.available(), int32(0); got != want {
25
+ t.Errorf("after taking 2, conn = %d; want %d", got, want)
26
+ }
27
+ if got, want := st.available(), int32(0); got != want {
28
+ t.Errorf("after taking 2, stream = %d; want %d", got, want)
29
+ }
30
+ }
31
+
32
+ func TestFlowAdd(t *testing.T) {
33
+ var f flow
34
+ if !f.add(1) {
35
+ t.Fatal("failed to add 1")
36
+ }
37
+ if !f.add(-1) {
38
+ t.Fatal("failed to add -1")
39
+ }
40
+ if got, want := f.available(), int32(0); got != want {
41
+ t.Fatalf("size = %d; want %d", got, want)
42
+ }
43
+ if !f.add(1<<31 - 1) {
44
+ t.Fatal("failed to add 2^31-1")
45
+ }
46
+ if got, want := f.available(), int32(1<<31-1); got != want {
47
+ t.Fatalf("size = %d; want %d", got, want)
48
+ }
49
+ if f.add(1) {
50
+ t.Fatal("adding 1 to max shouldn't be allowed")
51
+ }
52
+
53
+ }
@@ -0,0 +1,1579 @@
1
+ // Copyright 2014 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
+ package http2
6
+
7
+ import (
8
+ "bytes"
9
+ "encoding/binary"
10
+ "errors"
11
+ "fmt"
12
+ "io"
13
+ "log"
14
+ "strings"
15
+ "sync"
16
+
17
+ "golang.org/x/net/http2/hpack"
18
+ "golang.org/x/net/lex/httplex"
19
+ )
20
+
21
+ const frameHeaderLen = 9
22
+
23
+ var padZeros = make([]byte, 255) // zeros for padding
24
+
25
+ // A FrameType is a registered frame type as defined in
26
+ // http://http2.github.io/http2-spec/#rfc.section.11.2
27
+ type FrameType uint8
28
+
29
+ const (
30
+ FrameData FrameType = 0x0
31
+ FrameHeaders FrameType = 0x1
32
+ FramePriority FrameType = 0x2
33
+ FrameRSTStream FrameType = 0x3
34
+ FrameSettings FrameType = 0x4
35
+ FramePushPromise FrameType = 0x5
36
+ FramePing FrameType = 0x6
37
+ FrameGoAway FrameType = 0x7
38
+ FrameWindowUpdate FrameType = 0x8
39
+ FrameContinuation FrameType = 0x9
40
+ )
41
+
42
+ var frameName = map[FrameType]string{
43
+ FrameData: "DATA",
44
+ FrameHeaders: "HEADERS",
45
+ FramePriority: "PRIORITY",
46
+ FrameRSTStream: "RST_STREAM",
47
+ FrameSettings: "SETTINGS",
48
+ FramePushPromise: "PUSH_PROMISE",
49
+ FramePing: "PING",
50
+ FrameGoAway: "GOAWAY",
51
+ FrameWindowUpdate: "WINDOW_UPDATE",
52
+ FrameContinuation: "CONTINUATION",
53
+ }
54
+
55
+ func (t FrameType) String() string {
56
+ if s, ok := frameName[t]; ok {
57
+ return s
58
+ }
59
+ return fmt.Sprintf("UNKNOWN_FRAME_TYPE_%d", uint8(t))
60
+ }
61
+
62
+ // Flags is a bitmask of HTTP/2 flags.
63
+ // The meaning of flags varies depending on the frame type.
64
+ type Flags uint8
65
+
66
+ // Has reports whether f contains all (0 or more) flags in v.
67
+ func (f Flags) Has(v Flags) bool {
68
+ return (f & v) == v
69
+ }
70
+
71
+ // Frame-specific FrameHeader flag bits.
72
+ const (
73
+ // Data Frame
74
+ FlagDataEndStream Flags = 0x1
75
+ FlagDataPadded Flags = 0x8
76
+
77
+ // Headers Frame
78
+ FlagHeadersEndStream Flags = 0x1
79
+ FlagHeadersEndHeaders Flags = 0x4
80
+ FlagHeadersPadded Flags = 0x8
81
+ FlagHeadersPriority Flags = 0x20
82
+
83
+ // Settings Frame
84
+ FlagSettingsAck Flags = 0x1
85
+
86
+ // Ping Frame
87
+ FlagPingAck Flags = 0x1
88
+
89
+ // Continuation Frame
90
+ FlagContinuationEndHeaders Flags = 0x4
91
+
92
+ FlagPushPromiseEndHeaders Flags = 0x4
93
+ FlagPushPromisePadded Flags = 0x8
94
+ )
95
+
96
+ var flagName = map[FrameType]map[Flags]string{
97
+ FrameData: {
98
+ FlagDataEndStream: "END_STREAM",
99
+ FlagDataPadded: "PADDED",
100
+ },
101
+ FrameHeaders: {
102
+ FlagHeadersEndStream: "END_STREAM",
103
+ FlagHeadersEndHeaders: "END_HEADERS",
104
+ FlagHeadersPadded: "PADDED",
105
+ FlagHeadersPriority: "PRIORITY",
106
+ },
107
+ FrameSettings: {
108
+ FlagSettingsAck: "ACK",
109
+ },
110
+ FramePing: {
111
+ FlagPingAck: "ACK",
112
+ },
113
+ FrameContinuation: {
114
+ FlagContinuationEndHeaders: "END_HEADERS",
115
+ },
116
+ FramePushPromise: {
117
+ FlagPushPromiseEndHeaders: "END_HEADERS",
118
+ FlagPushPromisePadded: "PADDED",
119
+ },
120
+ }
121
+
122
+ // a frameParser parses a frame given its FrameHeader and payload
123
+ // bytes. The length of payload will always equal fh.Length (which
124
+ // might be 0).
125
+ type frameParser func(fc *frameCache, fh FrameHeader, payload []byte) (Frame, error)
126
+
127
+ var frameParsers = map[FrameType]frameParser{
128
+ FrameData: parseDataFrame,
129
+ FrameHeaders: parseHeadersFrame,
130
+ FramePriority: parsePriorityFrame,
131
+ FrameRSTStream: parseRSTStreamFrame,
132
+ FrameSettings: parseSettingsFrame,
133
+ FramePushPromise: parsePushPromise,
134
+ FramePing: parsePingFrame,
135
+ FrameGoAway: parseGoAwayFrame,
136
+ FrameWindowUpdate: parseWindowUpdateFrame,
137
+ FrameContinuation: parseContinuationFrame,
138
+ }
139
+
140
+ func typeFrameParser(t FrameType) frameParser {
141
+ if f := frameParsers[t]; f != nil {
142
+ return f
143
+ }
144
+ return parseUnknownFrame
145
+ }
146
+
147
+ // A FrameHeader is the 9 byte header of all HTTP/2 frames.
148
+ //
149
+ // See http://http2.github.io/http2-spec/#FrameHeader
150
+ type FrameHeader struct {
151
+ valid bool // caller can access []byte fields in the Frame
152
+
153
+ // Type is the 1 byte frame type. There are ten standard frame
154
+ // types, but extension frame types may be written by WriteRawFrame
155
+ // and will be returned by ReadFrame (as UnknownFrame).
156
+ Type FrameType
157
+
158
+ // Flags are the 1 byte of 8 potential bit flags per frame.
159
+ // They are specific to the frame type.
160
+ Flags Flags
161
+
162
+ // Length is the length of the frame, not including the 9 byte header.
163
+ // The maximum size is one byte less than 16MB (uint24), but only
164
+ // frames up to 16KB are allowed without peer agreement.
165
+ Length uint32
166
+
167
+ // StreamID is which stream this frame is for. Certain frames
168
+ // are not stream-specific, in which case this field is 0.
169
+ StreamID uint32
170
+ }
171
+
172
+ // Header returns h. It exists so FrameHeaders can be embedded in other
173
+ // specific frame types and implement the Frame interface.
174
+ func (h FrameHeader) Header() FrameHeader { return h }
175
+
176
+ func (h FrameHeader) String() string {
177
+ var buf bytes.Buffer
178
+ buf.WriteString("[FrameHeader ")
179
+ h.writeDebug(&buf)
180
+ buf.WriteByte(']')
181
+ return buf.String()
182
+ }
183
+
184
+ func (h FrameHeader) writeDebug(buf *bytes.Buffer) {
185
+ buf.WriteString(h.Type.String())
186
+ if h.Flags != 0 {
187
+ buf.WriteString(" flags=")
188
+ set := 0
189
+ for i := uint8(0); i < 8; i++ {
190
+ if h.Flags&(1<<i) == 0 {
191
+ continue
192
+ }
193
+ set++
194
+ if set > 1 {
195
+ buf.WriteByte('|')
196
+ }
197
+ name := flagName[h.Type][Flags(1<<i)]
198
+ if name != "" {
199
+ buf.WriteString(name)
200
+ } else {
201
+ fmt.Fprintf(buf, "0x%x", 1<<i)
202
+ }
203
+ }
204
+ }
205
+ if h.StreamID != 0 {
206
+ fmt.Fprintf(buf, " stream=%d", h.StreamID)
207
+ }
208
+ fmt.Fprintf(buf, " len=%d", h.Length)
209
+ }
210
+
211
+ func (h *FrameHeader) checkValid() {
212
+ if !h.valid {
213
+ panic("Frame accessor called on non-owned Frame")
214
+ }
215
+ }
216
+
217
+ func (h *FrameHeader) invalidate() { h.valid = false }
218
+
219
+ // frame header bytes.
220
+ // Used only by ReadFrameHeader.
221
+ var fhBytes = sync.Pool{
222
+ New: func() interface{} {
223
+ buf := make([]byte, frameHeaderLen)
224
+ return &buf
225
+ },
226
+ }
227
+
228
+ // ReadFrameHeader reads 9 bytes from r and returns a FrameHeader.
229
+ // Most users should use Framer.ReadFrame instead.
230
+ func ReadFrameHeader(r io.Reader) (FrameHeader, error) {
231
+ bufp := fhBytes.Get().(*[]byte)
232
+ defer fhBytes.Put(bufp)
233
+ return readFrameHeader(*bufp, r)
234
+ }
235
+
236
+ func readFrameHeader(buf []byte, r io.Reader) (FrameHeader, error) {
237
+ _, err := io.ReadFull(r, buf[:frameHeaderLen])
238
+ if err != nil {
239
+ return FrameHeader{}, err
240
+ }
241
+ return FrameHeader{
242
+ Length: (uint32(buf[0])<<16 | uint32(buf[1])<<8 | uint32(buf[2])),
243
+ Type: FrameType(buf[3]),
244
+ Flags: Flags(buf[4]),
245
+ StreamID: binary.BigEndian.Uint32(buf[5:]) & (1<<31 - 1),
246
+ valid: true,
247
+ }, nil
248
+ }
249
+
250
+ // A Frame is the base interface implemented by all frame types.
251
+ // Callers will generally type-assert the specific frame type:
252
+ // *HeadersFrame, *SettingsFrame, *WindowUpdateFrame, etc.
253
+ //
254
+ // Frames are only valid until the next call to Framer.ReadFrame.
255
+ type Frame interface {
256
+ Header() FrameHeader
257
+
258
+ // invalidate is called by Framer.ReadFrame to make this
259
+ // frame's buffers as being invalid, since the subsequent
260
+ // frame will reuse them.
261
+ invalidate()
262
+ }
263
+
264
+ // A Framer reads and writes Frames.
265
+ type Framer struct {
266
+ r io.Reader
267
+ lastFrame Frame
268
+ errDetail error
269
+
270
+ // lastHeaderStream is non-zero if the last frame was an
271
+ // unfinished HEADERS/CONTINUATION.
272
+ lastHeaderStream uint32
273
+
274
+ maxReadSize uint32
275
+ headerBuf [frameHeaderLen]byte
276
+
277
+ // TODO: let getReadBuf be configurable, and use a less memory-pinning
278
+ // allocator in server.go to minimize memory pinned for many idle conns.
279
+ // Will probably also need to make frame invalidation have a hook too.
280
+ getReadBuf func(size uint32) []byte
281
+ readBuf []byte // cache for default getReadBuf
282
+
283
+ maxWriteSize uint32 // zero means unlimited; TODO: implement
284
+
285
+ w io.Writer
286
+ wbuf []byte
287
+
288
+ // AllowIllegalWrites permits the Framer's Write methods to
289
+ // write frames that do not conform to the HTTP/2 spec. This
290
+ // permits using the Framer to test other HTTP/2
291
+ // implementations' conformance to the spec.
292
+ // If false, the Write methods will prefer to return an error
293
+ // rather than comply.
294
+ AllowIllegalWrites bool
295
+
296
+ // AllowIllegalReads permits the Framer's ReadFrame method
297
+ // to return non-compliant frames or frame orders.
298
+ // This is for testing and permits using the Framer to test
299
+ // other HTTP/2 implementations' conformance to the spec.
300
+ // It is not compatible with ReadMetaHeaders.
301
+ AllowIllegalReads bool
302
+
303
+ // ReadMetaHeaders if non-nil causes ReadFrame to merge
304
+ // HEADERS and CONTINUATION frames together and return
305
+ // MetaHeadersFrame instead.
306
+ ReadMetaHeaders *hpack.Decoder
307
+
308
+ // MaxHeaderListSize is the http2 MAX_HEADER_LIST_SIZE.
309
+ // It's used only if ReadMetaHeaders is set; 0 means a sane default
310
+ // (currently 16MB)
311
+ // If the limit is hit, MetaHeadersFrame.Truncated is set true.
312
+ MaxHeaderListSize uint32
313
+
314
+ // TODO: track which type of frame & with which flags was sent
315
+ // last. Then return an error (unless AllowIllegalWrites) if
316
+ // we're in the middle of a header block and a
317
+ // non-Continuation or Continuation on a different stream is
318
+ // attempted to be written.
319
+
320
+ logReads, logWrites bool
321
+
322
+ debugFramer *Framer // only use for logging written writes
323
+ debugFramerBuf *bytes.Buffer
324
+ debugReadLoggerf func(string, ...interface{})
325
+ debugWriteLoggerf func(string, ...interface{})
326
+
327
+ frameCache *frameCache // nil if frames aren't reused (default)
328
+ }
329
+
330
+ func (fr *Framer) maxHeaderListSize() uint32 {
331
+ if fr.MaxHeaderListSize == 0 {
332
+ return 16 << 20 // sane default, per docs
333
+ }
334
+ return fr.MaxHeaderListSize
335
+ }
336
+
337
+ func (f *Framer) startWrite(ftype FrameType, flags Flags, streamID uint32) {
338
+ // Write the FrameHeader.
339
+ f.wbuf = append(f.wbuf[:0],
340
+ 0, // 3 bytes of length, filled in in endWrite
341
+ 0,
342
+ 0,
343
+ byte(ftype),
344
+ byte(flags),
345
+ byte(streamID>>24),
346
+ byte(streamID>>16),
347
+ byte(streamID>>8),
348
+ byte(streamID))
349
+ }
350
+
351
+ func (f *Framer) endWrite() error {
352
+ // Now that we know the final size, fill in the FrameHeader in
353
+ // the space previously reserved for it. Abuse append.
354
+ length := len(f.wbuf) - frameHeaderLen
355
+ if length >= (1 << 24) {
356
+ return ErrFrameTooLarge
357
+ }
358
+ _ = append(f.wbuf[:0],
359
+ byte(length>>16),
360
+ byte(length>>8),
361
+ byte(length))
362
+ if f.logWrites {
363
+ f.logWrite()
364
+ }
365
+
366
+ n, err := f.w.Write(f.wbuf)
367
+ if err == nil && n != len(f.wbuf) {
368
+ err = io.ErrShortWrite
369
+ }
370
+ return err
371
+ }
372
+
373
+ func (f *Framer) logWrite() {
374
+ if f.debugFramer == nil {
375
+ f.debugFramerBuf = new(bytes.Buffer)
376
+ f.debugFramer = NewFramer(nil, f.debugFramerBuf)
377
+ f.debugFramer.logReads = false // we log it ourselves, saying "wrote" below
378
+ // Let us read anything, even if we accidentally wrote it
379
+ // in the wrong order:
380
+ f.debugFramer.AllowIllegalReads = true
381
+ }
382
+ f.debugFramerBuf.Write(f.wbuf)
383
+ fr, err := f.debugFramer.ReadFrame()
384
+ if err != nil {
385
+ f.debugWriteLoggerf("http2: Framer %p: failed to decode just-written frame", f)
386
+ return
387
+ }
388
+ f.debugWriteLoggerf("http2: Framer %p: wrote %v", f, summarizeFrame(fr))
389
+ }
390
+
391
+ func (f *Framer) writeByte(v byte) { f.wbuf = append(f.wbuf, v) }
392
+ func (f *Framer) writeBytes(v []byte) { f.wbuf = append(f.wbuf, v...) }
393
+ func (f *Framer) writeUint16(v uint16) { f.wbuf = append(f.wbuf, byte(v>>8), byte(v)) }
394
+ func (f *Framer) writeUint32(v uint32) {
395
+ f.wbuf = append(f.wbuf, byte(v>>24), byte(v>>16), byte(v>>8), byte(v))
396
+ }
397
+
398
+ const (
399
+ minMaxFrameSize = 1 << 14
400
+ maxFrameSize = 1<<24 - 1
401
+ )
402
+
403
+ // SetReuseFrames allows the Framer to reuse Frames.
404
+ // If called on a Framer, Frames returned by calls to ReadFrame are only
405
+ // valid until the next call to ReadFrame.
406
+ func (fr *Framer) SetReuseFrames() {
407
+ if fr.frameCache != nil {
408
+ return
409
+ }
410
+ fr.frameCache = &frameCache{}
411
+ }
412
+
413
+ type frameCache struct {
414
+ dataFrame DataFrame
415
+ }
416
+
417
+ func (fc *frameCache) getDataFrame() *DataFrame {
418
+ if fc == nil {
419
+ return &DataFrame{}
420
+ }
421
+ return &fc.dataFrame
422
+ }
423
+
424
+ // NewFramer returns a Framer that writes frames to w and reads them from r.
425
+ func NewFramer(w io.Writer, r io.Reader) *Framer {
426
+ fr := &Framer{
427
+ w: w,
428
+ r: r,
429
+ logReads: logFrameReads,
430
+ logWrites: logFrameWrites,
431
+ debugReadLoggerf: log.Printf,
432
+ debugWriteLoggerf: log.Printf,
433
+ }
434
+ fr.getReadBuf = func(size uint32) []byte {
435
+ if cap(fr.readBuf) >= int(size) {
436
+ return fr.readBuf[:size]
437
+ }
438
+ fr.readBuf = make([]byte, size)
439
+ return fr.readBuf
440
+ }
441
+ fr.SetMaxReadFrameSize(maxFrameSize)
442
+ return fr
443
+ }
444
+
445
+ // SetMaxReadFrameSize sets the maximum size of a frame
446
+ // that will be read by a subsequent call to ReadFrame.
447
+ // It is the caller's responsibility to advertise this
448
+ // limit with a SETTINGS frame.
449
+ func (fr *Framer) SetMaxReadFrameSize(v uint32) {
450
+ if v > maxFrameSize {
451
+ v = maxFrameSize
452
+ }
453
+ fr.maxReadSize = v
454
+ }
455
+
456
+ // ErrorDetail returns a more detailed error of the last error
457
+ // returned by Framer.ReadFrame. For instance, if ReadFrame
458
+ // returns a StreamError with code PROTOCOL_ERROR, ErrorDetail
459
+ // will say exactly what was invalid. ErrorDetail is not guaranteed
460
+ // to return a non-nil value and like the rest of the http2 package,
461
+ // its return value is not protected by an API compatibility promise.
462
+ // ErrorDetail is reset after the next call to ReadFrame.
463
+ func (fr *Framer) ErrorDetail() error {
464
+ return fr.errDetail
465
+ }
466
+
467
+ // ErrFrameTooLarge is returned from Framer.ReadFrame when the peer
468
+ // sends a frame that is larger than declared with SetMaxReadFrameSize.
469
+ var ErrFrameTooLarge = errors.New("http2: frame too large")
470
+
471
+ // terminalReadFrameError reports whether err is an unrecoverable
472
+ // error from ReadFrame and no other frames should be read.
473
+ func terminalReadFrameError(err error) bool {
474
+ if _, ok := err.(StreamError); ok {
475
+ return false
476
+ }
477
+ return err != nil
478
+ }
479
+
480
+ // ReadFrame reads a single frame. The returned Frame is only valid
481
+ // until the next call to ReadFrame.
482
+ //
483
+ // If the frame is larger than previously set with SetMaxReadFrameSize, the
484
+ // returned error is ErrFrameTooLarge. Other errors may be of type
485
+ // ConnectionError, StreamError, or anything else from the underlying
486
+ // reader.
487
+ func (fr *Framer) ReadFrame() (Frame, error) {
488
+ fr.errDetail = nil
489
+ if fr.lastFrame != nil {
490
+ fr.lastFrame.invalidate()
491
+ }
492
+ fh, err := readFrameHeader(fr.headerBuf[:], fr.r)
493
+ if err != nil {
494
+ return nil, err
495
+ }
496
+ if fh.Length > fr.maxReadSize {
497
+ return nil, ErrFrameTooLarge
498
+ }
499
+ payload := fr.getReadBuf(fh.Length)
500
+ if _, err := io.ReadFull(fr.r, payload); err != nil {
501
+ return nil, err
502
+ }
503
+ f, err := typeFrameParser(fh.Type)(fr.frameCache, fh, payload)
504
+ if err != nil {
505
+ if ce, ok := err.(connError); ok {
506
+ return nil, fr.connError(ce.Code, ce.Reason)
507
+ }
508
+ return nil, err
509
+ }
510
+ if err := fr.checkFrameOrder(f); err != nil {
511
+ return nil, err
512
+ }
513
+ if fr.logReads {
514
+ fr.debugReadLoggerf("http2: Framer %p: read %v", fr, summarizeFrame(f))
515
+ }
516
+ if fh.Type == FrameHeaders && fr.ReadMetaHeaders != nil {
517
+ return fr.readMetaFrame(f.(*HeadersFrame))
518
+ }
519
+ return f, nil
520
+ }
521
+
522
+ // connError returns ConnectionError(code) but first
523
+ // stashes away a public reason to the caller can optionally relay it
524
+ // to the peer before hanging up on them. This might help others debug
525
+ // their implementations.
526
+ func (fr *Framer) connError(code ErrCode, reason string) error {
527
+ fr.errDetail = errors.New(reason)
528
+ return ConnectionError(code)
529
+ }
530
+
531
+ // checkFrameOrder reports an error if f is an invalid frame to return
532
+ // next from ReadFrame. Mostly it checks whether HEADERS and
533
+ // CONTINUATION frames are contiguous.
534
+ func (fr *Framer) checkFrameOrder(f Frame) error {
535
+ last := fr.lastFrame
536
+ fr.lastFrame = f
537
+ if fr.AllowIllegalReads {
538
+ return nil
539
+ }
540
+
541
+ fh := f.Header()
542
+ if fr.lastHeaderStream != 0 {
543
+ if fh.Type != FrameContinuation {
544
+ return fr.connError(ErrCodeProtocol,
545
+ fmt.Sprintf("got %s for stream %d; expected CONTINUATION following %s for stream %d",
546
+ fh.Type, fh.StreamID,
547
+ last.Header().Type, fr.lastHeaderStream))
548
+ }
549
+ if fh.StreamID != fr.lastHeaderStream {
550
+ return fr.connError(ErrCodeProtocol,
551
+ fmt.Sprintf("got CONTINUATION for stream %d; expected stream %d",
552
+ fh.StreamID, fr.lastHeaderStream))
553
+ }
554
+ } else if fh.Type == FrameContinuation {
555
+ return fr.connError(ErrCodeProtocol, fmt.Sprintf("unexpected CONTINUATION for stream %d", fh.StreamID))
556
+ }
557
+
558
+ switch fh.Type {
559
+ case FrameHeaders, FrameContinuation:
560
+ if fh.Flags.Has(FlagHeadersEndHeaders) {
561
+ fr.lastHeaderStream = 0
562
+ } else {
563
+ fr.lastHeaderStream = fh.StreamID
564
+ }
565
+ }
566
+
567
+ return nil
568
+ }
569
+
570
+ // A DataFrame conveys arbitrary, variable-length sequences of octets
571
+ // associated with a stream.
572
+ // See http://http2.github.io/http2-spec/#rfc.section.6.1
573
+ type DataFrame struct {
574
+ FrameHeader
575
+ data []byte
576
+ }
577
+
578
+ func (f *DataFrame) StreamEnded() bool {
579
+ return f.FrameHeader.Flags.Has(FlagDataEndStream)
580
+ }
581
+
582
+ // Data returns the frame's data octets, not including any padding
583
+ // size byte or padding suffix bytes.
584
+ // The caller must not retain the returned memory past the next
585
+ // call to ReadFrame.
586
+ func (f *DataFrame) Data() []byte {
587
+ f.checkValid()
588
+ return f.data
589
+ }
590
+
591
+ func parseDataFrame(fc *frameCache, fh FrameHeader, payload []byte) (Frame, error) {
592
+ if fh.StreamID == 0 {
593
+ // DATA frames MUST be associated with a stream. If a
594
+ // DATA frame is received whose stream identifier
595
+ // field is 0x0, the recipient MUST respond with a
596
+ // connection error (Section 5.4.1) of type
597
+ // PROTOCOL_ERROR.
598
+ return nil, connError{ErrCodeProtocol, "DATA frame with stream ID 0"}
599
+ }
600
+ f := fc.getDataFrame()
601
+ f.FrameHeader = fh
602
+
603
+ var padSize byte
604
+ if fh.Flags.Has(FlagDataPadded) {
605
+ var err error
606
+ payload, padSize, err = readByte(payload)
607
+ if err != nil {
608
+ return nil, err
609
+ }
610
+ }
611
+ if int(padSize) > len(payload) {
612
+ // If the length of the padding is greater than the
613
+ // length of the frame payload, the recipient MUST
614
+ // treat this as a connection error.
615
+ // Filed: https://github.com/http2/http2-spec/issues/610
616
+ return nil, connError{ErrCodeProtocol, "pad size larger than data payload"}
617
+ }
618
+ f.data = payload[:len(payload)-int(padSize)]
619
+ return f, nil
620
+ }
621
+
622
+ var (
623
+ errStreamID = errors.New("invalid stream ID")
624
+ errDepStreamID = errors.New("invalid dependent stream ID")
625
+ errPadLength = errors.New("pad length too large")
626
+ errPadBytes = errors.New("padding bytes must all be zeros unless AllowIllegalWrites is enabled")
627
+ )
628
+
629
+ func validStreamIDOrZero(streamID uint32) bool {
630
+ return streamID&(1<<31) == 0
631
+ }
632
+
633
+ func validStreamID(streamID uint32) bool {
634
+ return streamID != 0 && streamID&(1<<31) == 0
635
+ }
636
+
637
+ // WriteData writes a DATA frame.
638
+ //
639
+ // It will perform exactly one Write to the underlying Writer.
640
+ // It is the caller's responsibility not to violate the maximum frame size
641
+ // and to not call other Write methods concurrently.
642
+ func (f *Framer) WriteData(streamID uint32, endStream bool, data []byte) error {
643
+ return f.WriteDataPadded(streamID, endStream, data, nil)
644
+ }
645
+
646
+ // WriteData writes a DATA frame with optional padding.
647
+ //
648
+ // If pad is nil, the padding bit is not sent.
649
+ // The length of pad must not exceed 255 bytes.
650
+ // The bytes of pad must all be zero, unless f.AllowIllegalWrites is set.
651
+ //
652
+ // It will perform exactly one Write to the underlying Writer.
653
+ // It is the caller's responsibility not to violate the maximum frame size
654
+ // and to not call other Write methods concurrently.
655
+ func (f *Framer) WriteDataPadded(streamID uint32, endStream bool, data, pad []byte) error {
656
+ if !validStreamID(streamID) && !f.AllowIllegalWrites {
657
+ return errStreamID
658
+ }
659
+ if len(pad) > 0 {
660
+ if len(pad) > 255 {
661
+ return errPadLength
662
+ }
663
+ if !f.AllowIllegalWrites {
664
+ for _, b := range pad {
665
+ if b != 0 {
666
+ // "Padding octets MUST be set to zero when sending."
667
+ return errPadBytes
668
+ }
669
+ }
670
+ }
671
+ }
672
+ var flags Flags
673
+ if endStream {
674
+ flags |= FlagDataEndStream
675
+ }
676
+ if pad != nil {
677
+ flags |= FlagDataPadded
678
+ }
679
+ f.startWrite(FrameData, flags, streamID)
680
+ if pad != nil {
681
+ f.wbuf = append(f.wbuf, byte(len(pad)))
682
+ }
683
+ f.wbuf = append(f.wbuf, data...)
684
+ f.wbuf = append(f.wbuf, pad...)
685
+ return f.endWrite()
686
+ }
687
+
688
+ // A SettingsFrame conveys configuration parameters that affect how
689
+ // endpoints communicate, such as preferences and constraints on peer
690
+ // behavior.
691
+ //
692
+ // See http://http2.github.io/http2-spec/#SETTINGS
693
+ type SettingsFrame struct {
694
+ FrameHeader
695
+ p []byte
696
+ }
697
+
698
+ func parseSettingsFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) {
699
+ if fh.Flags.Has(FlagSettingsAck) && fh.Length > 0 {
700
+ // When this (ACK 0x1) bit is set, the payload of the
701
+ // SETTINGS frame MUST be empty. Receipt of a
702
+ // SETTINGS frame with the ACK flag set and a length
703
+ // field value other than 0 MUST be treated as a
704
+ // connection error (Section 5.4.1) of type
705
+ // FRAME_SIZE_ERROR.
706
+ return nil, ConnectionError(ErrCodeFrameSize)
707
+ }
708
+ if fh.StreamID != 0 {
709
+ // SETTINGS frames always apply to a connection,
710
+ // never a single stream. The stream identifier for a
711
+ // SETTINGS frame MUST be zero (0x0). If an endpoint
712
+ // receives a SETTINGS frame whose stream identifier
713
+ // field is anything other than 0x0, the endpoint MUST
714
+ // respond with a connection error (Section 5.4.1) of
715
+ // type PROTOCOL_ERROR.
716
+ return nil, ConnectionError(ErrCodeProtocol)
717
+ }
718
+ if len(p)%6 != 0 {
719
+ // Expecting even number of 6 byte settings.
720
+ return nil, ConnectionError(ErrCodeFrameSize)
721
+ }
722
+ f := &SettingsFrame{FrameHeader: fh, p: p}
723
+ if v, ok := f.Value(SettingInitialWindowSize); ok && v > (1<<31)-1 {
724
+ // Values above the maximum flow control window size of 2^31 - 1 MUST
725
+ // be treated as a connection error (Section 5.4.1) of type
726
+ // FLOW_CONTROL_ERROR.
727
+ return nil, ConnectionError(ErrCodeFlowControl)
728
+ }
729
+ return f, nil
730
+ }
731
+
732
+ func (f *SettingsFrame) IsAck() bool {
733
+ return f.FrameHeader.Flags.Has(FlagSettingsAck)
734
+ }
735
+
736
+ func (f *SettingsFrame) Value(s SettingID) (v uint32, ok bool) {
737
+ f.checkValid()
738
+ buf := f.p
739
+ for len(buf) > 0 {
740
+ settingID := SettingID(binary.BigEndian.Uint16(buf[:2]))
741
+ if settingID == s {
742
+ return binary.BigEndian.Uint32(buf[2:6]), true
743
+ }
744
+ buf = buf[6:]
745
+ }
746
+ return 0, false
747
+ }
748
+
749
+ // ForeachSetting runs fn for each setting.
750
+ // It stops and returns the first error.
751
+ func (f *SettingsFrame) ForeachSetting(fn func(Setting) error) error {
752
+ f.checkValid()
753
+ buf := f.p
754
+ for len(buf) > 0 {
755
+ if err := fn(Setting{
756
+ SettingID(binary.BigEndian.Uint16(buf[:2])),
757
+ binary.BigEndian.Uint32(buf[2:6]),
758
+ }); err != nil {
759
+ return err
760
+ }
761
+ buf = buf[6:]
762
+ }
763
+ return nil
764
+ }
765
+
766
+ // WriteSettings writes a SETTINGS frame with zero or more settings
767
+ // specified and the ACK bit not set.
768
+ //
769
+ // It will perform exactly one Write to the underlying Writer.
770
+ // It is the caller's responsibility to not call other Write methods concurrently.
771
+ func (f *Framer) WriteSettings(settings ...Setting) error {
772
+ f.startWrite(FrameSettings, 0, 0)
773
+ for _, s := range settings {
774
+ f.writeUint16(uint16(s.ID))
775
+ f.writeUint32(s.Val)
776
+ }
777
+ return f.endWrite()
778
+ }
779
+
780
+ // WriteSettingsAck writes an empty SETTINGS frame with the ACK bit set.
781
+ //
782
+ // It will perform exactly one Write to the underlying Writer.
783
+ // It is the caller's responsibility to not call other Write methods concurrently.
784
+ func (f *Framer) WriteSettingsAck() error {
785
+ f.startWrite(FrameSettings, FlagSettingsAck, 0)
786
+ return f.endWrite()
787
+ }
788
+
789
+ // A PingFrame is a mechanism for measuring a minimal round trip time
790
+ // from the sender, as well as determining whether an idle connection
791
+ // is still functional.
792
+ // See http://http2.github.io/http2-spec/#rfc.section.6.7
793
+ type PingFrame struct {
794
+ FrameHeader
795
+ Data [8]byte
796
+ }
797
+
798
+ func (f *PingFrame) IsAck() bool { return f.Flags.Has(FlagPingAck) }
799
+
800
+ func parsePingFrame(_ *frameCache, fh FrameHeader, payload []byte) (Frame, error) {
801
+ if len(payload) != 8 {
802
+ return nil, ConnectionError(ErrCodeFrameSize)
803
+ }
804
+ if fh.StreamID != 0 {
805
+ return nil, ConnectionError(ErrCodeProtocol)
806
+ }
807
+ f := &PingFrame{FrameHeader: fh}
808
+ copy(f.Data[:], payload)
809
+ return f, nil
810
+ }
811
+
812
+ func (f *Framer) WritePing(ack bool, data [8]byte) error {
813
+ var flags Flags
814
+ if ack {
815
+ flags = FlagPingAck
816
+ }
817
+ f.startWrite(FramePing, flags, 0)
818
+ f.writeBytes(data[:])
819
+ return f.endWrite()
820
+ }
821
+
822
+ // A GoAwayFrame informs the remote peer to stop creating streams on this connection.
823
+ // See http://http2.github.io/http2-spec/#rfc.section.6.8
824
+ type GoAwayFrame struct {
825
+ FrameHeader
826
+ LastStreamID uint32
827
+ ErrCode ErrCode
828
+ debugData []byte
829
+ }
830
+
831
+ // DebugData returns any debug data in the GOAWAY frame. Its contents
832
+ // are not defined.
833
+ // The caller must not retain the returned memory past the next
834
+ // call to ReadFrame.
835
+ func (f *GoAwayFrame) DebugData() []byte {
836
+ f.checkValid()
837
+ return f.debugData
838
+ }
839
+
840
+ func parseGoAwayFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) {
841
+ if fh.StreamID != 0 {
842
+ return nil, ConnectionError(ErrCodeProtocol)
843
+ }
844
+ if len(p) < 8 {
845
+ return nil, ConnectionError(ErrCodeFrameSize)
846
+ }
847
+ return &GoAwayFrame{
848
+ FrameHeader: fh,
849
+ LastStreamID: binary.BigEndian.Uint32(p[:4]) & (1<<31 - 1),
850
+ ErrCode: ErrCode(binary.BigEndian.Uint32(p[4:8])),
851
+ debugData: p[8:],
852
+ }, nil
853
+ }
854
+
855
+ func (f *Framer) WriteGoAway(maxStreamID uint32, code ErrCode, debugData []byte) error {
856
+ f.startWrite(FrameGoAway, 0, 0)
857
+ f.writeUint32(maxStreamID & (1<<31 - 1))
858
+ f.writeUint32(uint32(code))
859
+ f.writeBytes(debugData)
860
+ return f.endWrite()
861
+ }
862
+
863
+ // An UnknownFrame is the frame type returned when the frame type is unknown
864
+ // or no specific frame type parser exists.
865
+ type UnknownFrame struct {
866
+ FrameHeader
867
+ p []byte
868
+ }
869
+
870
+ // Payload returns the frame's payload (after the header). It is not
871
+ // valid to call this method after a subsequent call to
872
+ // Framer.ReadFrame, nor is it valid to retain the returned slice.
873
+ // The memory is owned by the Framer and is invalidated when the next
874
+ // frame is read.
875
+ func (f *UnknownFrame) Payload() []byte {
876
+ f.checkValid()
877
+ return f.p
878
+ }
879
+
880
+ func parseUnknownFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) {
881
+ return &UnknownFrame{fh, p}, nil
882
+ }
883
+
884
+ // A WindowUpdateFrame is used to implement flow control.
885
+ // See http://http2.github.io/http2-spec/#rfc.section.6.9
886
+ type WindowUpdateFrame struct {
887
+ FrameHeader
888
+ Increment uint32 // never read with high bit set
889
+ }
890
+
891
+ func parseWindowUpdateFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) {
892
+ if len(p) != 4 {
893
+ return nil, ConnectionError(ErrCodeFrameSize)
894
+ }
895
+ inc := binary.BigEndian.Uint32(p[:4]) & 0x7fffffff // mask off high reserved bit
896
+ if inc == 0 {
897
+ // A receiver MUST treat the receipt of a
898
+ // WINDOW_UPDATE frame with an flow control window
899
+ // increment of 0 as a stream error (Section 5.4.2) of
900
+ // type PROTOCOL_ERROR; errors on the connection flow
901
+ // control window MUST be treated as a connection
902
+ // error (Section 5.4.1).
903
+ if fh.StreamID == 0 {
904
+ return nil, ConnectionError(ErrCodeProtocol)
905
+ }
906
+ return nil, streamError(fh.StreamID, ErrCodeProtocol)
907
+ }
908
+ return &WindowUpdateFrame{
909
+ FrameHeader: fh,
910
+ Increment: inc,
911
+ }, nil
912
+ }
913
+
914
+ // WriteWindowUpdate writes a WINDOW_UPDATE frame.
915
+ // The increment value must be between 1 and 2,147,483,647, inclusive.
916
+ // If the Stream ID is zero, the window update applies to the
917
+ // connection as a whole.
918
+ func (f *Framer) WriteWindowUpdate(streamID, incr uint32) error {
919
+ // "The legal range for the increment to the flow control window is 1 to 2^31-1 (2,147,483,647) octets."
920
+ if (incr < 1 || incr > 2147483647) && !f.AllowIllegalWrites {
921
+ return errors.New("illegal window increment value")
922
+ }
923
+ f.startWrite(FrameWindowUpdate, 0, streamID)
924
+ f.writeUint32(incr)
925
+ return f.endWrite()
926
+ }
927
+
928
+ // A HeadersFrame is used to open a stream and additionally carries a
929
+ // header block fragment.
930
+ type HeadersFrame struct {
931
+ FrameHeader
932
+
933
+ // Priority is set if FlagHeadersPriority is set in the FrameHeader.
934
+ Priority PriorityParam
935
+
936
+ headerFragBuf []byte // not owned
937
+ }
938
+
939
+ func (f *HeadersFrame) HeaderBlockFragment() []byte {
940
+ f.checkValid()
941
+ return f.headerFragBuf
942
+ }
943
+
944
+ func (f *HeadersFrame) HeadersEnded() bool {
945
+ return f.FrameHeader.Flags.Has(FlagHeadersEndHeaders)
946
+ }
947
+
948
+ func (f *HeadersFrame) StreamEnded() bool {
949
+ return f.FrameHeader.Flags.Has(FlagHeadersEndStream)
950
+ }
951
+
952
+ func (f *HeadersFrame) HasPriority() bool {
953
+ return f.FrameHeader.Flags.Has(FlagHeadersPriority)
954
+ }
955
+
956
+ func parseHeadersFrame(_ *frameCache, fh FrameHeader, p []byte) (_ Frame, err error) {
957
+ hf := &HeadersFrame{
958
+ FrameHeader: fh,
959
+ }
960
+ if fh.StreamID == 0 {
961
+ // HEADERS frames MUST be associated with a stream. If a HEADERS frame
962
+ // is received whose stream identifier field is 0x0, the recipient MUST
963
+ // respond with a connection error (Section 5.4.1) of type
964
+ // PROTOCOL_ERROR.
965
+ return nil, connError{ErrCodeProtocol, "HEADERS frame with stream ID 0"}
966
+ }
967
+ var padLength uint8
968
+ if fh.Flags.Has(FlagHeadersPadded) {
969
+ if p, padLength, err = readByte(p); err != nil {
970
+ return
971
+ }
972
+ }
973
+ if fh.Flags.Has(FlagHeadersPriority) {
974
+ var v uint32
975
+ p, v, err = readUint32(p)
976
+ if err != nil {
977
+ return nil, err
978
+ }
979
+ hf.Priority.StreamDep = v & 0x7fffffff
980
+ hf.Priority.Exclusive = (v != hf.Priority.StreamDep) // high bit was set
981
+ p, hf.Priority.Weight, err = readByte(p)
982
+ if err != nil {
983
+ return nil, err
984
+ }
985
+ }
986
+ if len(p)-int(padLength) <= 0 {
987
+ return nil, streamError(fh.StreamID, ErrCodeProtocol)
988
+ }
989
+ hf.headerFragBuf = p[:len(p)-int(padLength)]
990
+ return hf, nil
991
+ }
992
+
993
+ // HeadersFrameParam are the parameters for writing a HEADERS frame.
994
+ type HeadersFrameParam struct {
995
+ // StreamID is the required Stream ID to initiate.
996
+ StreamID uint32
997
+ // BlockFragment is part (or all) of a Header Block.
998
+ BlockFragment []byte
999
+
1000
+ // EndStream indicates that the header block is the last that
1001
+ // the endpoint will send for the identified stream. Setting
1002
+ // this flag causes the stream to enter one of "half closed"
1003
+ // states.
1004
+ EndStream bool
1005
+
1006
+ // EndHeaders indicates that this frame contains an entire
1007
+ // header block and is not followed by any
1008
+ // CONTINUATION frames.
1009
+ EndHeaders bool
1010
+
1011
+ // PadLength is the optional number of bytes of zeros to add
1012
+ // to this frame.
1013
+ PadLength uint8
1014
+
1015
+ // Priority, if non-zero, includes stream priority information
1016
+ // in the HEADER frame.
1017
+ Priority PriorityParam
1018
+ }
1019
+
1020
+ // WriteHeaders writes a single HEADERS frame.
1021
+ //
1022
+ // This is a low-level header writing method. Encoding headers and
1023
+ // splitting them into any necessary CONTINUATION frames is handled
1024
+ // elsewhere.
1025
+ //
1026
+ // It will perform exactly one Write to the underlying Writer.
1027
+ // It is the caller's responsibility to not call other Write methods concurrently.
1028
+ func (f *Framer) WriteHeaders(p HeadersFrameParam) error {
1029
+ if !validStreamID(p.StreamID) && !f.AllowIllegalWrites {
1030
+ return errStreamID
1031
+ }
1032
+ var flags Flags
1033
+ if p.PadLength != 0 {
1034
+ flags |= FlagHeadersPadded
1035
+ }
1036
+ if p.EndStream {
1037
+ flags |= FlagHeadersEndStream
1038
+ }
1039
+ if p.EndHeaders {
1040
+ flags |= FlagHeadersEndHeaders
1041
+ }
1042
+ if !p.Priority.IsZero() {
1043
+ flags |= FlagHeadersPriority
1044
+ }
1045
+ f.startWrite(FrameHeaders, flags, p.StreamID)
1046
+ if p.PadLength != 0 {
1047
+ f.writeByte(p.PadLength)
1048
+ }
1049
+ if !p.Priority.IsZero() {
1050
+ v := p.Priority.StreamDep
1051
+ if !validStreamIDOrZero(v) && !f.AllowIllegalWrites {
1052
+ return errDepStreamID
1053
+ }
1054
+ if p.Priority.Exclusive {
1055
+ v |= 1 << 31
1056
+ }
1057
+ f.writeUint32(v)
1058
+ f.writeByte(p.Priority.Weight)
1059
+ }
1060
+ f.wbuf = append(f.wbuf, p.BlockFragment...)
1061
+ f.wbuf = append(f.wbuf, padZeros[:p.PadLength]...)
1062
+ return f.endWrite()
1063
+ }
1064
+
1065
+ // A PriorityFrame specifies the sender-advised priority of a stream.
1066
+ // See http://http2.github.io/http2-spec/#rfc.section.6.3
1067
+ type PriorityFrame struct {
1068
+ FrameHeader
1069
+ PriorityParam
1070
+ }
1071
+
1072
+ // PriorityParam are the stream prioritzation parameters.
1073
+ type PriorityParam struct {
1074
+ // StreamDep is a 31-bit stream identifier for the
1075
+ // stream that this stream depends on. Zero means no
1076
+ // dependency.
1077
+ StreamDep uint32
1078
+
1079
+ // Exclusive is whether the dependency is exclusive.
1080
+ Exclusive bool
1081
+
1082
+ // Weight is the stream's zero-indexed weight. It should be
1083
+ // set together with StreamDep, or neither should be set. Per
1084
+ // the spec, "Add one to the value to obtain a weight between
1085
+ // 1 and 256."
1086
+ Weight uint8
1087
+ }
1088
+
1089
+ func (p PriorityParam) IsZero() bool {
1090
+ return p == PriorityParam{}
1091
+ }
1092
+
1093
+ func parsePriorityFrame(_ *frameCache, fh FrameHeader, payload []byte) (Frame, error) {
1094
+ if fh.StreamID == 0 {
1095
+ return nil, connError{ErrCodeProtocol, "PRIORITY frame with stream ID 0"}
1096
+ }
1097
+ if len(payload) != 5 {
1098
+ return nil, connError{ErrCodeFrameSize, fmt.Sprintf("PRIORITY frame payload size was %d; want 5", len(payload))}
1099
+ }
1100
+ v := binary.BigEndian.Uint32(payload[:4])
1101
+ streamID := v & 0x7fffffff // mask off high bit
1102
+ return &PriorityFrame{
1103
+ FrameHeader: fh,
1104
+ PriorityParam: PriorityParam{
1105
+ Weight: payload[4],
1106
+ StreamDep: streamID,
1107
+ Exclusive: streamID != v, // was high bit set?
1108
+ },
1109
+ }, nil
1110
+ }
1111
+
1112
+ // WritePriority writes a PRIORITY frame.
1113
+ //
1114
+ // It will perform exactly one Write to the underlying Writer.
1115
+ // It is the caller's responsibility to not call other Write methods concurrently.
1116
+ func (f *Framer) WritePriority(streamID uint32, p PriorityParam) error {
1117
+ if !validStreamID(streamID) && !f.AllowIllegalWrites {
1118
+ return errStreamID
1119
+ }
1120
+ if !validStreamIDOrZero(p.StreamDep) {
1121
+ return errDepStreamID
1122
+ }
1123
+ f.startWrite(FramePriority, 0, streamID)
1124
+ v := p.StreamDep
1125
+ if p.Exclusive {
1126
+ v |= 1 << 31
1127
+ }
1128
+ f.writeUint32(v)
1129
+ f.writeByte(p.Weight)
1130
+ return f.endWrite()
1131
+ }
1132
+
1133
+ // A RSTStreamFrame allows for abnormal termination of a stream.
1134
+ // See http://http2.github.io/http2-spec/#rfc.section.6.4
1135
+ type RSTStreamFrame struct {
1136
+ FrameHeader
1137
+ ErrCode ErrCode
1138
+ }
1139
+
1140
+ func parseRSTStreamFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) {
1141
+ if len(p) != 4 {
1142
+ return nil, ConnectionError(ErrCodeFrameSize)
1143
+ }
1144
+ if fh.StreamID == 0 {
1145
+ return nil, ConnectionError(ErrCodeProtocol)
1146
+ }
1147
+ return &RSTStreamFrame{fh, ErrCode(binary.BigEndian.Uint32(p[:4]))}, nil
1148
+ }
1149
+
1150
+ // WriteRSTStream writes a RST_STREAM frame.
1151
+ //
1152
+ // It will perform exactly one Write to the underlying Writer.
1153
+ // It is the caller's responsibility to not call other Write methods concurrently.
1154
+ func (f *Framer) WriteRSTStream(streamID uint32, code ErrCode) error {
1155
+ if !validStreamID(streamID) && !f.AllowIllegalWrites {
1156
+ return errStreamID
1157
+ }
1158
+ f.startWrite(FrameRSTStream, 0, streamID)
1159
+ f.writeUint32(uint32(code))
1160
+ return f.endWrite()
1161
+ }
1162
+
1163
+ // A ContinuationFrame is used to continue a sequence of header block fragments.
1164
+ // See http://http2.github.io/http2-spec/#rfc.section.6.10
1165
+ type ContinuationFrame struct {
1166
+ FrameHeader
1167
+ headerFragBuf []byte
1168
+ }
1169
+
1170
+ func parseContinuationFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) {
1171
+ if fh.StreamID == 0 {
1172
+ return nil, connError{ErrCodeProtocol, "CONTINUATION frame with stream ID 0"}
1173
+ }
1174
+ return &ContinuationFrame{fh, p}, nil
1175
+ }
1176
+
1177
+ func (f *ContinuationFrame) HeaderBlockFragment() []byte {
1178
+ f.checkValid()
1179
+ return f.headerFragBuf
1180
+ }
1181
+
1182
+ func (f *ContinuationFrame) HeadersEnded() bool {
1183
+ return f.FrameHeader.Flags.Has(FlagContinuationEndHeaders)
1184
+ }
1185
+
1186
+ // WriteContinuation writes a CONTINUATION frame.
1187
+ //
1188
+ // It will perform exactly one Write to the underlying Writer.
1189
+ // It is the caller's responsibility to not call other Write methods concurrently.
1190
+ func (f *Framer) WriteContinuation(streamID uint32, endHeaders bool, headerBlockFragment []byte) error {
1191
+ if !validStreamID(streamID) && !f.AllowIllegalWrites {
1192
+ return errStreamID
1193
+ }
1194
+ var flags Flags
1195
+ if endHeaders {
1196
+ flags |= FlagContinuationEndHeaders
1197
+ }
1198
+ f.startWrite(FrameContinuation, flags, streamID)
1199
+ f.wbuf = append(f.wbuf, headerBlockFragment...)
1200
+ return f.endWrite()
1201
+ }
1202
+
1203
+ // A PushPromiseFrame is used to initiate a server stream.
1204
+ // See http://http2.github.io/http2-spec/#rfc.section.6.6
1205
+ type PushPromiseFrame struct {
1206
+ FrameHeader
1207
+ PromiseID uint32
1208
+ headerFragBuf []byte // not owned
1209
+ }
1210
+
1211
+ func (f *PushPromiseFrame) HeaderBlockFragment() []byte {
1212
+ f.checkValid()
1213
+ return f.headerFragBuf
1214
+ }
1215
+
1216
+ func (f *PushPromiseFrame) HeadersEnded() bool {
1217
+ return f.FrameHeader.Flags.Has(FlagPushPromiseEndHeaders)
1218
+ }
1219
+
1220
+ func parsePushPromise(_ *frameCache, fh FrameHeader, p []byte) (_ Frame, err error) {
1221
+ pp := &PushPromiseFrame{
1222
+ FrameHeader: fh,
1223
+ }
1224
+ if pp.StreamID == 0 {
1225
+ // PUSH_PROMISE frames MUST be associated with an existing,
1226
+ // peer-initiated stream. The stream identifier of a
1227
+ // PUSH_PROMISE frame indicates the stream it is associated
1228
+ // with. If the stream identifier field specifies the value
1229
+ // 0x0, a recipient MUST respond with a connection error
1230
+ // (Section 5.4.1) of type PROTOCOL_ERROR.
1231
+ return nil, ConnectionError(ErrCodeProtocol)
1232
+ }
1233
+ // The PUSH_PROMISE frame includes optional padding.
1234
+ // Padding fields and flags are identical to those defined for DATA frames
1235
+ var padLength uint8
1236
+ if fh.Flags.Has(FlagPushPromisePadded) {
1237
+ if p, padLength, err = readByte(p); err != nil {
1238
+ return
1239
+ }
1240
+ }
1241
+
1242
+ p, pp.PromiseID, err = readUint32(p)
1243
+ if err != nil {
1244
+ return
1245
+ }
1246
+ pp.PromiseID = pp.PromiseID & (1<<31 - 1)
1247
+
1248
+ if int(padLength) > len(p) {
1249
+ // like the DATA frame, error out if padding is longer than the body.
1250
+ return nil, ConnectionError(ErrCodeProtocol)
1251
+ }
1252
+ pp.headerFragBuf = p[:len(p)-int(padLength)]
1253
+ return pp, nil
1254
+ }
1255
+
1256
+ // PushPromiseParam are the parameters for writing a PUSH_PROMISE frame.
1257
+ type PushPromiseParam struct {
1258
+ // StreamID is the required Stream ID to initiate.
1259
+ StreamID uint32
1260
+
1261
+ // PromiseID is the required Stream ID which this
1262
+ // Push Promises
1263
+ PromiseID uint32
1264
+
1265
+ // BlockFragment is part (or all) of a Header Block.
1266
+ BlockFragment []byte
1267
+
1268
+ // EndHeaders indicates that this frame contains an entire
1269
+ // header block and is not followed by any
1270
+ // CONTINUATION frames.
1271
+ EndHeaders bool
1272
+
1273
+ // PadLength is the optional number of bytes of zeros to add
1274
+ // to this frame.
1275
+ PadLength uint8
1276
+ }
1277
+
1278
+ // WritePushPromise writes a single PushPromise Frame.
1279
+ //
1280
+ // As with Header Frames, This is the low level call for writing
1281
+ // individual frames. Continuation frames are handled elsewhere.
1282
+ //
1283
+ // It will perform exactly one Write to the underlying Writer.
1284
+ // It is the caller's responsibility to not call other Write methods concurrently.
1285
+ func (f *Framer) WritePushPromise(p PushPromiseParam) error {
1286
+ if !validStreamID(p.StreamID) && !f.AllowIllegalWrites {
1287
+ return errStreamID
1288
+ }
1289
+ var flags Flags
1290
+ if p.PadLength != 0 {
1291
+ flags |= FlagPushPromisePadded
1292
+ }
1293
+ if p.EndHeaders {
1294
+ flags |= FlagPushPromiseEndHeaders
1295
+ }
1296
+ f.startWrite(FramePushPromise, flags, p.StreamID)
1297
+ if p.PadLength != 0 {
1298
+ f.writeByte(p.PadLength)
1299
+ }
1300
+ if !validStreamID(p.PromiseID) && !f.AllowIllegalWrites {
1301
+ return errStreamID
1302
+ }
1303
+ f.writeUint32(p.PromiseID)
1304
+ f.wbuf = append(f.wbuf, p.BlockFragment...)
1305
+ f.wbuf = append(f.wbuf, padZeros[:p.PadLength]...)
1306
+ return f.endWrite()
1307
+ }
1308
+
1309
+ // WriteRawFrame writes a raw frame. This can be used to write
1310
+ // extension frames unknown to this package.
1311
+ func (f *Framer) WriteRawFrame(t FrameType, flags Flags, streamID uint32, payload []byte) error {
1312
+ f.startWrite(t, flags, streamID)
1313
+ f.writeBytes(payload)
1314
+ return f.endWrite()
1315
+ }
1316
+
1317
+ func readByte(p []byte) (remain []byte, b byte, err error) {
1318
+ if len(p) == 0 {
1319
+ return nil, 0, io.ErrUnexpectedEOF
1320
+ }
1321
+ return p[1:], p[0], nil
1322
+ }
1323
+
1324
+ func readUint32(p []byte) (remain []byte, v uint32, err error) {
1325
+ if len(p) < 4 {
1326
+ return nil, 0, io.ErrUnexpectedEOF
1327
+ }
1328
+ return p[4:], binary.BigEndian.Uint32(p[:4]), nil
1329
+ }
1330
+
1331
+ type streamEnder interface {
1332
+ StreamEnded() bool
1333
+ }
1334
+
1335
+ type headersEnder interface {
1336
+ HeadersEnded() bool
1337
+ }
1338
+
1339
+ type headersOrContinuation interface {
1340
+ headersEnder
1341
+ HeaderBlockFragment() []byte
1342
+ }
1343
+
1344
+ // A MetaHeadersFrame is the representation of one HEADERS frame and
1345
+ // zero or more contiguous CONTINUATION frames and the decoding of
1346
+ // their HPACK-encoded contents.
1347
+ //
1348
+ // This type of frame does not appear on the wire and is only returned
1349
+ // by the Framer when Framer.ReadMetaHeaders is set.
1350
+ type MetaHeadersFrame struct {
1351
+ *HeadersFrame
1352
+
1353
+ // Fields are the fields contained in the HEADERS and
1354
+ // CONTINUATION frames. The underlying slice is owned by the
1355
+ // Framer and must not be retained after the next call to
1356
+ // ReadFrame.
1357
+ //
1358
+ // Fields are guaranteed to be in the correct http2 order and
1359
+ // not have unknown pseudo header fields or invalid header
1360
+ // field names or values. Required pseudo header fields may be
1361
+ // missing, however. Use the MetaHeadersFrame.Pseudo accessor
1362
+ // method access pseudo headers.
1363
+ Fields []hpack.HeaderField
1364
+
1365
+ // Truncated is whether the max header list size limit was hit
1366
+ // and Fields is incomplete. The hpack decoder state is still
1367
+ // valid, however.
1368
+ Truncated bool
1369
+ }
1370
+
1371
+ // PseudoValue returns the given pseudo header field's value.
1372
+ // The provided pseudo field should not contain the leading colon.
1373
+ func (mh *MetaHeadersFrame) PseudoValue(pseudo string) string {
1374
+ for _, hf := range mh.Fields {
1375
+ if !hf.IsPseudo() {
1376
+ return ""
1377
+ }
1378
+ if hf.Name[1:] == pseudo {
1379
+ return hf.Value
1380
+ }
1381
+ }
1382
+ return ""
1383
+ }
1384
+
1385
+ // RegularFields returns the regular (non-pseudo) header fields of mh.
1386
+ // The caller does not own the returned slice.
1387
+ func (mh *MetaHeadersFrame) RegularFields() []hpack.HeaderField {
1388
+ for i, hf := range mh.Fields {
1389
+ if !hf.IsPseudo() {
1390
+ return mh.Fields[i:]
1391
+ }
1392
+ }
1393
+ return nil
1394
+ }
1395
+
1396
+ // PseudoFields returns the pseudo header fields of mh.
1397
+ // The caller does not own the returned slice.
1398
+ func (mh *MetaHeadersFrame) PseudoFields() []hpack.HeaderField {
1399
+ for i, hf := range mh.Fields {
1400
+ if !hf.IsPseudo() {
1401
+ return mh.Fields[:i]
1402
+ }
1403
+ }
1404
+ return mh.Fields
1405
+ }
1406
+
1407
+ func (mh *MetaHeadersFrame) checkPseudos() error {
1408
+ var isRequest, isResponse bool
1409
+ pf := mh.PseudoFields()
1410
+ for i, hf := range pf {
1411
+ switch hf.Name {
1412
+ case ":method", ":path", ":scheme", ":authority":
1413
+ isRequest = true
1414
+ case ":status":
1415
+ isResponse = true
1416
+ default:
1417
+ return pseudoHeaderError(hf.Name)
1418
+ }
1419
+ // Check for duplicates.
1420
+ // This would be a bad algorithm, but N is 4.
1421
+ // And this doesn't allocate.
1422
+ for _, hf2 := range pf[:i] {
1423
+ if hf.Name == hf2.Name {
1424
+ return duplicatePseudoHeaderError(hf.Name)
1425
+ }
1426
+ }
1427
+ }
1428
+ if isRequest && isResponse {
1429
+ return errMixPseudoHeaderTypes
1430
+ }
1431
+ return nil
1432
+ }
1433
+
1434
+ func (fr *Framer) maxHeaderStringLen() int {
1435
+ v := fr.maxHeaderListSize()
1436
+ if uint32(int(v)) == v {
1437
+ return int(v)
1438
+ }
1439
+ // They had a crazy big number for MaxHeaderBytes anyway,
1440
+ // so give them unlimited header lengths:
1441
+ return 0
1442
+ }
1443
+
1444
+ // readMetaFrame returns 0 or more CONTINUATION frames from fr and
1445
+ // merge them into into the provided hf and returns a MetaHeadersFrame
1446
+ // with the decoded hpack values.
1447
+ func (fr *Framer) readMetaFrame(hf *HeadersFrame) (*MetaHeadersFrame, error) {
1448
+ if fr.AllowIllegalReads {
1449
+ return nil, errors.New("illegal use of AllowIllegalReads with ReadMetaHeaders")
1450
+ }
1451
+ mh := &MetaHeadersFrame{
1452
+ HeadersFrame: hf,
1453
+ }
1454
+ var remainSize = fr.maxHeaderListSize()
1455
+ var sawRegular bool
1456
+
1457
+ var invalid error // pseudo header field errors
1458
+ hdec := fr.ReadMetaHeaders
1459
+ hdec.SetEmitEnabled(true)
1460
+ hdec.SetMaxStringLength(fr.maxHeaderStringLen())
1461
+ hdec.SetEmitFunc(func(hf hpack.HeaderField) {
1462
+ if VerboseLogs && fr.logReads {
1463
+ fr.debugReadLoggerf("http2: decoded hpack field %+v", hf)
1464
+ }
1465
+ if !httplex.ValidHeaderFieldValue(hf.Value) {
1466
+ invalid = headerFieldValueError(hf.Value)
1467
+ }
1468
+ isPseudo := strings.HasPrefix(hf.Name, ":")
1469
+ if isPseudo {
1470
+ if sawRegular {
1471
+ invalid = errPseudoAfterRegular
1472
+ }
1473
+ } else {
1474
+ sawRegular = true
1475
+ if !validWireHeaderFieldName(hf.Name) {
1476
+ invalid = headerFieldNameError(hf.Name)
1477
+ }
1478
+ }
1479
+
1480
+ if invalid != nil {
1481
+ hdec.SetEmitEnabled(false)
1482
+ return
1483
+ }
1484
+
1485
+ size := hf.Size()
1486
+ if size > remainSize {
1487
+ hdec.SetEmitEnabled(false)
1488
+ mh.Truncated = true
1489
+ return
1490
+ }
1491
+ remainSize -= size
1492
+
1493
+ mh.Fields = append(mh.Fields, hf)
1494
+ })
1495
+ // Lose reference to MetaHeadersFrame:
1496
+ defer hdec.SetEmitFunc(func(hf hpack.HeaderField) {})
1497
+
1498
+ var hc headersOrContinuation = hf
1499
+ for {
1500
+ frag := hc.HeaderBlockFragment()
1501
+ if _, err := hdec.Write(frag); err != nil {
1502
+ return nil, ConnectionError(ErrCodeCompression)
1503
+ }
1504
+
1505
+ if hc.HeadersEnded() {
1506
+ break
1507
+ }
1508
+ if f, err := fr.ReadFrame(); err != nil {
1509
+ return nil, err
1510
+ } else {
1511
+ hc = f.(*ContinuationFrame) // guaranteed by checkFrameOrder
1512
+ }
1513
+ }
1514
+
1515
+ mh.HeadersFrame.headerFragBuf = nil
1516
+ mh.HeadersFrame.invalidate()
1517
+
1518
+ if err := hdec.Close(); err != nil {
1519
+ return nil, ConnectionError(ErrCodeCompression)
1520
+ }
1521
+ if invalid != nil {
1522
+ fr.errDetail = invalid
1523
+ if VerboseLogs {
1524
+ log.Printf("http2: invalid header: %v", invalid)
1525
+ }
1526
+ return nil, StreamError{mh.StreamID, ErrCodeProtocol, invalid}
1527
+ }
1528
+ if err := mh.checkPseudos(); err != nil {
1529
+ fr.errDetail = err
1530
+ if VerboseLogs {
1531
+ log.Printf("http2: invalid pseudo headers: %v", err)
1532
+ }
1533
+ return nil, StreamError{mh.StreamID, ErrCodeProtocol, err}
1534
+ }
1535
+ return mh, nil
1536
+ }
1537
+
1538
+ func summarizeFrame(f Frame) string {
1539
+ var buf bytes.Buffer
1540
+ f.Header().writeDebug(&buf)
1541
+ switch f := f.(type) {
1542
+ case *SettingsFrame:
1543
+ n := 0
1544
+ f.ForeachSetting(func(s Setting) error {
1545
+ n++
1546
+ if n == 1 {
1547
+ buf.WriteString(", settings:")
1548
+ }
1549
+ fmt.Fprintf(&buf, " %v=%v,", s.ID, s.Val)
1550
+ return nil
1551
+ })
1552
+ if n > 0 {
1553
+ buf.Truncate(buf.Len() - 1) // remove trailing comma
1554
+ }
1555
+ case *DataFrame:
1556
+ data := f.Data()
1557
+ const max = 256
1558
+ if len(data) > max {
1559
+ data = data[:max]
1560
+ }
1561
+ fmt.Fprintf(&buf, " data=%q", data)
1562
+ if len(f.Data()) > max {
1563
+ fmt.Fprintf(&buf, " (%d bytes omitted)", len(f.Data())-max)
1564
+ }
1565
+ case *WindowUpdateFrame:
1566
+ if f.StreamID == 0 {
1567
+ buf.WriteString(" (conn)")
1568
+ }
1569
+ fmt.Fprintf(&buf, " incr=%v", f.Increment)
1570
+ case *PingFrame:
1571
+ fmt.Fprintf(&buf, " ping=%q", f.Data[:])
1572
+ case *GoAwayFrame:
1573
+ fmt.Fprintf(&buf, " LastStreamID=%v ErrCode=%v Debug=%q",
1574
+ f.LastStreamID, f.ErrCode, f.debugData)
1575
+ case *RSTStreamFrame:
1576
+ fmt.Fprintf(&buf, " ErrCode=%v", f.ErrCode)
1577
+ }
1578
+ return buf.String()
1579
+ }