ires 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1024) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +32 -45
  3. data/ext/Gopkg.lock +31 -1
  4. data/ext/ires/image.go +227 -0
  5. data/ext/ires/ires.go +47 -59
  6. data/ext/ires/uri.go +143 -0
  7. data/ext/main.go +18 -9
  8. data/ext/vendor/github.com/PuerkitoBio/purell/LICENSE +12 -0
  9. data/ext/vendor/github.com/PuerkitoBio/purell/README.md +187 -0
  10. data/ext/vendor/github.com/PuerkitoBio/purell/bench_test.go +57 -0
  11. data/ext/vendor/github.com/PuerkitoBio/purell/benchmarks/v0.1.0 +9 -0
  12. data/ext/vendor/github.com/PuerkitoBio/purell/example_test.go +35 -0
  13. data/ext/vendor/github.com/PuerkitoBio/purell/purell.go +379 -0
  14. data/ext/vendor/github.com/PuerkitoBio/purell/purell_test.go +768 -0
  15. data/ext/vendor/github.com/PuerkitoBio/purell/urlnorm_test.go +53 -0
  16. data/ext/vendor/github.com/PuerkitoBio/urlesc/LICENSE +27 -0
  17. data/ext/vendor/github.com/PuerkitoBio/urlesc/README.md +16 -0
  18. data/ext/vendor/github.com/PuerkitoBio/urlesc/urlesc.go +180 -0
  19. data/ext/vendor/github.com/PuerkitoBio/urlesc/urlesc_test.go +641 -0
  20. data/ext/vendor/github.com/{satori/go.uuid → goware/urlx}/LICENSE +3 -1
  21. data/ext/vendor/github.com/goware/urlx/README.md +172 -0
  22. data/ext/vendor/github.com/goware/urlx/urlx.go +196 -0
  23. data/ext/vendor/github.com/goware/urlx/urlx_test.go +232 -0
  24. data/ext/vendor/golang.org/x/net/AUTHORS +3 -0
  25. data/ext/vendor/golang.org/x/net/CONTRIBUTING.md +31 -0
  26. data/ext/vendor/golang.org/x/net/CONTRIBUTORS +3 -0
  27. data/ext/vendor/golang.org/x/net/LICENSE +27 -0
  28. data/ext/vendor/golang.org/x/net/PATENTS +22 -0
  29. data/ext/vendor/golang.org/x/net/README.md +16 -0
  30. data/ext/vendor/golang.org/x/net/bpf/asm.go +41 -0
  31. data/ext/vendor/golang.org/x/net/bpf/constants.go +218 -0
  32. data/ext/vendor/golang.org/x/net/bpf/doc.go +82 -0
  33. data/ext/vendor/golang.org/x/net/bpf/instructions.go +704 -0
  34. data/ext/vendor/golang.org/x/net/bpf/instructions_test.go +525 -0
  35. data/ext/vendor/golang.org/x/net/bpf/setter.go +10 -0
  36. data/ext/vendor/golang.org/x/net/bpf/testdata/all_instructions.bpf +1 -0
  37. data/ext/vendor/golang.org/x/net/bpf/testdata/all_instructions.txt +79 -0
  38. data/ext/vendor/golang.org/x/net/bpf/vm.go +140 -0
  39. data/ext/vendor/golang.org/x/net/bpf/vm_aluop_test.go +512 -0
  40. data/ext/vendor/golang.org/x/net/bpf/vm_bpf_test.go +192 -0
  41. data/ext/vendor/golang.org/x/net/bpf/vm_extension_test.go +49 -0
  42. data/ext/vendor/golang.org/x/net/bpf/vm_instructions.go +174 -0
  43. data/ext/vendor/golang.org/x/net/bpf/vm_jump_test.go +380 -0
  44. data/ext/vendor/golang.org/x/net/bpf/vm_load_test.go +246 -0
  45. data/ext/vendor/golang.org/x/net/bpf/vm_ret_test.go +115 -0
  46. data/ext/vendor/golang.org/x/net/bpf/vm_scratch_test.go +247 -0
  47. data/ext/vendor/golang.org/x/net/bpf/vm_test.go +144 -0
  48. data/ext/vendor/golang.org/x/net/codereview.cfg +1 -0
  49. data/ext/vendor/golang.org/x/net/context/context.go +54 -0
  50. data/ext/vendor/golang.org/x/net/context/context_test.go +583 -0
  51. data/ext/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go +74 -0
  52. data/ext/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_17_test.go +29 -0
  53. data/ext/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17.go +147 -0
  54. data/ext/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17_test.go +79 -0
  55. data/ext/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_test.go +105 -0
  56. data/ext/vendor/golang.org/x/net/context/go17.go +72 -0
  57. data/ext/vendor/golang.org/x/net/context/go19.go +20 -0
  58. data/ext/vendor/golang.org/x/net/context/pre_go17.go +300 -0
  59. data/ext/vendor/golang.org/x/net/context/pre_go19.go +109 -0
  60. data/ext/vendor/golang.org/x/net/context/withtimeout_test.go +31 -0
  61. data/ext/vendor/golang.org/x/net/dict/dict.go +210 -0
  62. data/ext/vendor/golang.org/x/net/dns/dnsmessage/example_test.go +132 -0
  63. data/ext/vendor/golang.org/x/net/dns/dnsmessage/message.go +1997 -0
  64. data/ext/vendor/golang.org/x/net/dns/dnsmessage/message_test.go +1116 -0
  65. data/ext/vendor/golang.org/x/net/html/atom/atom.go +78 -0
  66. data/ext/vendor/golang.org/x/net/html/atom/atom_test.go +109 -0
  67. data/ext/vendor/golang.org/x/net/html/atom/gen.go +709 -0
  68. data/ext/vendor/golang.org/x/net/html/atom/table.go +777 -0
  69. data/ext/vendor/golang.org/x/net/html/atom/table_test.go +373 -0
  70. data/ext/vendor/golang.org/x/net/html/charset/charset.go +257 -0
  71. data/ext/vendor/golang.org/x/net/html/charset/charset_test.go +237 -0
  72. data/ext/vendor/golang.org/x/net/html/charset/testdata/HTTP-charset.html +48 -0
  73. data/ext/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html +48 -0
  74. data/ext/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html +49 -0
  75. data/ext/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html +49 -0
  76. data/ext/vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html +47 -0
  77. data/ext/vendor/golang.org/x/net/html/charset/testdata/README +9 -0
  78. data/ext/vendor/golang.org/x/net/html/charset/testdata/UTF-16BE-BOM.html +0 -0
  79. data/ext/vendor/golang.org/x/net/html/charset/testdata/UTF-16LE-BOM.html +0 -0
  80. data/ext/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html +49 -0
  81. data/ext/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html +48 -0
  82. data/ext/vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html +48 -0
  83. data/ext/vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html +48 -0
  84. data/ext/vendor/golang.org/x/net/html/const.go +104 -0
  85. data/ext/vendor/golang.org/x/net/html/doc.go +106 -0
  86. data/ext/vendor/golang.org/x/net/html/doctype.go +156 -0
  87. data/ext/vendor/golang.org/x/net/html/entity.go +2253 -0
  88. data/ext/vendor/golang.org/x/net/html/entity_test.go +29 -0
  89. data/ext/vendor/golang.org/x/net/html/escape.go +258 -0
  90. data/ext/vendor/golang.org/x/net/html/escape_test.go +97 -0
  91. data/ext/vendor/golang.org/x/net/html/example_test.go +40 -0
  92. data/ext/vendor/golang.org/x/net/html/foreign.go +226 -0
  93. data/ext/vendor/golang.org/x/net/html/node.go +193 -0
  94. data/ext/vendor/golang.org/x/net/html/node_test.go +146 -0
  95. data/ext/vendor/golang.org/x/net/html/parse.go +2094 -0
  96. data/ext/vendor/golang.org/x/net/html/parse_test.go +388 -0
  97. data/ext/vendor/golang.org/x/net/html/render.go +271 -0
  98. data/ext/vendor/golang.org/x/net/html/render_test.go +156 -0
  99. data/ext/vendor/golang.org/x/net/html/testdata/go1.html +2237 -0
  100. data/ext/vendor/golang.org/x/net/html/testdata/webkit/README +28 -0
  101. data/ext/vendor/golang.org/x/net/html/testdata/webkit/adoption01.dat +194 -0
  102. data/ext/vendor/golang.org/x/net/html/testdata/webkit/adoption02.dat +31 -0
  103. data/ext/vendor/golang.org/x/net/html/testdata/webkit/comments01.dat +135 -0
  104. data/ext/vendor/golang.org/x/net/html/testdata/webkit/doctype01.dat +370 -0
  105. data/ext/vendor/golang.org/x/net/html/testdata/webkit/entities01.dat +603 -0
  106. data/ext/vendor/golang.org/x/net/html/testdata/webkit/entities02.dat +249 -0
  107. data/ext/vendor/golang.org/x/net/html/testdata/webkit/html5test-com.dat +246 -0
  108. data/ext/vendor/golang.org/x/net/html/testdata/webkit/inbody01.dat +43 -0
  109. data/ext/vendor/golang.org/x/net/html/testdata/webkit/isindex.dat +40 -0
  110. data/ext/vendor/golang.org/x/net/html/testdata/webkit/pending-spec-changes-plain-text-unsafe.dat +0 -0
  111. data/ext/vendor/golang.org/x/net/html/testdata/webkit/pending-spec-changes.dat +52 -0
  112. data/ext/vendor/golang.org/x/net/html/testdata/webkit/plain-text-unsafe.dat +0 -0
  113. data/ext/vendor/golang.org/x/net/html/testdata/webkit/scriptdata01.dat +308 -0
  114. data/ext/vendor/golang.org/x/net/html/testdata/webkit/scripted/adoption01.dat +15 -0
  115. data/ext/vendor/golang.org/x/net/html/testdata/webkit/scripted/webkit01.dat +28 -0
  116. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tables01.dat +212 -0
  117. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests1.dat +1952 -0
  118. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat +799 -0
  119. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat +482 -0
  120. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests12.dat +62 -0
  121. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat +74 -0
  122. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat +208 -0
  123. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests16.dat +2299 -0
  124. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat +153 -0
  125. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat +269 -0
  126. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat +1237 -0
  127. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat +763 -0
  128. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests20.dat +455 -0
  129. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests21.dat +221 -0
  130. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests22.dat +157 -0
  131. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests23.dat +155 -0
  132. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests24.dat +79 -0
  133. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests25.dat +219 -0
  134. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests26.dat +313 -0
  135. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests3.dat +305 -0
  136. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests4.dat +59 -0
  137. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests5.dat +191 -0
  138. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests6.dat +663 -0
  139. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests7.dat +390 -0
  140. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests8.dat +148 -0
  141. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests9.dat +457 -0
  142. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tests_innerHTML_1.dat +741 -0
  143. data/ext/vendor/golang.org/x/net/html/testdata/webkit/tricky01.dat +261 -0
  144. data/ext/vendor/golang.org/x/net/html/testdata/webkit/webkit01.dat +610 -0
  145. data/ext/vendor/golang.org/x/net/html/testdata/webkit/webkit02.dat +159 -0
  146. data/ext/vendor/golang.org/x/net/html/token.go +1219 -0
  147. data/ext/vendor/golang.org/x/net/html/token_test.go +748 -0
  148. data/ext/vendor/golang.org/x/net/http2/Dockerfile +51 -0
  149. data/ext/vendor/golang.org/x/net/http2/Makefile +3 -0
  150. data/ext/vendor/golang.org/x/net/http2/README +20 -0
  151. data/ext/vendor/golang.org/x/net/http2/ciphers.go +641 -0
  152. data/ext/vendor/golang.org/x/net/http2/ciphers_test.go +309 -0
  153. data/ext/vendor/golang.org/x/net/http2/client_conn_pool.go +256 -0
  154. data/ext/vendor/golang.org/x/net/http2/configure_transport.go +80 -0
  155. data/ext/vendor/golang.org/x/net/http2/databuffer.go +146 -0
  156. data/ext/vendor/golang.org/x/net/http2/databuffer_test.go +157 -0
  157. data/ext/vendor/golang.org/x/net/http2/errors.go +133 -0
  158. data/ext/vendor/golang.org/x/net/http2/errors_test.go +24 -0
  159. data/ext/vendor/golang.org/x/net/http2/flow.go +50 -0
  160. data/ext/vendor/golang.org/x/net/http2/flow_test.go +53 -0
  161. data/ext/vendor/golang.org/x/net/http2/frame.go +1579 -0
  162. data/ext/vendor/golang.org/x/net/http2/frame_test.go +1191 -0
  163. data/ext/vendor/golang.org/x/net/http2/go16.go +16 -0
  164. data/ext/vendor/golang.org/x/net/http2/go17.go +106 -0
  165. data/ext/vendor/golang.org/x/net/http2/go17_not18.go +36 -0
  166. data/ext/vendor/golang.org/x/net/http2/go18.go +56 -0
  167. data/ext/vendor/golang.org/x/net/http2/go18_test.go +79 -0
  168. data/ext/vendor/golang.org/x/net/http2/go19.go +16 -0
  169. data/ext/vendor/golang.org/x/net/http2/go19_test.go +60 -0
  170. data/ext/vendor/golang.org/x/net/http2/gotrack.go +170 -0
  171. data/ext/vendor/golang.org/x/net/http2/gotrack_test.go +33 -0
  172. data/ext/vendor/golang.org/x/net/http2/h2demo/Makefile +8 -0
  173. data/ext/vendor/golang.org/x/net/http2/h2demo/README +16 -0
  174. data/ext/vendor/golang.org/x/net/http2/h2demo/h2demo.go +538 -0
  175. data/ext/vendor/golang.org/x/net/http2/h2demo/launch.go +302 -0
  176. data/ext/vendor/golang.org/x/net/http2/h2demo/rootCA.key +27 -0
  177. data/ext/vendor/golang.org/x/net/http2/h2demo/rootCA.pem +26 -0
  178. data/ext/vendor/golang.org/x/net/http2/h2demo/rootCA.srl +1 -0
  179. data/ext/vendor/golang.org/x/net/http2/h2demo/server.crt +20 -0
  180. data/ext/vendor/golang.org/x/net/http2/h2demo/server.key +27 -0
  181. data/ext/vendor/golang.org/x/net/http2/h2demo/tmpl.go +1991 -0
  182. data/ext/vendor/golang.org/x/net/http2/h2i/README.md +97 -0
  183. data/ext/vendor/golang.org/x/net/http2/h2i/h2i.go +522 -0
  184. data/ext/vendor/golang.org/x/net/http2/headermap.go +78 -0
  185. data/ext/vendor/golang.org/x/net/http2/hpack/encode.go +240 -0
  186. data/ext/vendor/golang.org/x/net/http2/hpack/encode_test.go +386 -0
  187. data/ext/vendor/golang.org/x/net/http2/hpack/hpack.go +490 -0
  188. data/ext/vendor/golang.org/x/net/http2/hpack/hpack_test.go +722 -0
  189. data/ext/vendor/golang.org/x/net/http2/hpack/huffman.go +212 -0
  190. data/ext/vendor/golang.org/x/net/http2/hpack/tables.go +479 -0
  191. data/ext/vendor/golang.org/x/net/http2/hpack/tables_test.go +214 -0
  192. data/ext/vendor/golang.org/x/net/http2/http2.go +391 -0
  193. data/ext/vendor/golang.org/x/net/http2/http2_test.go +199 -0
  194. data/ext/vendor/golang.org/x/net/http2/not_go16.go +21 -0
  195. data/ext/vendor/golang.org/x/net/http2/not_go17.go +87 -0
  196. data/ext/vendor/golang.org/x/net/http2/not_go18.go +29 -0
  197. data/ext/vendor/golang.org/x/net/http2/not_go19.go +16 -0
  198. data/ext/vendor/golang.org/x/net/http2/pipe.go +163 -0
  199. data/ext/vendor/golang.org/x/net/http2/pipe_test.go +130 -0
  200. data/ext/vendor/golang.org/x/net/http2/server.go +2857 -0
  201. data/ext/vendor/golang.org/x/net/http2/server_push_test.go +521 -0
  202. data/ext/vendor/golang.org/x/net/http2/server_test.go +3721 -0
  203. data/ext/vendor/golang.org/x/net/http2/testdata/draft-ietf-httpbis-http2.xml +5021 -0
  204. data/ext/vendor/golang.org/x/net/http2/transport.go +2285 -0
  205. data/ext/vendor/golang.org/x/net/http2/transport_test.go +3714 -0
  206. data/ext/vendor/golang.org/x/net/http2/write.go +370 -0
  207. data/ext/vendor/golang.org/x/net/http2/writesched.go +242 -0
  208. data/ext/vendor/golang.org/x/net/http2/writesched_priority.go +452 -0
  209. data/ext/vendor/golang.org/x/net/http2/writesched_priority_test.go +541 -0
  210. data/ext/vendor/golang.org/x/net/http2/writesched_random.go +72 -0
  211. data/ext/vendor/golang.org/x/net/http2/writesched_random_test.go +44 -0
  212. data/ext/vendor/golang.org/x/net/http2/writesched_test.go +125 -0
  213. data/ext/vendor/golang.org/x/net/http2/z_spec_test.go +356 -0
  214. data/ext/vendor/golang.org/x/net/icmp/dstunreach.go +41 -0
  215. data/ext/vendor/golang.org/x/net/icmp/echo.go +45 -0
  216. data/ext/vendor/golang.org/x/net/icmp/endpoint.go +113 -0
  217. data/ext/vendor/golang.org/x/net/icmp/example_test.go +63 -0
  218. data/ext/vendor/golang.org/x/net/icmp/extension.go +89 -0
  219. data/ext/vendor/golang.org/x/net/icmp/extension_test.go +259 -0
  220. data/ext/vendor/golang.org/x/net/icmp/helper_posix.go +75 -0
  221. data/ext/vendor/golang.org/x/net/icmp/interface.go +236 -0
  222. data/ext/vendor/golang.org/x/net/icmp/ipv4.go +61 -0
  223. data/ext/vendor/golang.org/x/net/icmp/ipv4_test.go +83 -0
  224. data/ext/vendor/golang.org/x/net/icmp/ipv6.go +23 -0
  225. data/ext/vendor/golang.org/x/net/icmp/listen_posix.go +100 -0
  226. data/ext/vendor/golang.org/x/net/icmp/listen_stub.go +33 -0
  227. data/ext/vendor/golang.org/x/net/icmp/message.go +152 -0
  228. data/ext/vendor/golang.org/x/net/icmp/message_test.go +134 -0
  229. data/ext/vendor/golang.org/x/net/icmp/messagebody.go +41 -0
  230. data/ext/vendor/golang.org/x/net/icmp/mpls.go +77 -0
  231. data/ext/vendor/golang.org/x/net/icmp/multipart.go +109 -0
  232. data/ext/vendor/golang.org/x/net/icmp/multipart_test.go +442 -0
  233. data/ext/vendor/golang.org/x/net/icmp/packettoobig.go +43 -0
  234. data/ext/vendor/golang.org/x/net/icmp/paramprob.go +63 -0
  235. data/ext/vendor/golang.org/x/net/icmp/ping_test.go +200 -0
  236. data/ext/vendor/golang.org/x/net/icmp/sys_freebsd.go +11 -0
  237. data/ext/vendor/golang.org/x/net/icmp/timeexceeded.go +39 -0
  238. data/ext/vendor/golang.org/x/net/idna/example_test.go +70 -0
  239. data/ext/vendor/golang.org/x/net/idna/idna.go +680 -0
  240. data/ext/vendor/golang.org/x/net/idna/idna_test.go +108 -0
  241. data/ext/vendor/golang.org/x/net/idna/punycode.go +203 -0
  242. data/ext/vendor/golang.org/x/net/idna/punycode_test.go +198 -0
  243. data/ext/vendor/golang.org/x/net/idna/tables.go +4477 -0
  244. data/ext/vendor/golang.org/x/net/idna/trie.go +72 -0
  245. data/ext/vendor/golang.org/x/net/idna/trieval.go +114 -0
  246. data/ext/vendor/golang.org/x/net/internal/iana/const.go +180 -0
  247. data/ext/vendor/golang.org/x/net/internal/iana/gen.go +293 -0
  248. data/ext/vendor/golang.org/x/net/internal/nettest/helper_bsd.go +53 -0
  249. data/ext/vendor/golang.org/x/net/internal/nettest/helper_nobsd.go +15 -0
  250. data/ext/vendor/golang.org/x/net/internal/nettest/helper_posix.go +31 -0
  251. data/ext/vendor/golang.org/x/net/internal/nettest/helper_stub.go +32 -0
  252. data/ext/vendor/golang.org/x/net/internal/nettest/helper_unix.go +29 -0
  253. data/ext/vendor/golang.org/x/net/internal/nettest/helper_windows.go +42 -0
  254. data/ext/vendor/golang.org/x/net/internal/nettest/interface.go +94 -0
  255. data/ext/vendor/golang.org/x/net/internal/nettest/rlimit.go +11 -0
  256. data/ext/vendor/golang.org/x/net/internal/nettest/stack.go +147 -0
  257. data/ext/vendor/golang.org/x/net/internal/socket/cmsghdr.go +11 -0
  258. data/ext/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go +13 -0
  259. data/ext/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go +14 -0
  260. data/ext/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go +14 -0
  261. data/ext/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go +14 -0
  262. data/ext/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go +17 -0
  263. data/ext/vendor/golang.org/x/net/internal/socket/defs_darwin.go +44 -0
  264. data/ext/vendor/golang.org/x/net/internal/socket/defs_dragonfly.go +44 -0
  265. data/ext/vendor/golang.org/x/net/internal/socket/defs_freebsd.go +44 -0
  266. data/ext/vendor/golang.org/x/net/internal/socket/defs_linux.go +49 -0
  267. data/ext/vendor/golang.org/x/net/internal/socket/defs_netbsd.go +47 -0
  268. data/ext/vendor/golang.org/x/net/internal/socket/defs_openbsd.go +44 -0
  269. data/ext/vendor/golang.org/x/net/internal/socket/defs_solaris.go +44 -0
  270. data/ext/vendor/golang.org/x/net/internal/socket/error_unix.go +31 -0
  271. data/ext/vendor/golang.org/x/net/internal/socket/error_windows.go +26 -0
  272. data/ext/vendor/golang.org/x/net/internal/socket/iovec_32bit.go +19 -0
  273. data/ext/vendor/golang.org/x/net/internal/socket/iovec_64bit.go +19 -0
  274. data/ext/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go +19 -0
  275. data/ext/vendor/golang.org/x/net/internal/socket/iovec_stub.go +11 -0
  276. data/ext/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go +21 -0
  277. data/ext/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go +42 -0
  278. data/ext/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go +39 -0
  279. data/ext/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go +16 -0
  280. data/ext/vendor/golang.org/x/net/internal/socket/msghdr_linux.go +36 -0
  281. data/ext/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go +24 -0
  282. data/ext/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go +24 -0
  283. data/ext/vendor/golang.org/x/net/internal/socket/msghdr_openbsd.go +14 -0
  284. data/ext/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go +36 -0
  285. data/ext/vendor/golang.org/x/net/internal/socket/msghdr_stub.go +14 -0
  286. data/ext/vendor/golang.org/x/net/internal/socket/rawconn.go +66 -0
  287. data/ext/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go +74 -0
  288. data/ext/vendor/golang.org/x/net/internal/socket/rawconn_msg.go +77 -0
  289. data/ext/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go +18 -0
  290. data/ext/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go +18 -0
  291. data/ext/vendor/golang.org/x/net/internal/socket/rawconn_stub.go +25 -0
  292. data/ext/vendor/golang.org/x/net/internal/socket/reflect.go +62 -0
  293. data/ext/vendor/golang.org/x/net/internal/socket/socket.go +285 -0
  294. data/ext/vendor/golang.org/x/net/internal/socket/socket_go1_9_test.go +259 -0
  295. data/ext/vendor/golang.org/x/net/internal/socket/socket_test.go +46 -0
  296. data/ext/vendor/golang.org/x/net/internal/socket/sys.go +33 -0
  297. data/ext/vendor/golang.org/x/net/internal/socket/sys_bsd.go +17 -0
  298. data/ext/vendor/golang.org/x/net/internal/socket/sys_bsdvar.go +14 -0
  299. data/ext/vendor/golang.org/x/net/internal/socket/sys_darwin.go +7 -0
  300. data/ext/vendor/golang.org/x/net/internal/socket/sys_dragonfly.go +7 -0
  301. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux.go +27 -0
  302. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_386.go +55 -0
  303. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_386.s +11 -0
  304. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_amd64.go +10 -0
  305. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_arm.go +10 -0
  306. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_arm64.go +10 -0
  307. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_mips.go +10 -0
  308. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_mips64.go +10 -0
  309. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_mips64le.go +10 -0
  310. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_mipsle.go +10 -0
  311. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64.go +10 -0
  312. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64le.go +10 -0
  313. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.go +55 -0
  314. data/ext/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.s +11 -0
  315. data/ext/vendor/golang.org/x/net/internal/socket/sys_netbsd.go +25 -0
  316. data/ext/vendor/golang.org/x/net/internal/socket/sys_posix.go +168 -0
  317. data/ext/vendor/golang.org/x/net/internal/socket/sys_solaris.go +71 -0
  318. data/ext/vendor/golang.org/x/net/internal/socket/sys_solaris_amd64.s +11 -0
  319. data/ext/vendor/golang.org/x/net/internal/socket/sys_stub.go +64 -0
  320. data/ext/vendor/golang.org/x/net/internal/socket/sys_unix.go +33 -0
  321. data/ext/vendor/golang.org/x/net/internal/socket/sys_windows.go +70 -0
  322. data/ext/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go +59 -0
  323. data/ext/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go +61 -0
  324. data/ext/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go +59 -0
  325. data/ext/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go +61 -0
  326. data/ext/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go +59 -0
  327. data/ext/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go +61 -0
  328. data/ext/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go +59 -0
  329. data/ext/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go +63 -0
  330. data/ext/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go +66 -0
  331. data/ext/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go +63 -0
  332. data/ext/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go +66 -0
  333. data/ext/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go +63 -0
  334. data/ext/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go +66 -0
  335. data/ext/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go +66 -0
  336. data/ext/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go +63 -0
  337. data/ext/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go +66 -0
  338. data/ext/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go +66 -0
  339. data/ext/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go +66 -0
  340. data/ext/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go +65 -0
  341. data/ext/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go +68 -0
  342. data/ext/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go +59 -0
  343. data/ext/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go +59 -0
  344. data/ext/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go +61 -0
  345. data/ext/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go +59 -0
  346. data/ext/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go +60 -0
  347. data/ext/vendor/golang.org/x/net/internal/timeseries/timeseries.go +525 -0
  348. data/ext/vendor/golang.org/x/net/internal/timeseries/timeseries_test.go +170 -0
  349. data/ext/vendor/golang.org/x/net/ipv4/batch.go +191 -0
  350. data/ext/vendor/golang.org/x/net/ipv4/bpf_test.go +93 -0
  351. data/ext/vendor/golang.org/x/net/ipv4/control.go +144 -0
  352. data/ext/vendor/golang.org/x/net/ipv4/control_bsd.go +40 -0
  353. data/ext/vendor/golang.org/x/net/ipv4/control_pktinfo.go +39 -0
  354. data/ext/vendor/golang.org/x/net/ipv4/control_stub.go +13 -0
  355. data/ext/vendor/golang.org/x/net/ipv4/control_test.go +21 -0
  356. data/ext/vendor/golang.org/x/net/ipv4/control_unix.go +73 -0
  357. data/ext/vendor/golang.org/x/net/ipv4/control_windows.go +16 -0
  358. data/ext/vendor/golang.org/x/net/ipv4/defs_darwin.go +77 -0
  359. data/ext/vendor/golang.org/x/net/ipv4/defs_dragonfly.go +38 -0
  360. data/ext/vendor/golang.org/x/net/ipv4/defs_freebsd.go +75 -0
  361. data/ext/vendor/golang.org/x/net/ipv4/defs_linux.go +122 -0
  362. data/ext/vendor/golang.org/x/net/ipv4/defs_netbsd.go +37 -0
  363. data/ext/vendor/golang.org/x/net/ipv4/defs_openbsd.go +37 -0
  364. data/ext/vendor/golang.org/x/net/ipv4/defs_solaris.go +84 -0
  365. data/ext/vendor/golang.org/x/net/ipv4/dgramopt.go +265 -0
  366. data/ext/vendor/golang.org/x/net/ipv4/doc.go +244 -0
  367. data/ext/vendor/golang.org/x/net/ipv4/endpoint.go +187 -0
  368. data/ext/vendor/golang.org/x/net/ipv4/example_test.go +224 -0
  369. data/ext/vendor/golang.org/x/net/ipv4/gen.go +199 -0
  370. data/ext/vendor/golang.org/x/net/ipv4/genericopt.go +57 -0
  371. data/ext/vendor/golang.org/x/net/ipv4/header.go +159 -0
  372. data/ext/vendor/golang.org/x/net/ipv4/header_test.go +228 -0
  373. data/ext/vendor/golang.org/x/net/ipv4/helper.go +63 -0
  374. data/ext/vendor/golang.org/x/net/ipv4/iana.go +34 -0
  375. data/ext/vendor/golang.org/x/net/ipv4/icmp.go +57 -0
  376. data/ext/vendor/golang.org/x/net/ipv4/icmp_linux.go +25 -0
  377. data/ext/vendor/golang.org/x/net/ipv4/icmp_stub.go +25 -0
  378. data/ext/vendor/golang.org/x/net/ipv4/icmp_test.go +95 -0
  379. data/ext/vendor/golang.org/x/net/ipv4/multicast_test.go +334 -0
  380. data/ext/vendor/golang.org/x/net/ipv4/multicastlistener_test.go +265 -0
  381. data/ext/vendor/golang.org/x/net/ipv4/multicastsockopt_test.go +195 -0
  382. data/ext/vendor/golang.org/x/net/ipv4/packet.go +69 -0
  383. data/ext/vendor/golang.org/x/net/ipv4/packet_go1_8.go +56 -0
  384. data/ext/vendor/golang.org/x/net/ipv4/packet_go1_9.go +67 -0
  385. data/ext/vendor/golang.org/x/net/ipv4/payload.go +23 -0
  386. data/ext/vendor/golang.org/x/net/ipv4/payload_cmsg.go +36 -0
  387. data/ext/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_8.go +59 -0
  388. data/ext/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_9.go +67 -0
  389. data/ext/vendor/golang.org/x/net/ipv4/payload_nocmsg.go +42 -0
  390. data/ext/vendor/golang.org/x/net/ipv4/readwrite_go1_8_test.go +248 -0
  391. data/ext/vendor/golang.org/x/net/ipv4/readwrite_go1_9_test.go +388 -0
  392. data/ext/vendor/golang.org/x/net/ipv4/readwrite_test.go +140 -0
  393. data/ext/vendor/golang.org/x/net/ipv4/sockopt.go +44 -0
  394. data/ext/vendor/golang.org/x/net/ipv4/sockopt_posix.go +71 -0
  395. data/ext/vendor/golang.org/x/net/ipv4/sockopt_stub.go +42 -0
  396. data/ext/vendor/golang.org/x/net/ipv4/sys_asmreq.go +119 -0
  397. data/ext/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go +25 -0
  398. data/ext/vendor/golang.org/x/net/ipv4/sys_asmreqn.go +42 -0
  399. data/ext/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go +21 -0
  400. data/ext/vendor/golang.org/x/net/ipv4/sys_bpf.go +23 -0
  401. data/ext/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go +16 -0
  402. data/ext/vendor/golang.org/x/net/ipv4/sys_bsd.go +37 -0
  403. data/ext/vendor/golang.org/x/net/ipv4/sys_darwin.go +93 -0
  404. data/ext/vendor/golang.org/x/net/ipv4/sys_dragonfly.go +35 -0
  405. data/ext/vendor/golang.org/x/net/ipv4/sys_freebsd.go +76 -0
  406. data/ext/vendor/golang.org/x/net/ipv4/sys_linux.go +59 -0
  407. data/ext/vendor/golang.org/x/net/ipv4/sys_solaris.go +57 -0
  408. data/ext/vendor/golang.org/x/net/ipv4/sys_ssmreq.go +54 -0
  409. data/ext/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go +21 -0
  410. data/ext/vendor/golang.org/x/net/ipv4/sys_stub.go +13 -0
  411. data/ext/vendor/golang.org/x/net/ipv4/sys_windows.go +67 -0
  412. data/ext/vendor/golang.org/x/net/ipv4/unicast_test.go +247 -0
  413. data/ext/vendor/golang.org/x/net/ipv4/unicastsockopt_test.go +148 -0
  414. data/ext/vendor/golang.org/x/net/ipv4/zsys_darwin.go +99 -0
  415. data/ext/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go +31 -0
  416. data/ext/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go +93 -0
  417. data/ext/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go +95 -0
  418. data/ext/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go +95 -0
  419. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_386.go +148 -0
  420. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go +150 -0
  421. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go +148 -0
  422. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go +150 -0
  423. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go +148 -0
  424. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go +150 -0
  425. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go +150 -0
  426. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go +148 -0
  427. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go +148 -0
  428. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go +150 -0
  429. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go +150 -0
  430. data/ext/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go +150 -0
  431. data/ext/vendor/golang.org/x/net/ipv4/zsys_netbsd.go +30 -0
  432. data/ext/vendor/golang.org/x/net/ipv4/zsys_openbsd.go +30 -0
  433. data/ext/vendor/golang.org/x/net/ipv4/zsys_solaris.go +100 -0
  434. data/ext/vendor/golang.org/x/net/ipv6/batch.go +119 -0
  435. data/ext/vendor/golang.org/x/net/ipv6/bpf_test.go +96 -0
  436. data/ext/vendor/golang.org/x/net/ipv6/control.go +187 -0
  437. data/ext/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go +48 -0
  438. data/ext/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go +94 -0
  439. data/ext/vendor/golang.org/x/net/ipv6/control_stub.go +13 -0
  440. data/ext/vendor/golang.org/x/net/ipv6/control_test.go +21 -0
  441. data/ext/vendor/golang.org/x/net/ipv6/control_unix.go +55 -0
  442. data/ext/vendor/golang.org/x/net/ipv6/control_windows.go +16 -0
  443. data/ext/vendor/golang.org/x/net/ipv6/defs_darwin.go +112 -0
  444. data/ext/vendor/golang.org/x/net/ipv6/defs_dragonfly.go +84 -0
  445. data/ext/vendor/golang.org/x/net/ipv6/defs_freebsd.go +105 -0
  446. data/ext/vendor/golang.org/x/net/ipv6/defs_linux.go +147 -0
  447. data/ext/vendor/golang.org/x/net/ipv6/defs_netbsd.go +80 -0
  448. data/ext/vendor/golang.org/x/net/ipv6/defs_openbsd.go +89 -0
  449. data/ext/vendor/golang.org/x/net/ipv6/defs_solaris.go +114 -0
  450. data/ext/vendor/golang.org/x/net/ipv6/dgramopt.go +302 -0
  451. data/ext/vendor/golang.org/x/net/ipv6/doc.go +243 -0
  452. data/ext/vendor/golang.org/x/net/ipv6/endpoint.go +128 -0
  453. data/ext/vendor/golang.org/x/net/ipv6/example_test.go +216 -0
  454. data/ext/vendor/golang.org/x/net/ipv6/gen.go +199 -0
  455. data/ext/vendor/golang.org/x/net/ipv6/genericopt.go +58 -0
  456. data/ext/vendor/golang.org/x/net/ipv6/header.go +55 -0
  457. data/ext/vendor/golang.org/x/net/ipv6/header_test.go +55 -0
  458. data/ext/vendor/golang.org/x/net/ipv6/helper.go +57 -0
  459. data/ext/vendor/golang.org/x/net/ipv6/iana.go +82 -0
  460. data/ext/vendor/golang.org/x/net/ipv6/icmp.go +60 -0
  461. data/ext/vendor/golang.org/x/net/ipv6/icmp_bsd.go +29 -0
  462. data/ext/vendor/golang.org/x/net/ipv6/icmp_linux.go +27 -0
  463. data/ext/vendor/golang.org/x/net/ipv6/icmp_solaris.go +27 -0
  464. data/ext/vendor/golang.org/x/net/ipv6/icmp_stub.go +23 -0
  465. data/ext/vendor/golang.org/x/net/ipv6/icmp_test.go +96 -0
  466. data/ext/vendor/golang.org/x/net/ipv6/icmp_windows.go +22 -0
  467. data/ext/vendor/golang.org/x/net/ipv6/mocktransponder_test.go +32 -0
  468. data/ext/vendor/golang.org/x/net/ipv6/multicast_test.go +264 -0
  469. data/ext/vendor/golang.org/x/net/ipv6/multicastlistener_test.go +261 -0
  470. data/ext/vendor/golang.org/x/net/ipv6/multicastsockopt_test.go +157 -0
  471. data/ext/vendor/golang.org/x/net/ipv6/payload.go +23 -0
  472. data/ext/vendor/golang.org/x/net/ipv6/payload_cmsg.go +35 -0
  473. data/ext/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_8.go +55 -0
  474. data/ext/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_9.go +57 -0
  475. data/ext/vendor/golang.org/x/net/ipv6/payload_nocmsg.go +41 -0
  476. data/ext/vendor/golang.org/x/net/ipv6/readwrite_go1_8_test.go +242 -0
  477. data/ext/vendor/golang.org/x/net/ipv6/readwrite_go1_9_test.go +373 -0
  478. data/ext/vendor/golang.org/x/net/ipv6/readwrite_test.go +148 -0
  479. data/ext/vendor/golang.org/x/net/ipv6/sockopt.go +43 -0
  480. data/ext/vendor/golang.org/x/net/ipv6/sockopt_posix.go +87 -0
  481. data/ext/vendor/golang.org/x/net/ipv6/sockopt_stub.go +46 -0
  482. data/ext/vendor/golang.org/x/net/ipv6/sockopt_test.go +133 -0
  483. data/ext/vendor/golang.org/x/net/ipv6/sys_asmreq.go +24 -0
  484. data/ext/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go +17 -0
  485. data/ext/vendor/golang.org/x/net/ipv6/sys_bpf.go +23 -0
  486. data/ext/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go +16 -0
  487. data/ext/vendor/golang.org/x/net/ipv6/sys_bsd.go +57 -0
  488. data/ext/vendor/golang.org/x/net/ipv6/sys_darwin.go +106 -0
  489. data/ext/vendor/golang.org/x/net/ipv6/sys_freebsd.go +92 -0
  490. data/ext/vendor/golang.org/x/net/ipv6/sys_linux.go +74 -0
  491. data/ext/vendor/golang.org/x/net/ipv6/sys_solaris.go +74 -0
  492. data/ext/vendor/golang.org/x/net/ipv6/sys_ssmreq.go +54 -0
  493. data/ext/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go +21 -0
  494. data/ext/vendor/golang.org/x/net/ipv6/sys_stub.go +13 -0
  495. data/ext/vendor/golang.org/x/net/ipv6/sys_windows.go +75 -0
  496. data/ext/vendor/golang.org/x/net/ipv6/unicast_test.go +184 -0
  497. data/ext/vendor/golang.org/x/net/ipv6/unicastsockopt_test.go +120 -0
  498. data/ext/vendor/golang.org/x/net/ipv6/zsys_darwin.go +131 -0
  499. data/ext/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go +88 -0
  500. data/ext/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go +122 -0
  501. data/ext/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go +124 -0
  502. data/ext/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go +124 -0
  503. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_386.go +170 -0
  504. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go +172 -0
  505. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go +170 -0
  506. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go +172 -0
  507. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go +170 -0
  508. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go +172 -0
  509. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go +172 -0
  510. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go +170 -0
  511. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go +170 -0
  512. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go +172 -0
  513. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go +172 -0
  514. data/ext/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go +172 -0
  515. data/ext/vendor/golang.org/x/net/ipv6/zsys_netbsd.go +84 -0
  516. data/ext/vendor/golang.org/x/net/ipv6/zsys_openbsd.go +93 -0
  517. data/ext/vendor/golang.org/x/net/ipv6/zsys_solaris.go +131 -0
  518. data/ext/vendor/golang.org/x/net/lex/httplex/httplex.go +351 -0
  519. data/ext/vendor/golang.org/x/net/lex/httplex/httplex_test.go +119 -0
  520. data/ext/vendor/golang.org/x/net/lif/address.go +105 -0
  521. data/ext/vendor/golang.org/x/net/lif/address_test.go +123 -0
  522. data/ext/vendor/golang.org/x/net/lif/binary.go +115 -0
  523. data/ext/vendor/golang.org/x/net/lif/defs_solaris.go +90 -0
  524. data/ext/vendor/golang.org/x/net/lif/lif.go +43 -0
  525. data/ext/vendor/golang.org/x/net/lif/link.go +126 -0
  526. data/ext/vendor/golang.org/x/net/lif/link_test.go +63 -0
  527. data/ext/vendor/golang.org/x/net/lif/sys.go +21 -0
  528. data/ext/vendor/golang.org/x/net/lif/sys_solaris_amd64.s +8 -0
  529. data/ext/vendor/golang.org/x/net/lif/syscall.go +28 -0
  530. data/ext/vendor/golang.org/x/net/lif/zsys_solaris_amd64.go +103 -0
  531. data/ext/vendor/golang.org/x/net/nettest/conntest.go +456 -0
  532. data/ext/vendor/golang.org/x/net/nettest/conntest_go16.go +24 -0
  533. data/ext/vendor/golang.org/x/net/nettest/conntest_go17.go +24 -0
  534. data/ext/vendor/golang.org/x/net/nettest/conntest_test.go +76 -0
  535. data/ext/vendor/golang.org/x/net/netutil/listen.go +48 -0
  536. data/ext/vendor/golang.org/x/net/netutil/listen_test.go +101 -0
  537. data/ext/vendor/golang.org/x/net/proxy/direct.go +18 -0
  538. data/ext/vendor/golang.org/x/net/proxy/per_host.go +140 -0
  539. data/ext/vendor/golang.org/x/net/proxy/per_host_test.go +55 -0
  540. data/ext/vendor/golang.org/x/net/proxy/proxy.go +134 -0
  541. data/ext/vendor/golang.org/x/net/proxy/proxy_test.go +215 -0
  542. data/ext/vendor/golang.org/x/net/proxy/socks5.go +214 -0
  543. data/ext/vendor/golang.org/x/net/publicsuffix/gen.go +713 -0
  544. data/ext/vendor/golang.org/x/net/publicsuffix/list.go +135 -0
  545. data/ext/vendor/golang.org/x/net/publicsuffix/list_test.go +416 -0
  546. data/ext/vendor/golang.org/x/net/publicsuffix/table.go +9419 -0
  547. data/ext/vendor/golang.org/x/net/publicsuffix/table_test.go +16756 -0
  548. data/ext/vendor/golang.org/x/net/route/address.go +425 -0
  549. data/ext/vendor/golang.org/x/net/route/address_darwin_test.go +63 -0
  550. data/ext/vendor/golang.org/x/net/route/address_test.go +103 -0
  551. data/ext/vendor/golang.org/x/net/route/binary.go +90 -0
  552. data/ext/vendor/golang.org/x/net/route/defs_darwin.go +114 -0
  553. data/ext/vendor/golang.org/x/net/route/defs_dragonfly.go +113 -0
  554. data/ext/vendor/golang.org/x/net/route/defs_freebsd.go +337 -0
  555. data/ext/vendor/golang.org/x/net/route/defs_netbsd.go +112 -0
  556. data/ext/vendor/golang.org/x/net/route/defs_openbsd.go +116 -0
  557. data/ext/vendor/golang.org/x/net/route/interface.go +64 -0
  558. data/ext/vendor/golang.org/x/net/route/interface_announce.go +32 -0
  559. data/ext/vendor/golang.org/x/net/route/interface_classic.go +66 -0
  560. data/ext/vendor/golang.org/x/net/route/interface_freebsd.go +78 -0
  561. data/ext/vendor/golang.org/x/net/route/interface_multicast.go +30 -0
  562. data/ext/vendor/golang.org/x/net/route/interface_openbsd.go +90 -0
  563. data/ext/vendor/golang.org/x/net/route/message.go +72 -0
  564. data/ext/vendor/golang.org/x/net/route/message_darwin_test.go +34 -0
  565. data/ext/vendor/golang.org/x/net/route/message_freebsd_test.go +92 -0
  566. data/ext/vendor/golang.org/x/net/route/message_test.go +239 -0
  567. data/ext/vendor/golang.org/x/net/route/route.go +123 -0
  568. data/ext/vendor/golang.org/x/net/route/route_classic.go +67 -0
  569. data/ext/vendor/golang.org/x/net/route/route_openbsd.go +65 -0
  570. data/ext/vendor/golang.org/x/net/route/route_test.go +390 -0
  571. data/ext/vendor/golang.org/x/net/route/sys.go +39 -0
  572. data/ext/vendor/golang.org/x/net/route/sys_darwin.go +87 -0
  573. data/ext/vendor/golang.org/x/net/route/sys_dragonfly.go +76 -0
  574. data/ext/vendor/golang.org/x/net/route/sys_freebsd.go +155 -0
  575. data/ext/vendor/golang.org/x/net/route/sys_netbsd.go +71 -0
  576. data/ext/vendor/golang.org/x/net/route/sys_openbsd.go +80 -0
  577. data/ext/vendor/golang.org/x/net/route/syscall.go +28 -0
  578. data/ext/vendor/golang.org/x/net/route/zsys_darwin.go +99 -0
  579. data/ext/vendor/golang.org/x/net/route/zsys_dragonfly.go +98 -0
  580. data/ext/vendor/golang.org/x/net/route/zsys_freebsd_386.go +126 -0
  581. data/ext/vendor/golang.org/x/net/route/zsys_freebsd_amd64.go +123 -0
  582. data/ext/vendor/golang.org/x/net/route/zsys_freebsd_arm.go +123 -0
  583. data/ext/vendor/golang.org/x/net/route/zsys_netbsd.go +97 -0
  584. data/ext/vendor/golang.org/x/net/route/zsys_openbsd.go +101 -0
  585. data/ext/vendor/golang.org/x/net/trace/events.go +532 -0
  586. data/ext/vendor/golang.org/x/net/trace/histogram.go +365 -0
  587. data/ext/vendor/golang.org/x/net/trace/histogram_test.go +325 -0
  588. data/ext/vendor/golang.org/x/net/trace/trace.go +1082 -0
  589. data/ext/vendor/golang.org/x/net/trace/trace_go16.go +21 -0
  590. data/ext/vendor/golang.org/x/net/trace/trace_go17.go +21 -0
  591. data/ext/vendor/golang.org/x/net/trace/trace_test.go +178 -0
  592. data/ext/vendor/golang.org/x/net/webdav/file.go +796 -0
  593. data/ext/vendor/golang.org/x/net/webdav/file_go1.6.go +17 -0
  594. data/ext/vendor/golang.org/x/net/webdav/file_go1.7.go +16 -0
  595. data/ext/vendor/golang.org/x/net/webdav/file_test.go +1184 -0
  596. data/ext/vendor/golang.org/x/net/webdav/if.go +173 -0
  597. data/ext/vendor/golang.org/x/net/webdav/if_test.go +322 -0
  598. data/ext/vendor/golang.org/x/net/webdav/internal/xml/README +11 -0
  599. data/ext/vendor/golang.org/x/net/webdav/internal/xml/atom_test.go +56 -0
  600. data/ext/vendor/golang.org/x/net/webdav/internal/xml/example_test.go +151 -0
  601. data/ext/vendor/golang.org/x/net/webdav/internal/xml/marshal.go +1223 -0
  602. data/ext/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go +1939 -0
  603. data/ext/vendor/golang.org/x/net/webdav/internal/xml/read.go +692 -0
  604. data/ext/vendor/golang.org/x/net/webdav/internal/xml/read_test.go +744 -0
  605. data/ext/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go +371 -0
  606. data/ext/vendor/golang.org/x/net/webdav/internal/xml/xml.go +1998 -0
  607. data/ext/vendor/golang.org/x/net/webdav/internal/xml/xml_test.go +752 -0
  608. data/ext/vendor/golang.org/x/net/webdav/litmus_test_server.go +94 -0
  609. data/ext/vendor/golang.org/x/net/webdav/lock.go +445 -0
  610. data/ext/vendor/golang.org/x/net/webdav/lock_test.go +731 -0
  611. data/ext/vendor/golang.org/x/net/webdav/prop.go +418 -0
  612. data/ext/vendor/golang.org/x/net/webdav/prop_test.go +613 -0
  613. data/ext/vendor/golang.org/x/net/webdav/webdav.go +702 -0
  614. data/ext/vendor/golang.org/x/net/webdav/webdav_test.go +344 -0
  615. data/ext/vendor/golang.org/x/net/webdav/xml.go +519 -0
  616. data/ext/vendor/golang.org/x/net/webdav/xml_test.go +906 -0
  617. data/ext/vendor/golang.org/x/net/websocket/client.go +106 -0
  618. data/ext/vendor/golang.org/x/net/websocket/dial.go +24 -0
  619. data/ext/vendor/golang.org/x/net/websocket/dial_test.go +43 -0
  620. data/ext/vendor/golang.org/x/net/websocket/exampledial_test.go +31 -0
  621. data/ext/vendor/golang.org/x/net/websocket/examplehandler_test.go +26 -0
  622. data/ext/vendor/golang.org/x/net/websocket/hybi.go +583 -0
  623. data/ext/vendor/golang.org/x/net/websocket/hybi_test.go +608 -0
  624. data/ext/vendor/golang.org/x/net/websocket/server.go +113 -0
  625. data/ext/vendor/golang.org/x/net/websocket/websocket.go +448 -0
  626. data/ext/vendor/golang.org/x/net/websocket/websocket_test.go +665 -0
  627. data/ext/vendor/golang.org/x/net/xsrftoken/xsrf.go +94 -0
  628. data/ext/vendor/golang.org/x/net/xsrftoken/xsrf_test.go +83 -0
  629. data/ext/vendor/golang.org/x/text/AUTHORS +3 -0
  630. data/ext/vendor/golang.org/x/text/CONTRIBUTING.md +31 -0
  631. data/ext/vendor/golang.org/x/text/CONTRIBUTORS +3 -0
  632. data/ext/vendor/golang.org/x/text/LICENSE +27 -0
  633. data/ext/vendor/golang.org/x/text/PATENTS +22 -0
  634. data/ext/vendor/golang.org/x/text/README.md +91 -0
  635. data/ext/vendor/golang.org/x/text/cases/cases.go +162 -0
  636. data/ext/vendor/golang.org/x/text/cases/context.go +376 -0
  637. data/ext/vendor/golang.org/x/text/cases/context_test.go +438 -0
  638. data/ext/vendor/golang.org/x/text/cases/example_test.go +53 -0
  639. data/ext/vendor/golang.org/x/text/cases/fold.go +34 -0
  640. data/ext/vendor/golang.org/x/text/cases/fold_test.go +51 -0
  641. data/ext/vendor/golang.org/x/text/cases/gen.go +839 -0
  642. data/ext/vendor/golang.org/x/text/cases/gen_trieval.go +219 -0
  643. data/ext/vendor/golang.org/x/text/cases/icu.go +61 -0
  644. data/ext/vendor/golang.org/x/text/cases/icu_test.go +210 -0
  645. data/ext/vendor/golang.org/x/text/cases/info.go +82 -0
  646. data/ext/vendor/golang.org/x/text/cases/map.go +816 -0
  647. data/ext/vendor/golang.org/x/text/cases/map_test.go +950 -0
  648. data/ext/vendor/golang.org/x/text/cases/tables.go +2251 -0
  649. data/ext/vendor/golang.org/x/text/cases/tables_test.go +1158 -0
  650. data/ext/vendor/golang.org/x/text/cases/trieval.go +215 -0
  651. data/ext/vendor/golang.org/x/text/cmd/gotext/doc.go +35 -0
  652. data/ext/vendor/golang.org/x/text/cmd/gotext/extract.go +195 -0
  653. data/ext/vendor/golang.org/x/text/cmd/gotext/main.go +356 -0
  654. data/ext/vendor/golang.org/x/text/cmd/gotext/message.go +127 -0
  655. data/ext/vendor/golang.org/x/text/codereview.cfg +1 -0
  656. data/ext/vendor/golang.org/x/text/collate/build/builder.go +702 -0
  657. data/ext/vendor/golang.org/x/text/collate/build/builder_test.go +290 -0
  658. data/ext/vendor/golang.org/x/text/collate/build/colelem.go +294 -0
  659. data/ext/vendor/golang.org/x/text/collate/build/colelem_test.go +215 -0
  660. data/ext/vendor/golang.org/x/text/collate/build/contract.go +309 -0
  661. data/ext/vendor/golang.org/x/text/collate/build/contract_test.go +266 -0
  662. data/ext/vendor/golang.org/x/text/collate/build/order.go +393 -0
  663. data/ext/vendor/golang.org/x/text/collate/build/order_test.go +229 -0
  664. data/ext/vendor/golang.org/x/text/collate/build/table.go +81 -0
  665. data/ext/vendor/golang.org/x/text/collate/build/trie.go +290 -0
  666. data/ext/vendor/golang.org/x/text/collate/build/trie_test.go +107 -0
  667. data/ext/vendor/golang.org/x/text/collate/collate.go +403 -0
  668. data/ext/vendor/golang.org/x/text/collate/collate_test.go +482 -0
  669. data/ext/vendor/golang.org/x/text/collate/export_test.go +51 -0
  670. data/ext/vendor/golang.org/x/text/collate/index.go +32 -0
  671. data/ext/vendor/golang.org/x/text/collate/maketables.go +553 -0
  672. data/ext/vendor/golang.org/x/text/collate/option.go +239 -0
  673. data/ext/vendor/golang.org/x/text/collate/option_test.go +209 -0
  674. data/ext/vendor/golang.org/x/text/collate/reg_test.go +230 -0
  675. data/ext/vendor/golang.org/x/text/collate/sort.go +81 -0
  676. data/ext/vendor/golang.org/x/text/collate/sort_test.go +55 -0
  677. data/ext/vendor/golang.org/x/text/collate/table_test.go +291 -0
  678. data/ext/vendor/golang.org/x/text/collate/tables.go +73789 -0
  679. data/ext/vendor/golang.org/x/text/collate/tools/colcmp/Makefile +7 -0
  680. data/ext/vendor/golang.org/x/text/collate/tools/colcmp/chars.go +1156 -0
  681. data/ext/vendor/golang.org/x/text/collate/tools/colcmp/col.go +97 -0
  682. data/ext/vendor/golang.org/x/text/collate/tools/colcmp/colcmp.go +529 -0
  683. data/ext/vendor/golang.org/x/text/collate/tools/colcmp/darwin.go +111 -0
  684. data/ext/vendor/golang.org/x/text/collate/tools/colcmp/gen.go +183 -0
  685. data/ext/vendor/golang.org/x/text/collate/tools/colcmp/icu.go +209 -0
  686. data/ext/vendor/golang.org/x/text/currency/common.go +66 -0
  687. data/ext/vendor/golang.org/x/text/currency/currency.go +185 -0
  688. data/ext/vendor/golang.org/x/text/currency/currency_test.go +171 -0
  689. data/ext/vendor/golang.org/x/text/currency/example_test.go +27 -0
  690. data/ext/vendor/golang.org/x/text/currency/format.go +215 -0
  691. data/ext/vendor/golang.org/x/text/currency/format_test.go +70 -0
  692. data/ext/vendor/golang.org/x/text/currency/gen.go +400 -0
  693. data/ext/vendor/golang.org/x/text/currency/gen_common.go +70 -0
  694. data/ext/vendor/golang.org/x/text/currency/query.go +152 -0
  695. data/ext/vendor/golang.org/x/text/currency/query_test.go +107 -0
  696. data/ext/vendor/golang.org/x/text/currency/tables.go +2574 -0
  697. data/ext/vendor/golang.org/x/text/currency/tables_test.go +93 -0
  698. data/ext/vendor/golang.org/x/text/doc.go +13 -0
  699. data/ext/vendor/golang.org/x/text/encoding/charmap/charmap.go +249 -0
  700. data/ext/vendor/golang.org/x/text/encoding/charmap/charmap_test.go +258 -0
  701. data/ext/vendor/golang.org/x/text/encoding/charmap/maketables.go +556 -0
  702. data/ext/vendor/golang.org/x/text/encoding/charmap/tables.go +7410 -0
  703. data/ext/vendor/golang.org/x/text/encoding/encoding.go +335 -0
  704. data/ext/vendor/golang.org/x/text/encoding/encoding_test.go +290 -0
  705. data/ext/vendor/golang.org/x/text/encoding/example_test.go +42 -0
  706. data/ext/vendor/golang.org/x/text/encoding/htmlindex/gen.go +173 -0
  707. data/ext/vendor/golang.org/x/text/encoding/htmlindex/htmlindex.go +86 -0
  708. data/ext/vendor/golang.org/x/text/encoding/htmlindex/htmlindex_test.go +144 -0
  709. data/ext/vendor/golang.org/x/text/encoding/htmlindex/map.go +105 -0
  710. data/ext/vendor/golang.org/x/text/encoding/htmlindex/tables.go +352 -0
  711. data/ext/vendor/golang.org/x/text/encoding/ianaindex/example_test.go +27 -0
  712. data/ext/vendor/golang.org/x/text/encoding/ianaindex/gen.go +192 -0
  713. data/ext/vendor/golang.org/x/text/encoding/ianaindex/ianaindex.go +209 -0
  714. data/ext/vendor/golang.org/x/text/encoding/ianaindex/ianaindex_test.go +192 -0
  715. data/ext/vendor/golang.org/x/text/encoding/ianaindex/tables.go +2348 -0
  716. data/ext/vendor/golang.org/x/text/encoding/internal/enctest/enctest.go +180 -0
  717. data/ext/vendor/golang.org/x/text/encoding/internal/identifier/gen.go +137 -0
  718. data/ext/vendor/golang.org/x/text/encoding/internal/identifier/identifier.go +81 -0
  719. data/ext/vendor/golang.org/x/text/encoding/internal/identifier/mib.go +1621 -0
  720. data/ext/vendor/golang.org/x/text/encoding/internal/internal.go +75 -0
  721. data/ext/vendor/golang.org/x/text/encoding/japanese/all.go +12 -0
  722. data/ext/vendor/golang.org/x/text/encoding/japanese/all_test.go +248 -0
  723. data/ext/vendor/golang.org/x/text/encoding/japanese/eucjp.go +225 -0
  724. data/ext/vendor/golang.org/x/text/encoding/japanese/iso2022jp.go +299 -0
  725. data/ext/vendor/golang.org/x/text/encoding/japanese/maketables.go +161 -0
  726. data/ext/vendor/golang.org/x/text/encoding/japanese/shiftjis.go +189 -0
  727. data/ext/vendor/golang.org/x/text/encoding/japanese/tables.go +26971 -0
  728. data/ext/vendor/golang.org/x/text/encoding/korean/all_test.go +94 -0
  729. data/ext/vendor/golang.org/x/text/encoding/korean/euckr.go +177 -0
  730. data/ext/vendor/golang.org/x/text/encoding/korean/maketables.go +143 -0
  731. data/ext/vendor/golang.org/x/text/encoding/korean/tables.go +34152 -0
  732. data/ext/vendor/golang.org/x/text/encoding/simplifiedchinese/all.go +12 -0
  733. data/ext/vendor/golang.org/x/text/encoding/simplifiedchinese/all_test.go +143 -0
  734. data/ext/vendor/golang.org/x/text/encoding/simplifiedchinese/gbk.go +269 -0
  735. data/ext/vendor/golang.org/x/text/encoding/simplifiedchinese/hzgb2312.go +245 -0
  736. data/ext/vendor/golang.org/x/text/encoding/simplifiedchinese/maketables.go +161 -0
  737. data/ext/vendor/golang.org/x/text/encoding/simplifiedchinese/tables.go +43999 -0
  738. data/ext/vendor/golang.org/x/text/encoding/testdata/candide-gb18030.txt +510 -0
  739. data/ext/vendor/golang.org/x/text/encoding/testdata/candide-utf-16le.txt +0 -0
  740. data/ext/vendor/golang.org/x/text/encoding/testdata/candide-utf-32be.txt +0 -0
  741. data/ext/vendor/golang.org/x/text/encoding/testdata/candide-utf-8.txt +510 -0
  742. data/ext/vendor/golang.org/x/text/encoding/testdata/candide-windows-1252.txt +510 -0
  743. data/ext/vendor/golang.org/x/text/encoding/testdata/rashomon-euc-jp.txt +178 -0
  744. data/ext/vendor/golang.org/x/text/encoding/testdata/rashomon-iso-2022-jp.txt +178 -0
  745. data/ext/vendor/golang.org/x/text/encoding/testdata/rashomon-shift-jis.txt +178 -0
  746. data/ext/vendor/golang.org/x/text/encoding/testdata/rashomon-utf-8.txt +178 -0
  747. data/ext/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-gb-levels-1-and-2-hz-gb2312.txt +107 -0
  748. data/ext/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-gb-levels-1-and-2-utf-8.txt +107 -0
  749. data/ext/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-simplified-gbk.txt +107 -0
  750. data/ext/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-simplified-utf-8.txt +107 -0
  751. data/ext/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-traditional-big5.txt +106 -0
  752. data/ext/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-traditional-utf-8.txt +106 -0
  753. data/ext/vendor/golang.org/x/text/encoding/testdata/unsu-joh-eun-nal-euc-kr.txt +175 -0
  754. data/ext/vendor/golang.org/x/text/encoding/testdata/unsu-joh-eun-nal-utf-8.txt +175 -0
  755. data/ext/vendor/golang.org/x/text/encoding/traditionalchinese/all_test.go +114 -0
  756. data/ext/vendor/golang.org/x/text/encoding/traditionalchinese/big5.go +199 -0
  757. data/ext/vendor/golang.org/x/text/encoding/traditionalchinese/maketables.go +140 -0
  758. data/ext/vendor/golang.org/x/text/encoding/traditionalchinese/tables.go +37142 -0
  759. data/ext/vendor/golang.org/x/text/encoding/unicode/override.go +82 -0
  760. data/ext/vendor/golang.org/x/text/encoding/unicode/unicode.go +434 -0
  761. data/ext/vendor/golang.org/x/text/encoding/unicode/unicode_test.go +499 -0
  762. data/ext/vendor/golang.org/x/text/encoding/unicode/utf32/utf32.go +296 -0
  763. data/ext/vendor/golang.org/x/text/encoding/unicode/utf32/utf32_test.go +248 -0
  764. data/ext/vendor/golang.org/x/text/feature/plural/common.go +70 -0
  765. data/ext/vendor/golang.org/x/text/feature/plural/data_test.go +190 -0
  766. data/ext/vendor/golang.org/x/text/feature/plural/example_test.go +46 -0
  767. data/ext/vendor/golang.org/x/text/feature/plural/gen.go +513 -0
  768. data/ext/vendor/golang.org/x/text/feature/plural/gen_common.go +74 -0
  769. data/ext/vendor/golang.org/x/text/feature/plural/message.go +244 -0
  770. data/ext/vendor/golang.org/x/text/feature/plural/message_test.go +197 -0
  771. data/ext/vendor/golang.org/x/text/feature/plural/plural.go +258 -0
  772. data/ext/vendor/golang.org/x/text/feature/plural/plural_test.go +216 -0
  773. data/ext/vendor/golang.org/x/text/feature/plural/tables.go +540 -0
  774. data/ext/vendor/golang.org/x/text/gen.go +318 -0
  775. data/ext/vendor/golang.org/x/text/internal/catmsg/catmsg.go +366 -0
  776. data/ext/vendor/golang.org/x/text/internal/catmsg/catmsg_test.go +316 -0
  777. data/ext/vendor/golang.org/x/text/internal/catmsg/codec.go +407 -0
  778. data/ext/vendor/golang.org/x/text/internal/catmsg/varint.go +62 -0
  779. data/ext/vendor/golang.org/x/text/internal/catmsg/varint_test.go +123 -0
  780. data/ext/vendor/golang.org/x/text/internal/colltab/collate_test.go +121 -0
  781. data/ext/vendor/golang.org/x/text/internal/colltab/collelem.go +371 -0
  782. data/ext/vendor/golang.org/x/text/internal/colltab/collelem_test.go +183 -0
  783. data/ext/vendor/golang.org/x/text/internal/colltab/colltab.go +105 -0
  784. data/ext/vendor/golang.org/x/text/internal/colltab/colltab_test.go +64 -0
  785. data/ext/vendor/golang.org/x/text/internal/colltab/contract.go +145 -0
  786. data/ext/vendor/golang.org/x/text/internal/colltab/contract_test.go +131 -0
  787. data/ext/vendor/golang.org/x/text/internal/colltab/iter.go +178 -0
  788. data/ext/vendor/golang.org/x/text/internal/colltab/iter_test.go +63 -0
  789. data/ext/vendor/golang.org/x/text/internal/colltab/numeric.go +236 -0
  790. data/ext/vendor/golang.org/x/text/internal/colltab/numeric_test.go +159 -0
  791. data/ext/vendor/golang.org/x/text/internal/colltab/table.go +275 -0
  792. data/ext/vendor/golang.org/x/text/internal/colltab/trie.go +159 -0
  793. data/ext/vendor/golang.org/x/text/internal/colltab/trie_test.go +106 -0
  794. data/ext/vendor/golang.org/x/text/internal/colltab/weighter.go +31 -0
  795. data/ext/vendor/golang.org/x/text/internal/colltab/weighter_test.go +42 -0
  796. data/ext/vendor/golang.org/x/text/internal/export/README +4 -0
  797. data/ext/vendor/golang.org/x/text/internal/export/idna/common_test.go +55 -0
  798. data/ext/vendor/golang.org/x/text/internal/export/idna/example_test.go +68 -0
  799. data/ext/vendor/golang.org/x/text/internal/export/idna/gen.go +276 -0
  800. data/ext/vendor/golang.org/x/text/internal/export/idna/gen_common.go +59 -0
  801. data/ext/vendor/golang.org/x/text/internal/export/idna/gen_test.go +91 -0
  802. data/ext/vendor/golang.org/x/text/internal/export/idna/gen_trieval.go +123 -0
  803. data/ext/vendor/golang.org/x/text/internal/export/idna/idna.go +717 -0
  804. data/ext/vendor/golang.org/x/text/internal/export/idna/idna_test.go +308 -0
  805. data/ext/vendor/golang.org/x/text/internal/export/idna/punycode.go +201 -0
  806. data/ext/vendor/golang.org/x/text/internal/export/idna/punycode_test.go +198 -0
  807. data/ext/vendor/golang.org/x/text/internal/export/idna/tables.go +4557 -0
  808. data/ext/vendor/golang.org/x/text/internal/export/idna/trie.go +70 -0
  809. data/ext/vendor/golang.org/x/text/internal/export/idna/trieval.go +119 -0
  810. data/ext/vendor/golang.org/x/text/internal/format/format.go +41 -0
  811. data/ext/vendor/golang.org/x/text/internal/gen.go +52 -0
  812. data/ext/vendor/golang.org/x/text/internal/gen/code.go +351 -0
  813. data/ext/vendor/golang.org/x/text/internal/gen/gen.go +281 -0
  814. data/ext/vendor/golang.org/x/text/internal/gen_test.go +38 -0
  815. data/ext/vendor/golang.org/x/text/internal/internal.go +51 -0
  816. data/ext/vendor/golang.org/x/text/internal/internal_test.go +38 -0
  817. data/ext/vendor/golang.org/x/text/internal/match.go +67 -0
  818. data/ext/vendor/golang.org/x/text/internal/match_test.go +56 -0
  819. data/ext/vendor/golang.org/x/text/internal/number/common.go +40 -0
  820. data/ext/vendor/golang.org/x/text/internal/number/decimal.go +498 -0
  821. data/ext/vendor/golang.org/x/text/internal/number/decimal_test.go +329 -0
  822. data/ext/vendor/golang.org/x/text/internal/number/format.go +540 -0
  823. data/ext/vendor/golang.org/x/text/internal/number/format_test.go +522 -0
  824. data/ext/vendor/golang.org/x/text/internal/number/gen.go +458 -0
  825. data/ext/vendor/golang.org/x/text/internal/number/gen_common.go +44 -0
  826. data/ext/vendor/golang.org/x/text/internal/number/number.go +154 -0
  827. data/ext/vendor/golang.org/x/text/internal/number/number_test.go +100 -0
  828. data/ext/vendor/golang.org/x/text/internal/number/pattern.go +485 -0
  829. data/ext/vendor/golang.org/x/text/internal/number/pattern_test.go +438 -0
  830. data/ext/vendor/golang.org/x/text/internal/number/roundingmode_string.go +16 -0
  831. data/ext/vendor/golang.org/x/text/internal/number/tables.go +1154 -0
  832. data/ext/vendor/golang.org/x/text/internal/number/tables_test.go +125 -0
  833. data/ext/vendor/golang.org/x/text/internal/stringset/set.go +86 -0
  834. data/ext/vendor/golang.org/x/text/internal/stringset/set_test.go +53 -0
  835. data/ext/vendor/golang.org/x/text/internal/tables.go +117 -0
  836. data/ext/vendor/golang.org/x/text/internal/tag/tag.go +100 -0
  837. data/ext/vendor/golang.org/x/text/internal/tag/tag_test.go +67 -0
  838. data/ext/vendor/golang.org/x/text/internal/testtext/codesize.go +53 -0
  839. data/ext/vendor/golang.org/x/text/internal/testtext/flag.go +22 -0
  840. data/ext/vendor/golang.org/x/text/internal/testtext/gc.go +14 -0
  841. data/ext/vendor/golang.org/x/text/internal/testtext/gccgo.go +11 -0
  842. data/ext/vendor/golang.org/x/text/internal/testtext/go1_6.go +23 -0
  843. data/ext/vendor/golang.org/x/text/internal/testtext/go1_7.go +17 -0
  844. data/ext/vendor/golang.org/x/text/internal/testtext/text.go +105 -0
  845. data/ext/vendor/golang.org/x/text/internal/triegen/compact.go +58 -0
  846. data/ext/vendor/golang.org/x/text/internal/triegen/data_test.go +875 -0
  847. data/ext/vendor/golang.org/x/text/internal/triegen/example_compact_test.go +71 -0
  848. data/ext/vendor/golang.org/x/text/internal/triegen/example_test.go +148 -0
  849. data/ext/vendor/golang.org/x/text/internal/triegen/gen_test.go +68 -0
  850. data/ext/vendor/golang.org/x/text/internal/triegen/print.go +251 -0
  851. data/ext/vendor/golang.org/x/text/internal/triegen/triegen.go +494 -0
  852. data/ext/vendor/golang.org/x/text/internal/ucd/example_test.go +81 -0
  853. data/ext/vendor/golang.org/x/text/internal/ucd/ucd.go +371 -0
  854. data/ext/vendor/golang.org/x/text/internal/ucd/ucd_test.go +105 -0
  855. data/ext/vendor/golang.org/x/text/internal/utf8internal/utf8internal.go +87 -0
  856. data/ext/vendor/golang.org/x/text/language/Makefile +16 -0
  857. data/ext/vendor/golang.org/x/text/language/common.go +16 -0
  858. data/ext/vendor/golang.org/x/text/language/coverage.go +197 -0
  859. data/ext/vendor/golang.org/x/text/language/coverage_test.go +154 -0
  860. data/ext/vendor/golang.org/x/text/language/display/dict.go +92 -0
  861. data/ext/vendor/golang.org/x/text/language/display/dict_test.go +39 -0
  862. data/ext/vendor/golang.org/x/text/language/display/display.go +420 -0
  863. data/ext/vendor/golang.org/x/text/language/display/display_test.go +705 -0
  864. data/ext/vendor/golang.org/x/text/language/display/examples_test.go +116 -0
  865. data/ext/vendor/golang.org/x/text/language/display/lookup.go +251 -0
  866. data/ext/vendor/golang.org/x/text/language/display/maketables.go +602 -0
  867. data/ext/vendor/golang.org/x/text/language/display/tables.go +50344 -0
  868. data/ext/vendor/golang.org/x/text/language/doc.go +102 -0
  869. data/ext/vendor/golang.org/x/text/language/examples_test.go +413 -0
  870. data/ext/vendor/golang.org/x/text/language/gen.go +1706 -0
  871. data/ext/vendor/golang.org/x/text/language/gen_common.go +20 -0
  872. data/ext/vendor/golang.org/x/text/language/gen_index.go +162 -0
  873. data/ext/vendor/golang.org/x/text/language/go1_1.go +38 -0
  874. data/ext/vendor/golang.org/x/text/language/go1_2.go +11 -0
  875. data/ext/vendor/golang.org/x/text/language/httpexample_test.go +48 -0
  876. data/ext/vendor/golang.org/x/text/language/index.go +769 -0
  877. data/ext/vendor/golang.org/x/text/language/language.go +887 -0
  878. data/ext/vendor/golang.org/x/text/language/language_test.go +878 -0
  879. data/ext/vendor/golang.org/x/text/language/lookup.go +396 -0
  880. data/ext/vendor/golang.org/x/text/language/lookup_test.go +457 -0
  881. data/ext/vendor/golang.org/x/text/language/match.go +933 -0
  882. data/ext/vendor/golang.org/x/text/language/match_test.go +505 -0
  883. data/ext/vendor/golang.org/x/text/language/parse.go +859 -0
  884. data/ext/vendor/golang.org/x/text/language/parse_test.go +517 -0
  885. data/ext/vendor/golang.org/x/text/language/tables.go +3675 -0
  886. data/ext/vendor/golang.org/x/text/language/tags.go +143 -0
  887. data/ext/vendor/golang.org/x/text/language/testdata/CLDRLocaleMatcherTest.txt +389 -0
  888. data/ext/vendor/golang.org/x/text/language/testdata/GoLocaleMatcherTest.txt +226 -0
  889. data/ext/vendor/golang.org/x/text/message/catalog.go +28 -0
  890. data/ext/vendor/golang.org/x/text/message/catalog/catalog.go +292 -0
  891. data/ext/vendor/golang.org/x/text/message/catalog/catalog_test.go +194 -0
  892. data/ext/vendor/golang.org/x/text/message/catalog/dict.go +90 -0
  893. data/ext/vendor/golang.org/x/text/message/doc.go +100 -0
  894. data/ext/vendor/golang.org/x/text/message/examples_test.go +42 -0
  895. data/ext/vendor/golang.org/x/text/message/fmt_test.go +1889 -0
  896. data/ext/vendor/golang.org/x/text/message/format.go +532 -0
  897. data/ext/vendor/golang.org/x/text/message/message.go +169 -0
  898. data/ext/vendor/golang.org/x/text/message/message_test.go +181 -0
  899. data/ext/vendor/golang.org/x/text/message/print.go +1194 -0
  900. data/ext/vendor/golang.org/x/text/number/doc.go +28 -0
  901. data/ext/vendor/golang.org/x/text/number/examples_test.go +28 -0
  902. data/ext/vendor/golang.org/x/text/number/format.go +122 -0
  903. data/ext/vendor/golang.org/x/text/number/format_test.go +107 -0
  904. data/ext/vendor/golang.org/x/text/number/number.go +77 -0
  905. data/ext/vendor/golang.org/x/text/number/number_test.go +190 -0
  906. data/ext/vendor/golang.org/x/text/number/option.go +177 -0
  907. data/ext/vendor/golang.org/x/text/runes/cond.go +187 -0
  908. data/ext/vendor/golang.org/x/text/runes/cond_test.go +282 -0
  909. data/ext/vendor/golang.org/x/text/runes/example_test.go +60 -0
  910. data/ext/vendor/golang.org/x/text/runes/runes.go +355 -0
  911. data/ext/vendor/golang.org/x/text/runes/runes_test.go +664 -0
  912. data/ext/vendor/golang.org/x/text/search/index.go +35 -0
  913. data/ext/vendor/golang.org/x/text/search/pattern.go +155 -0
  914. data/ext/vendor/golang.org/x/text/search/pattern_test.go +357 -0
  915. data/ext/vendor/golang.org/x/text/search/search.go +237 -0
  916. data/ext/vendor/golang.org/x/text/search/tables.go +12448 -0
  917. data/ext/vendor/golang.org/x/text/secure/bidirule/bench_test.go +54 -0
  918. data/ext/vendor/golang.org/x/text/secure/bidirule/bidirule.go +340 -0
  919. data/ext/vendor/golang.org/x/text/secure/bidirule/bidirule_test.go +851 -0
  920. data/ext/vendor/golang.org/x/text/secure/doc.go +6 -0
  921. data/ext/vendor/golang.org/x/text/secure/precis/benchmark_test.go +82 -0
  922. data/ext/vendor/golang.org/x/text/secure/precis/class.go +36 -0
  923. data/ext/vendor/golang.org/x/text/secure/precis/class_test.go +50 -0
  924. data/ext/vendor/golang.org/x/text/secure/precis/context.go +139 -0
  925. data/ext/vendor/golang.org/x/text/secure/precis/doc.go +14 -0
  926. data/ext/vendor/golang.org/x/text/secure/precis/enforce_test.go +396 -0
  927. data/ext/vendor/golang.org/x/text/secure/precis/gen.go +310 -0
  928. data/ext/vendor/golang.org/x/text/secure/precis/gen_trieval.go +68 -0
  929. data/ext/vendor/golang.org/x/text/secure/precis/nickname.go +72 -0
  930. data/ext/vendor/golang.org/x/text/secure/precis/options.go +157 -0
  931. data/ext/vendor/golang.org/x/text/secure/precis/profile.go +402 -0
  932. data/ext/vendor/golang.org/x/text/secure/precis/profile_test.go +149 -0
  933. data/ext/vendor/golang.org/x/text/secure/precis/profiles.go +78 -0
  934. data/ext/vendor/golang.org/x/text/secure/precis/tables.go +3887 -0
  935. data/ext/vendor/golang.org/x/text/secure/precis/tables_test.go +69 -0
  936. data/ext/vendor/golang.org/x/text/secure/precis/transformer.go +32 -0
  937. data/ext/vendor/golang.org/x/text/secure/precis/trieval.go +64 -0
  938. data/ext/vendor/golang.org/x/text/transform/examples_test.go +37 -0
  939. data/ext/vendor/golang.org/x/text/transform/transform.go +705 -0
  940. data/ext/vendor/golang.org/x/text/transform/transform_test.go +1317 -0
  941. data/ext/vendor/golang.org/x/text/unicode/bidi/bidi.go +198 -0
  942. data/ext/vendor/golang.org/x/text/unicode/bidi/bracket.go +335 -0
  943. data/ext/vendor/golang.org/x/text/unicode/bidi/core.go +1058 -0
  944. data/ext/vendor/golang.org/x/text/unicode/bidi/core_test.go +224 -0
  945. data/ext/vendor/golang.org/x/text/unicode/bidi/gen.go +133 -0
  946. data/ext/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go +57 -0
  947. data/ext/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go +64 -0
  948. data/ext/vendor/golang.org/x/text/unicode/bidi/prop.go +206 -0
  949. data/ext/vendor/golang.org/x/text/unicode/bidi/ranges_test.go +53 -0
  950. data/ext/vendor/golang.org/x/text/unicode/bidi/tables.go +1813 -0
  951. data/ext/vendor/golang.org/x/text/unicode/bidi/tables_test.go +82 -0
  952. data/ext/vendor/golang.org/x/text/unicode/bidi/trieval.go +60 -0
  953. data/ext/vendor/golang.org/x/text/unicode/cldr/base.go +100 -0
  954. data/ext/vendor/golang.org/x/text/unicode/cldr/cldr.go +130 -0
  955. data/ext/vendor/golang.org/x/text/unicode/cldr/cldr_test.go +27 -0
  956. data/ext/vendor/golang.org/x/text/unicode/cldr/collate.go +359 -0
  957. data/ext/vendor/golang.org/x/text/unicode/cldr/collate_test.go +275 -0
  958. data/ext/vendor/golang.org/x/text/unicode/cldr/data_test.go +186 -0
  959. data/ext/vendor/golang.org/x/text/unicode/cldr/decode.go +171 -0
  960. data/ext/vendor/golang.org/x/text/unicode/cldr/examples_test.go +21 -0
  961. data/ext/vendor/golang.org/x/text/unicode/cldr/makexml.go +400 -0
  962. data/ext/vendor/golang.org/x/text/unicode/cldr/resolve.go +602 -0
  963. data/ext/vendor/golang.org/x/text/unicode/cldr/resolve_test.go +368 -0
  964. data/ext/vendor/golang.org/x/text/unicode/cldr/slice.go +144 -0
  965. data/ext/vendor/golang.org/x/text/unicode/cldr/slice_test.go +175 -0
  966. data/ext/vendor/golang.org/x/text/unicode/cldr/xml.go +1487 -0
  967. data/ext/vendor/golang.org/x/text/unicode/doc.go +8 -0
  968. data/ext/vendor/golang.org/x/text/unicode/norm/composition.go +508 -0
  969. data/ext/vendor/golang.org/x/text/unicode/norm/composition_test.go +130 -0
  970. data/ext/vendor/golang.org/x/text/unicode/norm/example_iter_test.go +82 -0
  971. data/ext/vendor/golang.org/x/text/unicode/norm/example_test.go +27 -0
  972. data/ext/vendor/golang.org/x/text/unicode/norm/forminfo.go +259 -0
  973. data/ext/vendor/golang.org/x/text/unicode/norm/forminfo_test.go +54 -0
  974. data/ext/vendor/golang.org/x/text/unicode/norm/input.go +109 -0
  975. data/ext/vendor/golang.org/x/text/unicode/norm/iter.go +457 -0
  976. data/ext/vendor/golang.org/x/text/unicode/norm/iter_test.go +98 -0
  977. data/ext/vendor/golang.org/x/text/unicode/norm/maketables.go +976 -0
  978. data/ext/vendor/golang.org/x/text/unicode/norm/norm_test.go +14 -0
  979. data/ext/vendor/golang.org/x/text/unicode/norm/normalize.go +609 -0
  980. data/ext/vendor/golang.org/x/text/unicode/norm/normalize_test.go +1287 -0
  981. data/ext/vendor/golang.org/x/text/unicode/norm/readwriter.go +125 -0
  982. data/ext/vendor/golang.org/x/text/unicode/norm/readwriter_test.go +56 -0
  983. data/ext/vendor/golang.org/x/text/unicode/norm/tables.go +7651 -0
  984. data/ext/vendor/golang.org/x/text/unicode/norm/transform.go +88 -0
  985. data/ext/vendor/golang.org/x/text/unicode/norm/transform_test.go +101 -0
  986. data/ext/vendor/golang.org/x/text/unicode/norm/trie.go +54 -0
  987. data/ext/vendor/golang.org/x/text/unicode/norm/triegen.go +117 -0
  988. data/ext/vendor/golang.org/x/text/unicode/norm/ucd_test.go +275 -0
  989. data/ext/vendor/golang.org/x/text/unicode/rangetable/gen.go +115 -0
  990. data/ext/vendor/golang.org/x/text/unicode/rangetable/merge.go +260 -0
  991. data/ext/vendor/golang.org/x/text/unicode/rangetable/merge_test.go +184 -0
  992. data/ext/vendor/golang.org/x/text/unicode/rangetable/rangetable.go +70 -0
  993. data/ext/vendor/golang.org/x/text/unicode/rangetable/rangetable_test.go +55 -0
  994. data/ext/vendor/golang.org/x/text/unicode/rangetable/tables.go +6376 -0
  995. data/ext/vendor/golang.org/x/text/unicode/runenames/bits.go +59 -0
  996. data/ext/vendor/golang.org/x/text/unicode/runenames/example_test.go +118 -0
  997. data/ext/vendor/golang.org/x/text/unicode/runenames/gen.go +195 -0
  998. data/ext/vendor/golang.org/x/text/unicode/runenames/gen_bits.go +63 -0
  999. data/ext/vendor/golang.org/x/text/unicode/runenames/runenames.go +48 -0
  1000. data/ext/vendor/golang.org/x/text/unicode/runenames/runenames_test.go +46 -0
  1001. data/ext/vendor/golang.org/x/text/unicode/runenames/tables.go +15514 -0
  1002. data/ext/vendor/golang.org/x/text/width/common_test.go +92 -0
  1003. data/ext/vendor/golang.org/x/text/width/example_test.go +52 -0
  1004. data/ext/vendor/golang.org/x/text/width/gen.go +115 -0
  1005. data/ext/vendor/golang.org/x/text/width/gen_common.go +96 -0
  1006. data/ext/vendor/golang.org/x/text/width/gen_trieval.go +34 -0
  1007. data/ext/vendor/golang.org/x/text/width/kind_string.go +16 -0
  1008. data/ext/vendor/golang.org/x/text/width/runes_test.go +461 -0
  1009. data/ext/vendor/golang.org/x/text/width/tables.go +1316 -0
  1010. data/ext/vendor/golang.org/x/text/width/tables_test.go +59 -0
  1011. data/ext/vendor/golang.org/x/text/width/transform.go +239 -0
  1012. data/ext/vendor/golang.org/x/text/width/transform_test.go +701 -0
  1013. data/ext/vendor/golang.org/x/text/width/trieval.go +30 -0
  1014. data/ext/vendor/golang.org/x/text/width/width.go +206 -0
  1015. data/lib/ires/version.rb +1 -1
  1016. data/shared/darwin/ires.so +0 -0
  1017. data/shared/linux/ires.so +0 -0
  1018. metadata +1011 -23
  1019. data/ext/operate/image.go +0 -176
  1020. data/ext/util/uri/uri.go +0 -105
  1021. data/ext/vendor/github.com/satori/go.uuid/README.md +0 -65
  1022. data/ext/vendor/github.com/satori/go.uuid/benchmarks_test.go +0 -121
  1023. data/ext/vendor/github.com/satori/go.uuid/uuid.go +0 -488
  1024. data/ext/vendor/github.com/satori/go.uuid/uuid_test.go +0 -633
@@ -0,0 +1,210 @@
1
+ // Copyright 2010 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 dict implements the Dictionary Server Protocol
6
+ // as defined in RFC 2229.
7
+ package dict // import "golang.org/x/net/dict"
8
+
9
+ import (
10
+ "net/textproto"
11
+ "strconv"
12
+ "strings"
13
+ )
14
+
15
+ // A Client represents a client connection to a dictionary server.
16
+ type Client struct {
17
+ text *textproto.Conn
18
+ }
19
+
20
+ // Dial returns a new client connected to a dictionary server at
21
+ // addr on the given network.
22
+ func Dial(network, addr string) (*Client, error) {
23
+ text, err := textproto.Dial(network, addr)
24
+ if err != nil {
25
+ return nil, err
26
+ }
27
+ _, _, err = text.ReadCodeLine(220)
28
+ if err != nil {
29
+ text.Close()
30
+ return nil, err
31
+ }
32
+ return &Client{text: text}, nil
33
+ }
34
+
35
+ // Close closes the connection to the dictionary server.
36
+ func (c *Client) Close() error {
37
+ return c.text.Close()
38
+ }
39
+
40
+ // A Dict represents a dictionary available on the server.
41
+ type Dict struct {
42
+ Name string // short name of dictionary
43
+ Desc string // long description
44
+ }
45
+
46
+ // Dicts returns a list of the dictionaries available on the server.
47
+ func (c *Client) Dicts() ([]Dict, error) {
48
+ id, err := c.text.Cmd("SHOW DB")
49
+ if err != nil {
50
+ return nil, err
51
+ }
52
+
53
+ c.text.StartResponse(id)
54
+ defer c.text.EndResponse(id)
55
+
56
+ _, _, err = c.text.ReadCodeLine(110)
57
+ if err != nil {
58
+ return nil, err
59
+ }
60
+ lines, err := c.text.ReadDotLines()
61
+ if err != nil {
62
+ return nil, err
63
+ }
64
+ _, _, err = c.text.ReadCodeLine(250)
65
+
66
+ dicts := make([]Dict, len(lines))
67
+ for i := range dicts {
68
+ d := &dicts[i]
69
+ a, _ := fields(lines[i])
70
+ if len(a) < 2 {
71
+ return nil, textproto.ProtocolError("invalid dictionary: " + lines[i])
72
+ }
73
+ d.Name = a[0]
74
+ d.Desc = a[1]
75
+ }
76
+ return dicts, err
77
+ }
78
+
79
+ // A Defn represents a definition.
80
+ type Defn struct {
81
+ Dict Dict // Dict where definition was found
82
+ Word string // Word being defined
83
+ Text []byte // Definition text, typically multiple lines
84
+ }
85
+
86
+ // Define requests the definition of the given word.
87
+ // The argument dict names the dictionary to use,
88
+ // the Name field of a Dict returned by Dicts.
89
+ //
90
+ // The special dictionary name "*" means to look in all the
91
+ // server's dictionaries.
92
+ // The special dictionary name "!" means to look in all the
93
+ // server's dictionaries in turn, stopping after finding the word
94
+ // in one of them.
95
+ func (c *Client) Define(dict, word string) ([]*Defn, error) {
96
+ id, err := c.text.Cmd("DEFINE %s %q", dict, word)
97
+ if err != nil {
98
+ return nil, err
99
+ }
100
+
101
+ c.text.StartResponse(id)
102
+ defer c.text.EndResponse(id)
103
+
104
+ _, line, err := c.text.ReadCodeLine(150)
105
+ if err != nil {
106
+ return nil, err
107
+ }
108
+ a, _ := fields(line)
109
+ if len(a) < 1 {
110
+ return nil, textproto.ProtocolError("malformed response: " + line)
111
+ }
112
+ n, err := strconv.Atoi(a[0])
113
+ if err != nil {
114
+ return nil, textproto.ProtocolError("invalid definition count: " + a[0])
115
+ }
116
+ def := make([]*Defn, n)
117
+ for i := 0; i < n; i++ {
118
+ _, line, err = c.text.ReadCodeLine(151)
119
+ if err != nil {
120
+ return nil, err
121
+ }
122
+ a, _ := fields(line)
123
+ if len(a) < 3 {
124
+ // skip it, to keep protocol in sync
125
+ i--
126
+ n--
127
+ def = def[0:n]
128
+ continue
129
+ }
130
+ d := &Defn{Word: a[0], Dict: Dict{a[1], a[2]}}
131
+ d.Text, err = c.text.ReadDotBytes()
132
+ if err != nil {
133
+ return nil, err
134
+ }
135
+ def[i] = d
136
+ }
137
+ _, _, err = c.text.ReadCodeLine(250)
138
+ return def, err
139
+ }
140
+
141
+ // Fields returns the fields in s.
142
+ // Fields are space separated unquoted words
143
+ // or quoted with single or double quote.
144
+ func fields(s string) ([]string, error) {
145
+ var v []string
146
+ i := 0
147
+ for {
148
+ for i < len(s) && (s[i] == ' ' || s[i] == '\t') {
149
+ i++
150
+ }
151
+ if i >= len(s) {
152
+ break
153
+ }
154
+ if s[i] == '"' || s[i] == '\'' {
155
+ q := s[i]
156
+ // quoted string
157
+ var j int
158
+ for j = i + 1; ; j++ {
159
+ if j >= len(s) {
160
+ return nil, textproto.ProtocolError("malformed quoted string")
161
+ }
162
+ if s[j] == '\\' {
163
+ j++
164
+ continue
165
+ }
166
+ if s[j] == q {
167
+ j++
168
+ break
169
+ }
170
+ }
171
+ v = append(v, unquote(s[i+1:j-1]))
172
+ i = j
173
+ } else {
174
+ // atom
175
+ var j int
176
+ for j = i; j < len(s); j++ {
177
+ if s[j] == ' ' || s[j] == '\t' || s[j] == '\\' || s[j] == '"' || s[j] == '\'' {
178
+ break
179
+ }
180
+ }
181
+ v = append(v, s[i:j])
182
+ i = j
183
+ }
184
+ if i < len(s) {
185
+ c := s[i]
186
+ if c != ' ' && c != '\t' {
187
+ return nil, textproto.ProtocolError("quotes not on word boundaries")
188
+ }
189
+ }
190
+ }
191
+ return v, nil
192
+ }
193
+
194
+ func unquote(s string) string {
195
+ if strings.Index(s, "\\") < 0 {
196
+ return s
197
+ }
198
+ b := []byte(s)
199
+ w := 0
200
+ for r := 0; r < len(b); r++ {
201
+ c := b[r]
202
+ if c == '\\' {
203
+ r++
204
+ c = b[r]
205
+ }
206
+ b[w] = c
207
+ w++
208
+ }
209
+ return string(b[0:w])
210
+ }
@@ -0,0 +1,132 @@
1
+ // Copyright 2017 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 dnsmessage_test
6
+
7
+ import (
8
+ "fmt"
9
+ "net"
10
+ "strings"
11
+
12
+ "golang.org/x/net/dns/dnsmessage"
13
+ )
14
+
15
+ func mustNewName(name string) dnsmessage.Name {
16
+ n, err := dnsmessage.NewName(name)
17
+ if err != nil {
18
+ panic(err)
19
+ }
20
+ return n
21
+ }
22
+
23
+ func ExampleParser() {
24
+ msg := dnsmessage.Message{
25
+ Header: dnsmessage.Header{Response: true, Authoritative: true},
26
+ Questions: []dnsmessage.Question{
27
+ {
28
+ Name: mustNewName("foo.bar.example.com."),
29
+ Type: dnsmessage.TypeA,
30
+ Class: dnsmessage.ClassINET,
31
+ },
32
+ {
33
+ Name: mustNewName("bar.example.com."),
34
+ Type: dnsmessage.TypeA,
35
+ Class: dnsmessage.ClassINET,
36
+ },
37
+ },
38
+ Answers: []dnsmessage.Resource{
39
+ {
40
+ dnsmessage.ResourceHeader{
41
+ Name: mustNewName("foo.bar.example.com."),
42
+ Type: dnsmessage.TypeA,
43
+ Class: dnsmessage.ClassINET,
44
+ },
45
+ &dnsmessage.AResource{[4]byte{127, 0, 0, 1}},
46
+ },
47
+ {
48
+ dnsmessage.ResourceHeader{
49
+ Name: mustNewName("bar.example.com."),
50
+ Type: dnsmessage.TypeA,
51
+ Class: dnsmessage.ClassINET,
52
+ },
53
+ &dnsmessage.AResource{[4]byte{127, 0, 0, 2}},
54
+ },
55
+ },
56
+ }
57
+
58
+ buf, err := msg.Pack()
59
+ if err != nil {
60
+ panic(err)
61
+ }
62
+
63
+ wantName := "bar.example.com."
64
+
65
+ var p dnsmessage.Parser
66
+ if _, err := p.Start(buf); err != nil {
67
+ panic(err)
68
+ }
69
+
70
+ for {
71
+ q, err := p.Question()
72
+ if err == dnsmessage.ErrSectionDone {
73
+ break
74
+ }
75
+ if err != nil {
76
+ panic(err)
77
+ }
78
+
79
+ if q.Name.String() != wantName {
80
+ continue
81
+ }
82
+
83
+ fmt.Println("Found question for name", wantName)
84
+ if err := p.SkipAllQuestions(); err != nil {
85
+ panic(err)
86
+ }
87
+ break
88
+ }
89
+
90
+ var gotIPs []net.IP
91
+ for {
92
+ h, err := p.AnswerHeader()
93
+ if err == dnsmessage.ErrSectionDone {
94
+ break
95
+ }
96
+ if err != nil {
97
+ panic(err)
98
+ }
99
+
100
+ if (h.Type != dnsmessage.TypeA && h.Type != dnsmessage.TypeAAAA) || h.Class != dnsmessage.ClassINET {
101
+ continue
102
+ }
103
+
104
+ if !strings.EqualFold(h.Name.String(), wantName) {
105
+ if err := p.SkipAnswer(); err != nil {
106
+ panic(err)
107
+ }
108
+ continue
109
+ }
110
+
111
+ switch h.Type {
112
+ case dnsmessage.TypeA:
113
+ r, err := p.AResource()
114
+ if err != nil {
115
+ panic(err)
116
+ }
117
+ gotIPs = append(gotIPs, r.A[:])
118
+ case dnsmessage.TypeAAAA:
119
+ r, err := p.AAAAResource()
120
+ if err != nil {
121
+ panic(err)
122
+ }
123
+ gotIPs = append(gotIPs, r.AAAA[:])
124
+ }
125
+ }
126
+
127
+ fmt.Printf("Found A/AAAA records for name %s: %v\n", wantName, gotIPs)
128
+
129
+ // Output:
130
+ // Found question for name bar.example.com.
131
+ // Found A/AAAA records for name bar.example.com.: [127.0.0.2]
132
+ }
@@ -0,0 +1,1997 @@
1
+ // Copyright 2009 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 dnsmessage provides a mostly RFC 1035 compliant implementation of
6
+ // DNS message packing and unpacking.
7
+ //
8
+ // This implementation is designed to minimize heap allocations and avoid
9
+ // unnecessary packing and unpacking as much as possible.
10
+ package dnsmessage
11
+
12
+ import (
13
+ "errors"
14
+ )
15
+
16
+ // Packet formats
17
+
18
+ // A Type is a type of DNS request and response.
19
+ type Type uint16
20
+
21
+ // A Class is a type of network.
22
+ type Class uint16
23
+
24
+ // An OpCode is a DNS operation code.
25
+ type OpCode uint16
26
+
27
+ // An RCode is a DNS response status code.
28
+ type RCode uint16
29
+
30
+ // Wire constants.
31
+ const (
32
+ // ResourceHeader.Type and Question.Type
33
+ TypeA Type = 1
34
+ TypeNS Type = 2
35
+ TypeCNAME Type = 5
36
+ TypeSOA Type = 6
37
+ TypePTR Type = 12
38
+ TypeMX Type = 15
39
+ TypeTXT Type = 16
40
+ TypeAAAA Type = 28
41
+ TypeSRV Type = 33
42
+
43
+ // Question.Type
44
+ TypeWKS Type = 11
45
+ TypeHINFO Type = 13
46
+ TypeMINFO Type = 14
47
+ TypeAXFR Type = 252
48
+ TypeALL Type = 255
49
+
50
+ // ResourceHeader.Class and Question.Class
51
+ ClassINET Class = 1
52
+ ClassCSNET Class = 2
53
+ ClassCHAOS Class = 3
54
+ ClassHESIOD Class = 4
55
+
56
+ // Question.Class
57
+ ClassANY Class = 255
58
+
59
+ // Message.Rcode
60
+ RCodeSuccess RCode = 0
61
+ RCodeFormatError RCode = 1
62
+ RCodeServerFailure RCode = 2
63
+ RCodeNameError RCode = 3
64
+ RCodeNotImplemented RCode = 4
65
+ RCodeRefused RCode = 5
66
+ )
67
+
68
+ var (
69
+ // ErrNotStarted indicates that the prerequisite information isn't
70
+ // available yet because the previous records haven't been appropriately
71
+ // parsed, skipped or finished.
72
+ ErrNotStarted = errors.New("parsing/packing of this type isn't available yet")
73
+
74
+ // ErrSectionDone indicated that all records in the section have been
75
+ // parsed or finished.
76
+ ErrSectionDone = errors.New("parsing/packing of this section has completed")
77
+
78
+ errBaseLen = errors.New("insufficient data for base length type")
79
+ errCalcLen = errors.New("insufficient data for calculated length type")
80
+ errReserved = errors.New("segment prefix is reserved")
81
+ errTooManyPtr = errors.New("too many pointers (>10)")
82
+ errInvalidPtr = errors.New("invalid pointer")
83
+ errNilResouceBody = errors.New("nil resource body")
84
+ errResourceLen = errors.New("insufficient data for resource body length")
85
+ errSegTooLong = errors.New("segment length too long")
86
+ errZeroSegLen = errors.New("zero length segment")
87
+ errResTooLong = errors.New("resource length too long")
88
+ errTooManyQuestions = errors.New("too many Questions to pack (>65535)")
89
+ errTooManyAnswers = errors.New("too many Answers to pack (>65535)")
90
+ errTooManyAuthorities = errors.New("too many Authorities to pack (>65535)")
91
+ errTooManyAdditionals = errors.New("too many Additionals to pack (>65535)")
92
+ errNonCanonicalName = errors.New("name is not in canonical format (it must end with a .)")
93
+ )
94
+
95
+ // Internal constants.
96
+ const (
97
+ // packStartingCap is the default initial buffer size allocated during
98
+ // packing.
99
+ //
100
+ // The starting capacity doesn't matter too much, but most DNS responses
101
+ // Will be <= 512 bytes as it is the limit for DNS over UDP.
102
+ packStartingCap = 512
103
+
104
+ // uint16Len is the length (in bytes) of a uint16.
105
+ uint16Len = 2
106
+
107
+ // uint32Len is the length (in bytes) of a uint32.
108
+ uint32Len = 4
109
+
110
+ // headerLen is the length (in bytes) of a DNS header.
111
+ //
112
+ // A header is comprised of 6 uint16s and no padding.
113
+ headerLen = 6 * uint16Len
114
+ )
115
+
116
+ type nestedError struct {
117
+ // s is the current level's error message.
118
+ s string
119
+
120
+ // err is the nested error.
121
+ err error
122
+ }
123
+
124
+ // nestedError implements error.Error.
125
+ func (e *nestedError) Error() string {
126
+ return e.s + ": " + e.err.Error()
127
+ }
128
+
129
+ // Header is a representation of a DNS message header.
130
+ type Header struct {
131
+ ID uint16
132
+ Response bool
133
+ OpCode OpCode
134
+ Authoritative bool
135
+ Truncated bool
136
+ RecursionDesired bool
137
+ RecursionAvailable bool
138
+ RCode RCode
139
+ }
140
+
141
+ func (m *Header) pack() (id uint16, bits uint16) {
142
+ id = m.ID
143
+ bits = uint16(m.OpCode)<<11 | uint16(m.RCode)
144
+ if m.RecursionAvailable {
145
+ bits |= headerBitRA
146
+ }
147
+ if m.RecursionDesired {
148
+ bits |= headerBitRD
149
+ }
150
+ if m.Truncated {
151
+ bits |= headerBitTC
152
+ }
153
+ if m.Authoritative {
154
+ bits |= headerBitAA
155
+ }
156
+ if m.Response {
157
+ bits |= headerBitQR
158
+ }
159
+ return
160
+ }
161
+
162
+ // Message is a representation of a DNS message.
163
+ type Message struct {
164
+ Header
165
+ Questions []Question
166
+ Answers []Resource
167
+ Authorities []Resource
168
+ Additionals []Resource
169
+ }
170
+
171
+ type section uint8
172
+
173
+ const (
174
+ sectionNotStarted section = iota
175
+ sectionHeader
176
+ sectionQuestions
177
+ sectionAnswers
178
+ sectionAuthorities
179
+ sectionAdditionals
180
+ sectionDone
181
+
182
+ headerBitQR = 1 << 15 // query/response (response=1)
183
+ headerBitAA = 1 << 10 // authoritative
184
+ headerBitTC = 1 << 9 // truncated
185
+ headerBitRD = 1 << 8 // recursion desired
186
+ headerBitRA = 1 << 7 // recursion available
187
+ )
188
+
189
+ var sectionNames = map[section]string{
190
+ sectionHeader: "header",
191
+ sectionQuestions: "Question",
192
+ sectionAnswers: "Answer",
193
+ sectionAuthorities: "Authority",
194
+ sectionAdditionals: "Additional",
195
+ }
196
+
197
+ // header is the wire format for a DNS message header.
198
+ type header struct {
199
+ id uint16
200
+ bits uint16
201
+ questions uint16
202
+ answers uint16
203
+ authorities uint16
204
+ additionals uint16
205
+ }
206
+
207
+ func (h *header) count(sec section) uint16 {
208
+ switch sec {
209
+ case sectionQuestions:
210
+ return h.questions
211
+ case sectionAnswers:
212
+ return h.answers
213
+ case sectionAuthorities:
214
+ return h.authorities
215
+ case sectionAdditionals:
216
+ return h.additionals
217
+ }
218
+ return 0
219
+ }
220
+
221
+ func (h *header) pack(msg []byte) []byte {
222
+ msg = packUint16(msg, h.id)
223
+ msg = packUint16(msg, h.bits)
224
+ msg = packUint16(msg, h.questions)
225
+ msg = packUint16(msg, h.answers)
226
+ msg = packUint16(msg, h.authorities)
227
+ return packUint16(msg, h.additionals)
228
+ }
229
+
230
+ func (h *header) unpack(msg []byte, off int) (int, error) {
231
+ newOff := off
232
+ var err error
233
+ if h.id, newOff, err = unpackUint16(msg, newOff); err != nil {
234
+ return off, &nestedError{"id", err}
235
+ }
236
+ if h.bits, newOff, err = unpackUint16(msg, newOff); err != nil {
237
+ return off, &nestedError{"bits", err}
238
+ }
239
+ if h.questions, newOff, err = unpackUint16(msg, newOff); err != nil {
240
+ return off, &nestedError{"questions", err}
241
+ }
242
+ if h.answers, newOff, err = unpackUint16(msg, newOff); err != nil {
243
+ return off, &nestedError{"answers", err}
244
+ }
245
+ if h.authorities, newOff, err = unpackUint16(msg, newOff); err != nil {
246
+ return off, &nestedError{"authorities", err}
247
+ }
248
+ if h.additionals, newOff, err = unpackUint16(msg, newOff); err != nil {
249
+ return off, &nestedError{"additionals", err}
250
+ }
251
+ return newOff, nil
252
+ }
253
+
254
+ func (h *header) header() Header {
255
+ return Header{
256
+ ID: h.id,
257
+ Response: (h.bits & headerBitQR) != 0,
258
+ OpCode: OpCode(h.bits>>11) & 0xF,
259
+ Authoritative: (h.bits & headerBitAA) != 0,
260
+ Truncated: (h.bits & headerBitTC) != 0,
261
+ RecursionDesired: (h.bits & headerBitRD) != 0,
262
+ RecursionAvailable: (h.bits & headerBitRA) != 0,
263
+ RCode: RCode(h.bits & 0xF),
264
+ }
265
+ }
266
+
267
+ // A Resource is a DNS resource record.
268
+ type Resource struct {
269
+ Header ResourceHeader
270
+ Body ResourceBody
271
+ }
272
+
273
+ // A ResourceBody is a DNS resource record minus the header.
274
+ type ResourceBody interface {
275
+ // pack packs a Resource except for its header.
276
+ pack(msg []byte, compression map[string]int) ([]byte, error)
277
+
278
+ // realType returns the actual type of the Resource. This is used to
279
+ // fill in the header Type field.
280
+ realType() Type
281
+ }
282
+
283
+ func (r *Resource) pack(msg []byte, compression map[string]int) ([]byte, error) {
284
+ if r.Body == nil {
285
+ return msg, errNilResouceBody
286
+ }
287
+ oldMsg := msg
288
+ r.Header.Type = r.Body.realType()
289
+ msg, length, err := r.Header.pack(msg, compression)
290
+ if err != nil {
291
+ return msg, &nestedError{"ResourceHeader", err}
292
+ }
293
+ preLen := len(msg)
294
+ msg, err = r.Body.pack(msg, compression)
295
+ if err != nil {
296
+ return msg, &nestedError{"content", err}
297
+ }
298
+ if err := r.Header.fixLen(msg, length, preLen); err != nil {
299
+ return oldMsg, err
300
+ }
301
+ return msg, nil
302
+ }
303
+
304
+ // A Parser allows incrementally parsing a DNS message.
305
+ //
306
+ // When parsing is started, the Header is parsed. Next, each Question can be
307
+ // either parsed or skipped. Alternatively, all Questions can be skipped at
308
+ // once. When all Questions have been parsed, attempting to parse Questions
309
+ // will return (nil, nil) and attempting to skip Questions will return
310
+ // (true, nil). After all Questions have been either parsed or skipped, all
311
+ // Answers, Authorities and Additionals can be either parsed or skipped in the
312
+ // same way, and each type of Resource must be fully parsed or skipped before
313
+ // proceeding to the next type of Resource.
314
+ //
315
+ // Note that there is no requirement to fully skip or parse the message.
316
+ type Parser struct {
317
+ msg []byte
318
+ header header
319
+
320
+ section section
321
+ off int
322
+ index int
323
+ resHeaderValid bool
324
+ resHeader ResourceHeader
325
+ }
326
+
327
+ // Start parses the header and enables the parsing of Questions.
328
+ func (p *Parser) Start(msg []byte) (Header, error) {
329
+ if p.msg != nil {
330
+ *p = Parser{}
331
+ }
332
+ p.msg = msg
333
+ var err error
334
+ if p.off, err = p.header.unpack(msg, 0); err != nil {
335
+ return Header{}, &nestedError{"unpacking header", err}
336
+ }
337
+ p.section = sectionQuestions
338
+ return p.header.header(), nil
339
+ }
340
+
341
+ func (p *Parser) checkAdvance(sec section) error {
342
+ if p.section < sec {
343
+ return ErrNotStarted
344
+ }
345
+ if p.section > sec {
346
+ return ErrSectionDone
347
+ }
348
+ p.resHeaderValid = false
349
+ if p.index == int(p.header.count(sec)) {
350
+ p.index = 0
351
+ p.section++
352
+ return ErrSectionDone
353
+ }
354
+ return nil
355
+ }
356
+
357
+ func (p *Parser) resource(sec section) (Resource, error) {
358
+ var r Resource
359
+ var err error
360
+ r.Header, err = p.resourceHeader(sec)
361
+ if err != nil {
362
+ return r, err
363
+ }
364
+ p.resHeaderValid = false
365
+ r.Body, p.off, err = unpackResourceBody(p.msg, p.off, r.Header)
366
+ if err != nil {
367
+ return Resource{}, &nestedError{"unpacking " + sectionNames[sec], err}
368
+ }
369
+ p.index++
370
+ return r, nil
371
+ }
372
+
373
+ func (p *Parser) resourceHeader(sec section) (ResourceHeader, error) {
374
+ if p.resHeaderValid {
375
+ return p.resHeader, nil
376
+ }
377
+ if err := p.checkAdvance(sec); err != nil {
378
+ return ResourceHeader{}, err
379
+ }
380
+ var hdr ResourceHeader
381
+ off, err := hdr.unpack(p.msg, p.off)
382
+ if err != nil {
383
+ return ResourceHeader{}, err
384
+ }
385
+ p.resHeaderValid = true
386
+ p.resHeader = hdr
387
+ p.off = off
388
+ return hdr, nil
389
+ }
390
+
391
+ func (p *Parser) skipResource(sec section) error {
392
+ if p.resHeaderValid {
393
+ newOff := p.off + int(p.resHeader.Length)
394
+ if newOff > len(p.msg) {
395
+ return errResourceLen
396
+ }
397
+ p.off = newOff
398
+ p.resHeaderValid = false
399
+ p.index++
400
+ return nil
401
+ }
402
+ if err := p.checkAdvance(sec); err != nil {
403
+ return err
404
+ }
405
+ var err error
406
+ p.off, err = skipResource(p.msg, p.off)
407
+ if err != nil {
408
+ return &nestedError{"skipping: " + sectionNames[sec], err}
409
+ }
410
+ p.index++
411
+ return nil
412
+ }
413
+
414
+ // Question parses a single Question.
415
+ func (p *Parser) Question() (Question, error) {
416
+ if err := p.checkAdvance(sectionQuestions); err != nil {
417
+ return Question{}, err
418
+ }
419
+ var name Name
420
+ off, err := name.unpack(p.msg, p.off)
421
+ if err != nil {
422
+ return Question{}, &nestedError{"unpacking Question.Name", err}
423
+ }
424
+ typ, off, err := unpackType(p.msg, off)
425
+ if err != nil {
426
+ return Question{}, &nestedError{"unpacking Question.Type", err}
427
+ }
428
+ class, off, err := unpackClass(p.msg, off)
429
+ if err != nil {
430
+ return Question{}, &nestedError{"unpacking Question.Class", err}
431
+ }
432
+ p.off = off
433
+ p.index++
434
+ return Question{name, typ, class}, nil
435
+ }
436
+
437
+ // AllQuestions parses all Questions.
438
+ func (p *Parser) AllQuestions() ([]Question, error) {
439
+ qs := make([]Question, 0, p.header.questions)
440
+ for {
441
+ q, err := p.Question()
442
+ if err == ErrSectionDone {
443
+ return qs, nil
444
+ }
445
+ if err != nil {
446
+ return nil, err
447
+ }
448
+ qs = append(qs, q)
449
+ }
450
+ }
451
+
452
+ // SkipQuestion skips a single Question.
453
+ func (p *Parser) SkipQuestion() error {
454
+ if err := p.checkAdvance(sectionQuestions); err != nil {
455
+ return err
456
+ }
457
+ off, err := skipName(p.msg, p.off)
458
+ if err != nil {
459
+ return &nestedError{"skipping Question Name", err}
460
+ }
461
+ if off, err = skipType(p.msg, off); err != nil {
462
+ return &nestedError{"skipping Question Type", err}
463
+ }
464
+ if off, err = skipClass(p.msg, off); err != nil {
465
+ return &nestedError{"skipping Question Class", err}
466
+ }
467
+ p.off = off
468
+ p.index++
469
+ return nil
470
+ }
471
+
472
+ // SkipAllQuestions skips all Questions.
473
+ func (p *Parser) SkipAllQuestions() error {
474
+ for {
475
+ if err := p.SkipQuestion(); err == ErrSectionDone {
476
+ return nil
477
+ } else if err != nil {
478
+ return err
479
+ }
480
+ }
481
+ }
482
+
483
+ // AnswerHeader parses a single Answer ResourceHeader.
484
+ func (p *Parser) AnswerHeader() (ResourceHeader, error) {
485
+ return p.resourceHeader(sectionAnswers)
486
+ }
487
+
488
+ // Answer parses a single Answer Resource.
489
+ func (p *Parser) Answer() (Resource, error) {
490
+ return p.resource(sectionAnswers)
491
+ }
492
+
493
+ // AllAnswers parses all Answer Resources.
494
+ func (p *Parser) AllAnswers() ([]Resource, error) {
495
+ as := make([]Resource, 0, p.header.answers)
496
+ for {
497
+ a, err := p.Answer()
498
+ if err == ErrSectionDone {
499
+ return as, nil
500
+ }
501
+ if err != nil {
502
+ return nil, err
503
+ }
504
+ as = append(as, a)
505
+ }
506
+ }
507
+
508
+ // SkipAnswer skips a single Answer Resource.
509
+ func (p *Parser) SkipAnswer() error {
510
+ return p.skipResource(sectionAnswers)
511
+ }
512
+
513
+ // SkipAllAnswers skips all Answer Resources.
514
+ func (p *Parser) SkipAllAnswers() error {
515
+ for {
516
+ if err := p.SkipAnswer(); err == ErrSectionDone {
517
+ return nil
518
+ } else if err != nil {
519
+ return err
520
+ }
521
+ }
522
+ }
523
+
524
+ // AuthorityHeader parses a single Authority ResourceHeader.
525
+ func (p *Parser) AuthorityHeader() (ResourceHeader, error) {
526
+ return p.resourceHeader(sectionAuthorities)
527
+ }
528
+
529
+ // Authority parses a single Authority Resource.
530
+ func (p *Parser) Authority() (Resource, error) {
531
+ return p.resource(sectionAuthorities)
532
+ }
533
+
534
+ // AllAuthorities parses all Authority Resources.
535
+ func (p *Parser) AllAuthorities() ([]Resource, error) {
536
+ as := make([]Resource, 0, p.header.authorities)
537
+ for {
538
+ a, err := p.Authority()
539
+ if err == ErrSectionDone {
540
+ return as, nil
541
+ }
542
+ if err != nil {
543
+ return nil, err
544
+ }
545
+ as = append(as, a)
546
+ }
547
+ }
548
+
549
+ // SkipAuthority skips a single Authority Resource.
550
+ func (p *Parser) SkipAuthority() error {
551
+ return p.skipResource(sectionAuthorities)
552
+ }
553
+
554
+ // SkipAllAuthorities skips all Authority Resources.
555
+ func (p *Parser) SkipAllAuthorities() error {
556
+ for {
557
+ if err := p.SkipAuthority(); err == ErrSectionDone {
558
+ return nil
559
+ } else if err != nil {
560
+ return err
561
+ }
562
+ }
563
+ }
564
+
565
+ // AdditionalHeader parses a single Additional ResourceHeader.
566
+ func (p *Parser) AdditionalHeader() (ResourceHeader, error) {
567
+ return p.resourceHeader(sectionAdditionals)
568
+ }
569
+
570
+ // Additional parses a single Additional Resource.
571
+ func (p *Parser) Additional() (Resource, error) {
572
+ return p.resource(sectionAdditionals)
573
+ }
574
+
575
+ // AllAdditionals parses all Additional Resources.
576
+ func (p *Parser) AllAdditionals() ([]Resource, error) {
577
+ as := make([]Resource, 0, p.header.additionals)
578
+ for {
579
+ a, err := p.Additional()
580
+ if err == ErrSectionDone {
581
+ return as, nil
582
+ }
583
+ if err != nil {
584
+ return nil, err
585
+ }
586
+ as = append(as, a)
587
+ }
588
+ }
589
+
590
+ // SkipAdditional skips a single Additional Resource.
591
+ func (p *Parser) SkipAdditional() error {
592
+ return p.skipResource(sectionAdditionals)
593
+ }
594
+
595
+ // SkipAllAdditionals skips all Additional Resources.
596
+ func (p *Parser) SkipAllAdditionals() error {
597
+ for {
598
+ if err := p.SkipAdditional(); err == ErrSectionDone {
599
+ return nil
600
+ } else if err != nil {
601
+ return err
602
+ }
603
+ }
604
+ }
605
+
606
+ // CNAMEResource parses a single CNAMEResource.
607
+ //
608
+ // One of the XXXHeader methods must have been called before calling this
609
+ // method.
610
+ func (p *Parser) CNAMEResource() (CNAMEResource, error) {
611
+ if !p.resHeaderValid || p.resHeader.Type != TypeCNAME {
612
+ return CNAMEResource{}, ErrNotStarted
613
+ }
614
+ r, err := unpackCNAMEResource(p.msg, p.off)
615
+ if err != nil {
616
+ return CNAMEResource{}, err
617
+ }
618
+ p.off += int(p.resHeader.Length)
619
+ p.resHeaderValid = false
620
+ p.index++
621
+ return r, nil
622
+ }
623
+
624
+ // MXResource parses a single MXResource.
625
+ //
626
+ // One of the XXXHeader methods must have been called before calling this
627
+ // method.
628
+ func (p *Parser) MXResource() (MXResource, error) {
629
+ if !p.resHeaderValid || p.resHeader.Type != TypeMX {
630
+ return MXResource{}, ErrNotStarted
631
+ }
632
+ r, err := unpackMXResource(p.msg, p.off)
633
+ if err != nil {
634
+ return MXResource{}, err
635
+ }
636
+ p.off += int(p.resHeader.Length)
637
+ p.resHeaderValid = false
638
+ p.index++
639
+ return r, nil
640
+ }
641
+
642
+ // NSResource parses a single NSResource.
643
+ //
644
+ // One of the XXXHeader methods must have been called before calling this
645
+ // method.
646
+ func (p *Parser) NSResource() (NSResource, error) {
647
+ if !p.resHeaderValid || p.resHeader.Type != TypeNS {
648
+ return NSResource{}, ErrNotStarted
649
+ }
650
+ r, err := unpackNSResource(p.msg, p.off)
651
+ if err != nil {
652
+ return NSResource{}, err
653
+ }
654
+ p.off += int(p.resHeader.Length)
655
+ p.resHeaderValid = false
656
+ p.index++
657
+ return r, nil
658
+ }
659
+
660
+ // PTRResource parses a single PTRResource.
661
+ //
662
+ // One of the XXXHeader methods must have been called before calling this
663
+ // method.
664
+ func (p *Parser) PTRResource() (PTRResource, error) {
665
+ if !p.resHeaderValid || p.resHeader.Type != TypePTR {
666
+ return PTRResource{}, ErrNotStarted
667
+ }
668
+ r, err := unpackPTRResource(p.msg, p.off)
669
+ if err != nil {
670
+ return PTRResource{}, err
671
+ }
672
+ p.off += int(p.resHeader.Length)
673
+ p.resHeaderValid = false
674
+ p.index++
675
+ return r, nil
676
+ }
677
+
678
+ // SOAResource parses a single SOAResource.
679
+ //
680
+ // One of the XXXHeader methods must have been called before calling this
681
+ // method.
682
+ func (p *Parser) SOAResource() (SOAResource, error) {
683
+ if !p.resHeaderValid || p.resHeader.Type != TypeSOA {
684
+ return SOAResource{}, ErrNotStarted
685
+ }
686
+ r, err := unpackSOAResource(p.msg, p.off)
687
+ if err != nil {
688
+ return SOAResource{}, err
689
+ }
690
+ p.off += int(p.resHeader.Length)
691
+ p.resHeaderValid = false
692
+ p.index++
693
+ return r, nil
694
+ }
695
+
696
+ // TXTResource parses a single TXTResource.
697
+ //
698
+ // One of the XXXHeader methods must have been called before calling this
699
+ // method.
700
+ func (p *Parser) TXTResource() (TXTResource, error) {
701
+ if !p.resHeaderValid || p.resHeader.Type != TypeTXT {
702
+ return TXTResource{}, ErrNotStarted
703
+ }
704
+ r, err := unpackTXTResource(p.msg, p.off, p.resHeader.Length)
705
+ if err != nil {
706
+ return TXTResource{}, err
707
+ }
708
+ p.off += int(p.resHeader.Length)
709
+ p.resHeaderValid = false
710
+ p.index++
711
+ return r, nil
712
+ }
713
+
714
+ // SRVResource parses a single SRVResource.
715
+ //
716
+ // One of the XXXHeader methods must have been called before calling this
717
+ // method.
718
+ func (p *Parser) SRVResource() (SRVResource, error) {
719
+ if !p.resHeaderValid || p.resHeader.Type != TypeSRV {
720
+ return SRVResource{}, ErrNotStarted
721
+ }
722
+ r, err := unpackSRVResource(p.msg, p.off)
723
+ if err != nil {
724
+ return SRVResource{}, err
725
+ }
726
+ p.off += int(p.resHeader.Length)
727
+ p.resHeaderValid = false
728
+ p.index++
729
+ return r, nil
730
+ }
731
+
732
+ // AResource parses a single AResource.
733
+ //
734
+ // One of the XXXHeader methods must have been called before calling this
735
+ // method.
736
+ func (p *Parser) AResource() (AResource, error) {
737
+ if !p.resHeaderValid || p.resHeader.Type != TypeA {
738
+ return AResource{}, ErrNotStarted
739
+ }
740
+ r, err := unpackAResource(p.msg, p.off)
741
+ if err != nil {
742
+ return AResource{}, err
743
+ }
744
+ p.off += int(p.resHeader.Length)
745
+ p.resHeaderValid = false
746
+ p.index++
747
+ return r, nil
748
+ }
749
+
750
+ // AAAAResource parses a single AAAAResource.
751
+ //
752
+ // One of the XXXHeader methods must have been called before calling this
753
+ // method.
754
+ func (p *Parser) AAAAResource() (AAAAResource, error) {
755
+ if !p.resHeaderValid || p.resHeader.Type != TypeAAAA {
756
+ return AAAAResource{}, ErrNotStarted
757
+ }
758
+ r, err := unpackAAAAResource(p.msg, p.off)
759
+ if err != nil {
760
+ return AAAAResource{}, err
761
+ }
762
+ p.off += int(p.resHeader.Length)
763
+ p.resHeaderValid = false
764
+ p.index++
765
+ return r, nil
766
+ }
767
+
768
+ // Unpack parses a full Message.
769
+ func (m *Message) Unpack(msg []byte) error {
770
+ var p Parser
771
+ var err error
772
+ if m.Header, err = p.Start(msg); err != nil {
773
+ return err
774
+ }
775
+ if m.Questions, err = p.AllQuestions(); err != nil {
776
+ return err
777
+ }
778
+ if m.Answers, err = p.AllAnswers(); err != nil {
779
+ return err
780
+ }
781
+ if m.Authorities, err = p.AllAuthorities(); err != nil {
782
+ return err
783
+ }
784
+ if m.Additionals, err = p.AllAdditionals(); err != nil {
785
+ return err
786
+ }
787
+ return nil
788
+ }
789
+
790
+ // Pack packs a full Message.
791
+ func (m *Message) Pack() ([]byte, error) {
792
+ // Validate the lengths. It is very unlikely that anyone will try to
793
+ // pack more than 65535 of any particular type, but it is possible and
794
+ // we should fail gracefully.
795
+ if len(m.Questions) > int(^uint16(0)) {
796
+ return nil, errTooManyQuestions
797
+ }
798
+ if len(m.Answers) > int(^uint16(0)) {
799
+ return nil, errTooManyAnswers
800
+ }
801
+ if len(m.Authorities) > int(^uint16(0)) {
802
+ return nil, errTooManyAuthorities
803
+ }
804
+ if len(m.Additionals) > int(^uint16(0)) {
805
+ return nil, errTooManyAdditionals
806
+ }
807
+
808
+ var h header
809
+ h.id, h.bits = m.Header.pack()
810
+
811
+ h.questions = uint16(len(m.Questions))
812
+ h.answers = uint16(len(m.Answers))
813
+ h.authorities = uint16(len(m.Authorities))
814
+ h.additionals = uint16(len(m.Additionals))
815
+
816
+ msg := make([]byte, 0, packStartingCap)
817
+
818
+ msg = h.pack(msg)
819
+
820
+ // RFC 1035 allows (but does not require) compression for packing. RFC
821
+ // 1035 requires unpacking implementations to support compression, so
822
+ // unconditionally enabling it is fine.
823
+ //
824
+ // DNS lookups are typically done over UDP, and RFC 1035 states that UDP
825
+ // DNS packets can be a maximum of 512 bytes long. Without compression,
826
+ // many DNS response packets are over this limit, so enabling
827
+ // compression will help ensure compliance.
828
+ compression := map[string]int{}
829
+
830
+ for i := range m.Questions {
831
+ var err error
832
+ if msg, err = m.Questions[i].pack(msg, compression); err != nil {
833
+ return nil, &nestedError{"packing Question", err}
834
+ }
835
+ }
836
+ for i := range m.Answers {
837
+ var err error
838
+ if msg, err = m.Answers[i].pack(msg, compression); err != nil {
839
+ return nil, &nestedError{"packing Answer", err}
840
+ }
841
+ }
842
+ for i := range m.Authorities {
843
+ var err error
844
+ if msg, err = m.Authorities[i].pack(msg, compression); err != nil {
845
+ return nil, &nestedError{"packing Authority", err}
846
+ }
847
+ }
848
+ for i := range m.Additionals {
849
+ var err error
850
+ if msg, err = m.Additionals[i].pack(msg, compression); err != nil {
851
+ return nil, &nestedError{"packing Additional", err}
852
+ }
853
+ }
854
+
855
+ return msg, nil
856
+ }
857
+
858
+ // A Builder allows incrementally packing a DNS message.
859
+ type Builder struct {
860
+ msg []byte
861
+ header header
862
+ section section
863
+ compression map[string]int
864
+ }
865
+
866
+ // Start initializes the builder.
867
+ //
868
+ // buf is optional (nil is fine), but if provided, Start takes ownership of buf.
869
+ func (b *Builder) Start(buf []byte, h Header) {
870
+ b.StartWithoutCompression(buf, h)
871
+ b.compression = map[string]int{}
872
+ }
873
+
874
+ // StartWithoutCompression initializes the builder with compression disabled.
875
+ //
876
+ // This avoids compression related allocations, but can result in larger message
877
+ // sizes. Be careful with this mode as it can cause messages to exceed the UDP
878
+ // size limit.
879
+ //
880
+ // buf is optional (nil is fine), but if provided, Start takes ownership of buf.
881
+ func (b *Builder) StartWithoutCompression(buf []byte, h Header) {
882
+ *b = Builder{msg: buf}
883
+ b.header.id, b.header.bits = h.pack()
884
+ if cap(b.msg) < headerLen {
885
+ b.msg = make([]byte, 0, packStartingCap)
886
+ }
887
+ b.msg = b.msg[:headerLen]
888
+ b.section = sectionHeader
889
+ }
890
+
891
+ func (b *Builder) startCheck(s section) error {
892
+ if b.section <= sectionNotStarted {
893
+ return ErrNotStarted
894
+ }
895
+ if b.section > s {
896
+ return ErrSectionDone
897
+ }
898
+ return nil
899
+ }
900
+
901
+ // StartQuestions prepares the builder for packing Questions.
902
+ func (b *Builder) StartQuestions() error {
903
+ if err := b.startCheck(sectionQuestions); err != nil {
904
+ return err
905
+ }
906
+ b.section = sectionQuestions
907
+ return nil
908
+ }
909
+
910
+ // StartAnswers prepares the builder for packing Answers.
911
+ func (b *Builder) StartAnswers() error {
912
+ if err := b.startCheck(sectionAnswers); err != nil {
913
+ return err
914
+ }
915
+ b.section = sectionAnswers
916
+ return nil
917
+ }
918
+
919
+ // StartAuthorities prepares the builder for packing Authorities.
920
+ func (b *Builder) StartAuthorities() error {
921
+ if err := b.startCheck(sectionAuthorities); err != nil {
922
+ return err
923
+ }
924
+ b.section = sectionAuthorities
925
+ return nil
926
+ }
927
+
928
+ // StartAdditionals prepares the builder for packing Additionals.
929
+ func (b *Builder) StartAdditionals() error {
930
+ if err := b.startCheck(sectionAdditionals); err != nil {
931
+ return err
932
+ }
933
+ b.section = sectionAdditionals
934
+ return nil
935
+ }
936
+
937
+ func (b *Builder) incrementSectionCount() error {
938
+ var count *uint16
939
+ var err error
940
+ switch b.section {
941
+ case sectionQuestions:
942
+ count = &b.header.questions
943
+ err = errTooManyQuestions
944
+ case sectionAnswers:
945
+ count = &b.header.answers
946
+ err = errTooManyAnswers
947
+ case sectionAuthorities:
948
+ count = &b.header.authorities
949
+ err = errTooManyAuthorities
950
+ case sectionAdditionals:
951
+ count = &b.header.additionals
952
+ err = errTooManyAdditionals
953
+ }
954
+ if *count == ^uint16(0) {
955
+ return err
956
+ }
957
+ *count++
958
+ return nil
959
+ }
960
+
961
+ // Question adds a single Question.
962
+ func (b *Builder) Question(q Question) error {
963
+ if b.section < sectionQuestions {
964
+ return ErrNotStarted
965
+ }
966
+ if b.section > sectionQuestions {
967
+ return ErrSectionDone
968
+ }
969
+ msg, err := q.pack(b.msg, b.compression)
970
+ if err != nil {
971
+ return err
972
+ }
973
+ if err := b.incrementSectionCount(); err != nil {
974
+ return err
975
+ }
976
+ b.msg = msg
977
+ return nil
978
+ }
979
+
980
+ func (b *Builder) checkResourceSection() error {
981
+ if b.section < sectionAnswers {
982
+ return ErrNotStarted
983
+ }
984
+ if b.section > sectionAdditionals {
985
+ return ErrSectionDone
986
+ }
987
+ return nil
988
+ }
989
+
990
+ // CNAMEResource adds a single CNAMEResource.
991
+ func (b *Builder) CNAMEResource(h ResourceHeader, r CNAMEResource) error {
992
+ if err := b.checkResourceSection(); err != nil {
993
+ return err
994
+ }
995
+ h.Type = r.realType()
996
+ msg, length, err := h.pack(b.msg, b.compression)
997
+ if err != nil {
998
+ return &nestedError{"ResourceHeader", err}
999
+ }
1000
+ preLen := len(msg)
1001
+ if msg, err = r.pack(msg, b.compression); err != nil {
1002
+ return &nestedError{"CNAMEResource body", err}
1003
+ }
1004
+ if err := h.fixLen(msg, length, preLen); err != nil {
1005
+ return err
1006
+ }
1007
+ if err := b.incrementSectionCount(); err != nil {
1008
+ return err
1009
+ }
1010
+ b.msg = msg
1011
+ return nil
1012
+ }
1013
+
1014
+ // MXResource adds a single MXResource.
1015
+ func (b *Builder) MXResource(h ResourceHeader, r MXResource) error {
1016
+ if err := b.checkResourceSection(); err != nil {
1017
+ return err
1018
+ }
1019
+ h.Type = r.realType()
1020
+ msg, length, err := h.pack(b.msg, b.compression)
1021
+ if err != nil {
1022
+ return &nestedError{"ResourceHeader", err}
1023
+ }
1024
+ preLen := len(msg)
1025
+ if msg, err = r.pack(msg, b.compression); err != nil {
1026
+ return &nestedError{"MXResource body", err}
1027
+ }
1028
+ if err := h.fixLen(msg, length, preLen); err != nil {
1029
+ return err
1030
+ }
1031
+ if err := b.incrementSectionCount(); err != nil {
1032
+ return err
1033
+ }
1034
+ b.msg = msg
1035
+ return nil
1036
+ }
1037
+
1038
+ // NSResource adds a single NSResource.
1039
+ func (b *Builder) NSResource(h ResourceHeader, r NSResource) error {
1040
+ if err := b.checkResourceSection(); err != nil {
1041
+ return err
1042
+ }
1043
+ h.Type = r.realType()
1044
+ msg, length, err := h.pack(b.msg, b.compression)
1045
+ if err != nil {
1046
+ return &nestedError{"ResourceHeader", err}
1047
+ }
1048
+ preLen := len(msg)
1049
+ if msg, err = r.pack(msg, b.compression); err != nil {
1050
+ return &nestedError{"NSResource body", err}
1051
+ }
1052
+ if err := h.fixLen(msg, length, preLen); err != nil {
1053
+ return err
1054
+ }
1055
+ if err := b.incrementSectionCount(); err != nil {
1056
+ return err
1057
+ }
1058
+ b.msg = msg
1059
+ return nil
1060
+ }
1061
+
1062
+ // PTRResource adds a single PTRResource.
1063
+ func (b *Builder) PTRResource(h ResourceHeader, r PTRResource) error {
1064
+ if err := b.checkResourceSection(); err != nil {
1065
+ return err
1066
+ }
1067
+ h.Type = r.realType()
1068
+ msg, length, err := h.pack(b.msg, b.compression)
1069
+ if err != nil {
1070
+ return &nestedError{"ResourceHeader", err}
1071
+ }
1072
+ preLen := len(msg)
1073
+ if msg, err = r.pack(msg, b.compression); err != nil {
1074
+ return &nestedError{"PTRResource body", err}
1075
+ }
1076
+ if err := h.fixLen(msg, length, preLen); err != nil {
1077
+ return err
1078
+ }
1079
+ if err := b.incrementSectionCount(); err != nil {
1080
+ return err
1081
+ }
1082
+ b.msg = msg
1083
+ return nil
1084
+ }
1085
+
1086
+ // SOAResource adds a single SOAResource.
1087
+ func (b *Builder) SOAResource(h ResourceHeader, r SOAResource) error {
1088
+ if err := b.checkResourceSection(); err != nil {
1089
+ return err
1090
+ }
1091
+ h.Type = r.realType()
1092
+ msg, length, err := h.pack(b.msg, b.compression)
1093
+ if err != nil {
1094
+ return &nestedError{"ResourceHeader", err}
1095
+ }
1096
+ preLen := len(msg)
1097
+ if msg, err = r.pack(msg, b.compression); err != nil {
1098
+ return &nestedError{"SOAResource body", err}
1099
+ }
1100
+ if err := h.fixLen(msg, length, preLen); err != nil {
1101
+ return err
1102
+ }
1103
+ if err := b.incrementSectionCount(); err != nil {
1104
+ return err
1105
+ }
1106
+ b.msg = msg
1107
+ return nil
1108
+ }
1109
+
1110
+ // TXTResource adds a single TXTResource.
1111
+ func (b *Builder) TXTResource(h ResourceHeader, r TXTResource) error {
1112
+ if err := b.checkResourceSection(); err != nil {
1113
+ return err
1114
+ }
1115
+ h.Type = r.realType()
1116
+ msg, length, err := h.pack(b.msg, b.compression)
1117
+ if err != nil {
1118
+ return &nestedError{"ResourceHeader", err}
1119
+ }
1120
+ preLen := len(msg)
1121
+ if msg, err = r.pack(msg, b.compression); err != nil {
1122
+ return &nestedError{"TXTResource body", err}
1123
+ }
1124
+ if err := h.fixLen(msg, length, preLen); err != nil {
1125
+ return err
1126
+ }
1127
+ if err := b.incrementSectionCount(); err != nil {
1128
+ return err
1129
+ }
1130
+ b.msg = msg
1131
+ return nil
1132
+ }
1133
+
1134
+ // SRVResource adds a single SRVResource.
1135
+ func (b *Builder) SRVResource(h ResourceHeader, r SRVResource) error {
1136
+ if err := b.checkResourceSection(); err != nil {
1137
+ return err
1138
+ }
1139
+ h.Type = r.realType()
1140
+ msg, length, err := h.pack(b.msg, b.compression)
1141
+ if err != nil {
1142
+ return &nestedError{"ResourceHeader", err}
1143
+ }
1144
+ preLen := len(msg)
1145
+ if msg, err = r.pack(msg, b.compression); err != nil {
1146
+ return &nestedError{"SRVResource body", err}
1147
+ }
1148
+ if err := h.fixLen(msg, length, preLen); err != nil {
1149
+ return err
1150
+ }
1151
+ if err := b.incrementSectionCount(); err != nil {
1152
+ return err
1153
+ }
1154
+ b.msg = msg
1155
+ return nil
1156
+ }
1157
+
1158
+ // AResource adds a single AResource.
1159
+ func (b *Builder) AResource(h ResourceHeader, r AResource) error {
1160
+ if err := b.checkResourceSection(); err != nil {
1161
+ return err
1162
+ }
1163
+ h.Type = r.realType()
1164
+ msg, length, err := h.pack(b.msg, b.compression)
1165
+ if err != nil {
1166
+ return &nestedError{"ResourceHeader", err}
1167
+ }
1168
+ preLen := len(msg)
1169
+ if msg, err = r.pack(msg, b.compression); err != nil {
1170
+ return &nestedError{"AResource body", err}
1171
+ }
1172
+ if err := h.fixLen(msg, length, preLen); err != nil {
1173
+ return err
1174
+ }
1175
+ if err := b.incrementSectionCount(); err != nil {
1176
+ return err
1177
+ }
1178
+ b.msg = msg
1179
+ return nil
1180
+ }
1181
+
1182
+ // AAAAResource adds a single AAAAResource.
1183
+ func (b *Builder) AAAAResource(h ResourceHeader, r AAAAResource) error {
1184
+ if err := b.checkResourceSection(); err != nil {
1185
+ return err
1186
+ }
1187
+ h.Type = r.realType()
1188
+ msg, length, err := h.pack(b.msg, b.compression)
1189
+ if err != nil {
1190
+ return &nestedError{"ResourceHeader", err}
1191
+ }
1192
+ preLen := len(msg)
1193
+ if msg, err = r.pack(msg, b.compression); err != nil {
1194
+ return &nestedError{"AAAAResource body", err}
1195
+ }
1196
+ if err := h.fixLen(msg, length, preLen); err != nil {
1197
+ return err
1198
+ }
1199
+ if err := b.incrementSectionCount(); err != nil {
1200
+ return err
1201
+ }
1202
+ b.msg = msg
1203
+ return nil
1204
+ }
1205
+
1206
+ // Finish ends message building and generates a binary packet.
1207
+ func (b *Builder) Finish() ([]byte, error) {
1208
+ if b.section < sectionHeader {
1209
+ return nil, ErrNotStarted
1210
+ }
1211
+ b.section = sectionDone
1212
+ b.header.pack(b.msg[:0])
1213
+ return b.msg, nil
1214
+ }
1215
+
1216
+ // A ResourceHeader is the header of a DNS resource record. There are
1217
+ // many types of DNS resource records, but they all share the same header.
1218
+ type ResourceHeader struct {
1219
+ // Name is the domain name for which this resource record pertains.
1220
+ Name Name
1221
+
1222
+ // Type is the type of DNS resource record.
1223
+ //
1224
+ // This field will be set automatically during packing.
1225
+ Type Type
1226
+
1227
+ // Class is the class of network to which this DNS resource record
1228
+ // pertains.
1229
+ Class Class
1230
+
1231
+ // TTL is the length of time (measured in seconds) which this resource
1232
+ // record is valid for (time to live). All Resources in a set should
1233
+ // have the same TTL (RFC 2181 Section 5.2).
1234
+ TTL uint32
1235
+
1236
+ // Length is the length of data in the resource record after the header.
1237
+ //
1238
+ // This field will be set automatically during packing.
1239
+ Length uint16
1240
+ }
1241
+
1242
+ // pack packs all of the fields in a ResourceHeader except for the length. The
1243
+ // length bytes are returned as a slice so they can be filled in after the rest
1244
+ // of the Resource has been packed.
1245
+ func (h *ResourceHeader) pack(oldMsg []byte, compression map[string]int) (msg []byte, length []byte, err error) {
1246
+ msg = oldMsg
1247
+ if msg, err = h.Name.pack(msg, compression); err != nil {
1248
+ return oldMsg, nil, &nestedError{"Name", err}
1249
+ }
1250
+ msg = packType(msg, h.Type)
1251
+ msg = packClass(msg, h.Class)
1252
+ msg = packUint32(msg, h.TTL)
1253
+ lenBegin := len(msg)
1254
+ msg = packUint16(msg, h.Length)
1255
+ return msg, msg[lenBegin : lenBegin+uint16Len], nil
1256
+ }
1257
+
1258
+ func (h *ResourceHeader) unpack(msg []byte, off int) (int, error) {
1259
+ newOff := off
1260
+ var err error
1261
+ if newOff, err = h.Name.unpack(msg, newOff); err != nil {
1262
+ return off, &nestedError{"Name", err}
1263
+ }
1264
+ if h.Type, newOff, err = unpackType(msg, newOff); err != nil {
1265
+ return off, &nestedError{"Type", err}
1266
+ }
1267
+ if h.Class, newOff, err = unpackClass(msg, newOff); err != nil {
1268
+ return off, &nestedError{"Class", err}
1269
+ }
1270
+ if h.TTL, newOff, err = unpackUint32(msg, newOff); err != nil {
1271
+ return off, &nestedError{"TTL", err}
1272
+ }
1273
+ if h.Length, newOff, err = unpackUint16(msg, newOff); err != nil {
1274
+ return off, &nestedError{"Length", err}
1275
+ }
1276
+ return newOff, nil
1277
+ }
1278
+
1279
+ func (h *ResourceHeader) fixLen(msg []byte, length []byte, preLen int) error {
1280
+ conLen := len(msg) - preLen
1281
+ if conLen > int(^uint16(0)) {
1282
+ return errResTooLong
1283
+ }
1284
+
1285
+ // Fill in the length now that we know how long the content is.
1286
+ packUint16(length[:0], uint16(conLen))
1287
+ h.Length = uint16(conLen)
1288
+
1289
+ return nil
1290
+ }
1291
+
1292
+ func skipResource(msg []byte, off int) (int, error) {
1293
+ newOff, err := skipName(msg, off)
1294
+ if err != nil {
1295
+ return off, &nestedError{"Name", err}
1296
+ }
1297
+ if newOff, err = skipType(msg, newOff); err != nil {
1298
+ return off, &nestedError{"Type", err}
1299
+ }
1300
+ if newOff, err = skipClass(msg, newOff); err != nil {
1301
+ return off, &nestedError{"Class", err}
1302
+ }
1303
+ if newOff, err = skipUint32(msg, newOff); err != nil {
1304
+ return off, &nestedError{"TTL", err}
1305
+ }
1306
+ length, newOff, err := unpackUint16(msg, newOff)
1307
+ if err != nil {
1308
+ return off, &nestedError{"Length", err}
1309
+ }
1310
+ if newOff += int(length); newOff > len(msg) {
1311
+ return off, errResourceLen
1312
+ }
1313
+ return newOff, nil
1314
+ }
1315
+
1316
+ func packUint16(msg []byte, field uint16) []byte {
1317
+ return append(msg, byte(field>>8), byte(field))
1318
+ }
1319
+
1320
+ func unpackUint16(msg []byte, off int) (uint16, int, error) {
1321
+ if off+uint16Len > len(msg) {
1322
+ return 0, off, errBaseLen
1323
+ }
1324
+ return uint16(msg[off])<<8 | uint16(msg[off+1]), off + uint16Len, nil
1325
+ }
1326
+
1327
+ func skipUint16(msg []byte, off int) (int, error) {
1328
+ if off+uint16Len > len(msg) {
1329
+ return off, errBaseLen
1330
+ }
1331
+ return off + uint16Len, nil
1332
+ }
1333
+
1334
+ func packType(msg []byte, field Type) []byte {
1335
+ return packUint16(msg, uint16(field))
1336
+ }
1337
+
1338
+ func unpackType(msg []byte, off int) (Type, int, error) {
1339
+ t, o, err := unpackUint16(msg, off)
1340
+ return Type(t), o, err
1341
+ }
1342
+
1343
+ func skipType(msg []byte, off int) (int, error) {
1344
+ return skipUint16(msg, off)
1345
+ }
1346
+
1347
+ func packClass(msg []byte, field Class) []byte {
1348
+ return packUint16(msg, uint16(field))
1349
+ }
1350
+
1351
+ func unpackClass(msg []byte, off int) (Class, int, error) {
1352
+ c, o, err := unpackUint16(msg, off)
1353
+ return Class(c), o, err
1354
+ }
1355
+
1356
+ func skipClass(msg []byte, off int) (int, error) {
1357
+ return skipUint16(msg, off)
1358
+ }
1359
+
1360
+ func packUint32(msg []byte, field uint32) []byte {
1361
+ return append(
1362
+ msg,
1363
+ byte(field>>24),
1364
+ byte(field>>16),
1365
+ byte(field>>8),
1366
+ byte(field),
1367
+ )
1368
+ }
1369
+
1370
+ func unpackUint32(msg []byte, off int) (uint32, int, error) {
1371
+ if off+uint32Len > len(msg) {
1372
+ return 0, off, errBaseLen
1373
+ }
1374
+ v := uint32(msg[off])<<24 | uint32(msg[off+1])<<16 | uint32(msg[off+2])<<8 | uint32(msg[off+3])
1375
+ return v, off + uint32Len, nil
1376
+ }
1377
+
1378
+ func skipUint32(msg []byte, off int) (int, error) {
1379
+ if off+uint32Len > len(msg) {
1380
+ return off, errBaseLen
1381
+ }
1382
+ return off + uint32Len, nil
1383
+ }
1384
+
1385
+ func packText(msg []byte, field string) []byte {
1386
+ for len(field) > 0 {
1387
+ l := len(field)
1388
+ if l > 255 {
1389
+ l = 255
1390
+ }
1391
+ msg = append(msg, byte(l))
1392
+ msg = append(msg, field[:l]...)
1393
+ field = field[l:]
1394
+ }
1395
+ return msg
1396
+ }
1397
+
1398
+ func unpackText(msg []byte, off int) (string, int, error) {
1399
+ if off >= len(msg) {
1400
+ return "", off, errBaseLen
1401
+ }
1402
+ beginOff := off + 1
1403
+ endOff := beginOff + int(msg[off])
1404
+ if endOff > len(msg) {
1405
+ return "", off, errCalcLen
1406
+ }
1407
+ return string(msg[beginOff:endOff]), endOff, nil
1408
+ }
1409
+
1410
+ func skipText(msg []byte, off int) (int, error) {
1411
+ if off >= len(msg) {
1412
+ return off, errBaseLen
1413
+ }
1414
+ endOff := off + 1 + int(msg[off])
1415
+ if endOff > len(msg) {
1416
+ return off, errCalcLen
1417
+ }
1418
+ return endOff, nil
1419
+ }
1420
+
1421
+ func packBytes(msg []byte, field []byte) []byte {
1422
+ return append(msg, field...)
1423
+ }
1424
+
1425
+ func unpackBytes(msg []byte, off int, field []byte) (int, error) {
1426
+ newOff := off + len(field)
1427
+ if newOff > len(msg) {
1428
+ return off, errBaseLen
1429
+ }
1430
+ copy(field, msg[off:newOff])
1431
+ return newOff, nil
1432
+ }
1433
+
1434
+ func skipBytes(msg []byte, off int, field []byte) (int, error) {
1435
+ newOff := off + len(field)
1436
+ if newOff > len(msg) {
1437
+ return off, errBaseLen
1438
+ }
1439
+ return newOff, nil
1440
+ }
1441
+
1442
+ const nameLen = 255
1443
+
1444
+ // A Name is a non-encoded domain name. It is used instead of strings to avoid
1445
+ // allocations.
1446
+ type Name struct {
1447
+ Data [nameLen]byte
1448
+ Length uint8
1449
+ }
1450
+
1451
+ // NewName creates a new Name from a string.
1452
+ func NewName(name string) (Name, error) {
1453
+ if len([]byte(name)) > nameLen {
1454
+ return Name{}, errCalcLen
1455
+ }
1456
+ n := Name{Length: uint8(len(name))}
1457
+ copy(n.Data[:], []byte(name))
1458
+ return n, nil
1459
+ }
1460
+
1461
+ func (n Name) String() string {
1462
+ return string(n.Data[:n.Length])
1463
+ }
1464
+
1465
+ // pack packs a domain name.
1466
+ //
1467
+ // Domain names are a sequence of counted strings split at the dots. They end
1468
+ // with a zero-length string. Compression can be used to reuse domain suffixes.
1469
+ //
1470
+ // The compression map will be updated with new domain suffixes. If compression
1471
+ // is nil, compression will not be used.
1472
+ func (n *Name) pack(msg []byte, compression map[string]int) ([]byte, error) {
1473
+ oldMsg := msg
1474
+
1475
+ // Add a trailing dot to canonicalize name.
1476
+ if n.Length == 0 || n.Data[n.Length-1] != '.' {
1477
+ return oldMsg, errNonCanonicalName
1478
+ }
1479
+
1480
+ // Allow root domain.
1481
+ if n.Data[0] == '.' && n.Length == 1 {
1482
+ return append(msg, 0), nil
1483
+ }
1484
+
1485
+ // Emit sequence of counted strings, chopping at dots.
1486
+ for i, begin := 0, 0; i < int(n.Length); i++ {
1487
+ // Check for the end of the segment.
1488
+ if n.Data[i] == '.' {
1489
+ // The two most significant bits have special meaning.
1490
+ // It isn't allowed for segments to be long enough to
1491
+ // need them.
1492
+ if i-begin >= 1<<6 {
1493
+ return oldMsg, errSegTooLong
1494
+ }
1495
+
1496
+ // Segments must have a non-zero length.
1497
+ if i-begin == 0 {
1498
+ return oldMsg, errZeroSegLen
1499
+ }
1500
+
1501
+ msg = append(msg, byte(i-begin))
1502
+
1503
+ for j := begin; j < i; j++ {
1504
+ msg = append(msg, n.Data[j])
1505
+ }
1506
+
1507
+ begin = i + 1
1508
+ continue
1509
+ }
1510
+
1511
+ // We can only compress domain suffixes starting with a new
1512
+ // segment. A pointer is two bytes with the two most significant
1513
+ // bits set to 1 to indicate that it is a pointer.
1514
+ if (i == 0 || n.Data[i-1] == '.') && compression != nil {
1515
+ if ptr, ok := compression[string(n.Data[i:])]; ok {
1516
+ // Hit. Emit a pointer instead of the rest of
1517
+ // the domain.
1518
+ return append(msg, byte(ptr>>8|0xC0), byte(ptr)), nil
1519
+ }
1520
+
1521
+ // Miss. Add the suffix to the compression table if the
1522
+ // offset can be stored in the available 14 bytes.
1523
+ if len(msg) <= int(^uint16(0)>>2) {
1524
+ compression[string(n.Data[i:])] = len(msg)
1525
+ }
1526
+ }
1527
+ }
1528
+ return append(msg, 0), nil
1529
+ }
1530
+
1531
+ // unpack unpacks a domain name.
1532
+ func (n *Name) unpack(msg []byte, off int) (int, error) {
1533
+ // currOff is the current working offset.
1534
+ currOff := off
1535
+
1536
+ // newOff is the offset where the next record will start. Pointers lead
1537
+ // to data that belongs to other names and thus doesn't count towards to
1538
+ // the usage of this name.
1539
+ newOff := off
1540
+
1541
+ // ptr is the number of pointers followed.
1542
+ var ptr int
1543
+
1544
+ // Name is a slice representation of the name data.
1545
+ name := n.Data[:0]
1546
+
1547
+ Loop:
1548
+ for {
1549
+ if currOff >= len(msg) {
1550
+ return off, errBaseLen
1551
+ }
1552
+ c := int(msg[currOff])
1553
+ currOff++
1554
+ switch c & 0xC0 {
1555
+ case 0x00: // String segment
1556
+ if c == 0x00 {
1557
+ // A zero length signals the end of the name.
1558
+ break Loop
1559
+ }
1560
+ endOff := currOff + c
1561
+ if endOff > len(msg) {
1562
+ return off, errCalcLen
1563
+ }
1564
+ name = append(name, msg[currOff:endOff]...)
1565
+ name = append(name, '.')
1566
+ currOff = endOff
1567
+ case 0xC0: // Pointer
1568
+ if currOff >= len(msg) {
1569
+ return off, errInvalidPtr
1570
+ }
1571
+ c1 := msg[currOff]
1572
+ currOff++
1573
+ if ptr == 0 {
1574
+ newOff = currOff
1575
+ }
1576
+ // Don't follow too many pointers, maybe there's a loop.
1577
+ if ptr++; ptr > 10 {
1578
+ return off, errTooManyPtr
1579
+ }
1580
+ currOff = (c^0xC0)<<8 | int(c1)
1581
+ default:
1582
+ // Prefixes 0x80 and 0x40 are reserved.
1583
+ return off, errReserved
1584
+ }
1585
+ }
1586
+ if len(name) == 0 {
1587
+ name = append(name, '.')
1588
+ }
1589
+ if len(name) > len(n.Data) {
1590
+ return off, errCalcLen
1591
+ }
1592
+ n.Length = uint8(len(name))
1593
+ if ptr == 0 {
1594
+ newOff = currOff
1595
+ }
1596
+ return newOff, nil
1597
+ }
1598
+
1599
+ func skipName(msg []byte, off int) (int, error) {
1600
+ // newOff is the offset where the next record will start. Pointers lead
1601
+ // to data that belongs to other names and thus doesn't count towards to
1602
+ // the usage of this name.
1603
+ newOff := off
1604
+
1605
+ Loop:
1606
+ for {
1607
+ if newOff >= len(msg) {
1608
+ return off, errBaseLen
1609
+ }
1610
+ c := int(msg[newOff])
1611
+ newOff++
1612
+ switch c & 0xC0 {
1613
+ case 0x00:
1614
+ if c == 0x00 {
1615
+ // A zero length signals the end of the name.
1616
+ break Loop
1617
+ }
1618
+ // literal string
1619
+ newOff += c
1620
+ if newOff > len(msg) {
1621
+ return off, errCalcLen
1622
+ }
1623
+ case 0xC0:
1624
+ // Pointer to somewhere else in msg.
1625
+
1626
+ // Pointers are two bytes.
1627
+ newOff++
1628
+
1629
+ // Don't follow the pointer as the data here has ended.
1630
+ break Loop
1631
+ default:
1632
+ // Prefixes 0x80 and 0x40 are reserved.
1633
+ return off, errReserved
1634
+ }
1635
+ }
1636
+
1637
+ return newOff, nil
1638
+ }
1639
+
1640
+ // A Question is a DNS query.
1641
+ type Question struct {
1642
+ Name Name
1643
+ Type Type
1644
+ Class Class
1645
+ }
1646
+
1647
+ func (q *Question) pack(msg []byte, compression map[string]int) ([]byte, error) {
1648
+ msg, err := q.Name.pack(msg, compression)
1649
+ if err != nil {
1650
+ return msg, &nestedError{"Name", err}
1651
+ }
1652
+ msg = packType(msg, q.Type)
1653
+ return packClass(msg, q.Class), nil
1654
+ }
1655
+
1656
+ func unpackResourceBody(msg []byte, off int, hdr ResourceHeader) (ResourceBody, int, error) {
1657
+ var (
1658
+ r ResourceBody
1659
+ err error
1660
+ name string
1661
+ )
1662
+ switch hdr.Type {
1663
+ case TypeA:
1664
+ var rb AResource
1665
+ rb, err = unpackAResource(msg, off)
1666
+ r = &rb
1667
+ name = "A"
1668
+ case TypeNS:
1669
+ var rb NSResource
1670
+ rb, err = unpackNSResource(msg, off)
1671
+ r = &rb
1672
+ name = "NS"
1673
+ case TypeCNAME:
1674
+ var rb CNAMEResource
1675
+ rb, err = unpackCNAMEResource(msg, off)
1676
+ r = &rb
1677
+ name = "CNAME"
1678
+ case TypeSOA:
1679
+ var rb SOAResource
1680
+ rb, err = unpackSOAResource(msg, off)
1681
+ r = &rb
1682
+ name = "SOA"
1683
+ case TypePTR:
1684
+ var rb PTRResource
1685
+ rb, err = unpackPTRResource(msg, off)
1686
+ r = &rb
1687
+ name = "PTR"
1688
+ case TypeMX:
1689
+ var rb MXResource
1690
+ rb, err = unpackMXResource(msg, off)
1691
+ r = &rb
1692
+ name = "MX"
1693
+ case TypeTXT:
1694
+ var rb TXTResource
1695
+ rb, err = unpackTXTResource(msg, off, hdr.Length)
1696
+ r = &rb
1697
+ name = "TXT"
1698
+ case TypeAAAA:
1699
+ var rb AAAAResource
1700
+ rb, err = unpackAAAAResource(msg, off)
1701
+ r = &rb
1702
+ name = "AAAA"
1703
+ case TypeSRV:
1704
+ var rb SRVResource
1705
+ rb, err = unpackSRVResource(msg, off)
1706
+ r = &rb
1707
+ name = "SRV"
1708
+ }
1709
+ if err != nil {
1710
+ return nil, off, &nestedError{name + " record", err}
1711
+ }
1712
+ if r == nil {
1713
+ return nil, off, errors.New("invalid resource type: " + string(hdr.Type+'0'))
1714
+ }
1715
+ return r, off + int(hdr.Length), nil
1716
+ }
1717
+
1718
+ // A CNAMEResource is a CNAME Resource record.
1719
+ type CNAMEResource struct {
1720
+ CNAME Name
1721
+ }
1722
+
1723
+ func (r *CNAMEResource) realType() Type {
1724
+ return TypeCNAME
1725
+ }
1726
+
1727
+ func (r *CNAMEResource) pack(msg []byte, compression map[string]int) ([]byte, error) {
1728
+ return r.CNAME.pack(msg, compression)
1729
+ }
1730
+
1731
+ func unpackCNAMEResource(msg []byte, off int) (CNAMEResource, error) {
1732
+ var cname Name
1733
+ if _, err := cname.unpack(msg, off); err != nil {
1734
+ return CNAMEResource{}, err
1735
+ }
1736
+ return CNAMEResource{cname}, nil
1737
+ }
1738
+
1739
+ // An MXResource is an MX Resource record.
1740
+ type MXResource struct {
1741
+ Pref uint16
1742
+ MX Name
1743
+ }
1744
+
1745
+ func (r *MXResource) realType() Type {
1746
+ return TypeMX
1747
+ }
1748
+
1749
+ func (r *MXResource) pack(msg []byte, compression map[string]int) ([]byte, error) {
1750
+ oldMsg := msg
1751
+ msg = packUint16(msg, r.Pref)
1752
+ msg, err := r.MX.pack(msg, compression)
1753
+ if err != nil {
1754
+ return oldMsg, &nestedError{"MXResource.MX", err}
1755
+ }
1756
+ return msg, nil
1757
+ }
1758
+
1759
+ func unpackMXResource(msg []byte, off int) (MXResource, error) {
1760
+ pref, off, err := unpackUint16(msg, off)
1761
+ if err != nil {
1762
+ return MXResource{}, &nestedError{"Pref", err}
1763
+ }
1764
+ var mx Name
1765
+ if _, err := mx.unpack(msg, off); err != nil {
1766
+ return MXResource{}, &nestedError{"MX", err}
1767
+ }
1768
+ return MXResource{pref, mx}, nil
1769
+ }
1770
+
1771
+ // An NSResource is an NS Resource record.
1772
+ type NSResource struct {
1773
+ NS Name
1774
+ }
1775
+
1776
+ func (r *NSResource) realType() Type {
1777
+ return TypeNS
1778
+ }
1779
+
1780
+ func (r *NSResource) pack(msg []byte, compression map[string]int) ([]byte, error) {
1781
+ return r.NS.pack(msg, compression)
1782
+ }
1783
+
1784
+ func unpackNSResource(msg []byte, off int) (NSResource, error) {
1785
+ var ns Name
1786
+ if _, err := ns.unpack(msg, off); err != nil {
1787
+ return NSResource{}, err
1788
+ }
1789
+ return NSResource{ns}, nil
1790
+ }
1791
+
1792
+ // A PTRResource is a PTR Resource record.
1793
+ type PTRResource struct {
1794
+ PTR Name
1795
+ }
1796
+
1797
+ func (r *PTRResource) realType() Type {
1798
+ return TypePTR
1799
+ }
1800
+
1801
+ func (r *PTRResource) pack(msg []byte, compression map[string]int) ([]byte, error) {
1802
+ return r.PTR.pack(msg, compression)
1803
+ }
1804
+
1805
+ func unpackPTRResource(msg []byte, off int) (PTRResource, error) {
1806
+ var ptr Name
1807
+ if _, err := ptr.unpack(msg, off); err != nil {
1808
+ return PTRResource{}, err
1809
+ }
1810
+ return PTRResource{ptr}, nil
1811
+ }
1812
+
1813
+ // An SOAResource is an SOA Resource record.
1814
+ type SOAResource struct {
1815
+ NS Name
1816
+ MBox Name
1817
+ Serial uint32
1818
+ Refresh uint32
1819
+ Retry uint32
1820
+ Expire uint32
1821
+
1822
+ // MinTTL the is the default TTL of Resources records which did not
1823
+ // contain a TTL value and the TTL of negative responses. (RFC 2308
1824
+ // Section 4)
1825
+ MinTTL uint32
1826
+ }
1827
+
1828
+ func (r *SOAResource) realType() Type {
1829
+ return TypeSOA
1830
+ }
1831
+
1832
+ func (r *SOAResource) pack(msg []byte, compression map[string]int) ([]byte, error) {
1833
+ oldMsg := msg
1834
+ msg, err := r.NS.pack(msg, compression)
1835
+ if err != nil {
1836
+ return oldMsg, &nestedError{"SOAResource.NS", err}
1837
+ }
1838
+ msg, err = r.MBox.pack(msg, compression)
1839
+ if err != nil {
1840
+ return oldMsg, &nestedError{"SOAResource.MBox", err}
1841
+ }
1842
+ msg = packUint32(msg, r.Serial)
1843
+ msg = packUint32(msg, r.Refresh)
1844
+ msg = packUint32(msg, r.Retry)
1845
+ msg = packUint32(msg, r.Expire)
1846
+ return packUint32(msg, r.MinTTL), nil
1847
+ }
1848
+
1849
+ func unpackSOAResource(msg []byte, off int) (SOAResource, error) {
1850
+ var ns Name
1851
+ off, err := ns.unpack(msg, off)
1852
+ if err != nil {
1853
+ return SOAResource{}, &nestedError{"NS", err}
1854
+ }
1855
+ var mbox Name
1856
+ if off, err = mbox.unpack(msg, off); err != nil {
1857
+ return SOAResource{}, &nestedError{"MBox", err}
1858
+ }
1859
+ serial, off, err := unpackUint32(msg, off)
1860
+ if err != nil {
1861
+ return SOAResource{}, &nestedError{"Serial", err}
1862
+ }
1863
+ refresh, off, err := unpackUint32(msg, off)
1864
+ if err != nil {
1865
+ return SOAResource{}, &nestedError{"Refresh", err}
1866
+ }
1867
+ retry, off, err := unpackUint32(msg, off)
1868
+ if err != nil {
1869
+ return SOAResource{}, &nestedError{"Retry", err}
1870
+ }
1871
+ expire, off, err := unpackUint32(msg, off)
1872
+ if err != nil {
1873
+ return SOAResource{}, &nestedError{"Expire", err}
1874
+ }
1875
+ minTTL, _, err := unpackUint32(msg, off)
1876
+ if err != nil {
1877
+ return SOAResource{}, &nestedError{"MinTTL", err}
1878
+ }
1879
+ return SOAResource{ns, mbox, serial, refresh, retry, expire, minTTL}, nil
1880
+ }
1881
+
1882
+ // A TXTResource is a TXT Resource record.
1883
+ type TXTResource struct {
1884
+ Txt string // Not a domain name.
1885
+ }
1886
+
1887
+ func (r *TXTResource) realType() Type {
1888
+ return TypeTXT
1889
+ }
1890
+
1891
+ func (r *TXTResource) pack(msg []byte, compression map[string]int) ([]byte, error) {
1892
+ return packText(msg, r.Txt), nil
1893
+ }
1894
+
1895
+ func unpackTXTResource(msg []byte, off int, length uint16) (TXTResource, error) {
1896
+ var txt string
1897
+ for n := uint16(0); n < length; {
1898
+ var t string
1899
+ var err error
1900
+ if t, off, err = unpackText(msg, off); err != nil {
1901
+ return TXTResource{}, &nestedError{"text", err}
1902
+ }
1903
+ // Check if we got too many bytes.
1904
+ if length-n < uint16(len(t))+1 {
1905
+ return TXTResource{}, errCalcLen
1906
+ }
1907
+ n += uint16(len(t)) + 1
1908
+ txt += t
1909
+ }
1910
+ return TXTResource{txt}, nil
1911
+ }
1912
+
1913
+ // An SRVResource is an SRV Resource record.
1914
+ type SRVResource struct {
1915
+ Priority uint16
1916
+ Weight uint16
1917
+ Port uint16
1918
+ Target Name // Not compressed as per RFC 2782.
1919
+ }
1920
+
1921
+ func (r *SRVResource) realType() Type {
1922
+ return TypeSRV
1923
+ }
1924
+
1925
+ func (r *SRVResource) pack(msg []byte, compression map[string]int) ([]byte, error) {
1926
+ oldMsg := msg
1927
+ msg = packUint16(msg, r.Priority)
1928
+ msg = packUint16(msg, r.Weight)
1929
+ msg = packUint16(msg, r.Port)
1930
+ msg, err := r.Target.pack(msg, nil)
1931
+ if err != nil {
1932
+ return oldMsg, &nestedError{"SRVResource.Target", err}
1933
+ }
1934
+ return msg, nil
1935
+ }
1936
+
1937
+ func unpackSRVResource(msg []byte, off int) (SRVResource, error) {
1938
+ priority, off, err := unpackUint16(msg, off)
1939
+ if err != nil {
1940
+ return SRVResource{}, &nestedError{"Priority", err}
1941
+ }
1942
+ weight, off, err := unpackUint16(msg, off)
1943
+ if err != nil {
1944
+ return SRVResource{}, &nestedError{"Weight", err}
1945
+ }
1946
+ port, off, err := unpackUint16(msg, off)
1947
+ if err != nil {
1948
+ return SRVResource{}, &nestedError{"Port", err}
1949
+ }
1950
+ var target Name
1951
+ if _, err := target.unpack(msg, off); err != nil {
1952
+ return SRVResource{}, &nestedError{"Target", err}
1953
+ }
1954
+ return SRVResource{priority, weight, port, target}, nil
1955
+ }
1956
+
1957
+ // An AResource is an A Resource record.
1958
+ type AResource struct {
1959
+ A [4]byte
1960
+ }
1961
+
1962
+ func (r *AResource) realType() Type {
1963
+ return TypeA
1964
+ }
1965
+
1966
+ func (r *AResource) pack(msg []byte, compression map[string]int) ([]byte, error) {
1967
+ return packBytes(msg, r.A[:]), nil
1968
+ }
1969
+
1970
+ func unpackAResource(msg []byte, off int) (AResource, error) {
1971
+ var a [4]byte
1972
+ if _, err := unpackBytes(msg, off, a[:]); err != nil {
1973
+ return AResource{}, err
1974
+ }
1975
+ return AResource{a}, nil
1976
+ }
1977
+
1978
+ // An AAAAResource is an AAAA Resource record.
1979
+ type AAAAResource struct {
1980
+ AAAA [16]byte
1981
+ }
1982
+
1983
+ func (r *AAAAResource) realType() Type {
1984
+ return TypeAAAA
1985
+ }
1986
+
1987
+ func (r *AAAAResource) pack(msg []byte, compression map[string]int) ([]byte, error) {
1988
+ return packBytes(msg, r.AAAA[:]), nil
1989
+ }
1990
+
1991
+ func unpackAAAAResource(msg []byte, off int) (AAAAResource, error) {
1992
+ var aaaa [16]byte
1993
+ if _, err := unpackBytes(msg, off, aaaa[:]); err != nil {
1994
+ return AAAAResource{}, err
1995
+ }
1996
+ return AAAAResource{aaaa}, nil
1997
+ }