Differences From Artifact [d8a14eee35]:
- File src/resolver.cr — part of check-in [b6cfd2fe24] at 2021-03-05 00:59:15 on branch trunk — Initial support for sending the query (user: js, size: 3325) [annotate] [blame] [check-ins using]
To Artifact [7201657da1]:
- File
src/resolver.cr
— part of check-in
[af207d1100]
at
2021-03-05 01:34:03
on branch trunk
— Use IO::Memory to build the raw data
This is much nicer than using Bytes and fixes always sending 512 bytes. (user: js, size: 3030) [annotate] [blame] [check-ins using]
︙ | ︙ | |||
27 28 29 30 31 32 33 | getter raw_data : Bytes def initialize(@query : Query, @id : UInt16, @settings : Settings, @block : Response | Error ->) @ns_index = 0 @attempt = 0 @used_ns = nil | < | | < < < > < < > < > | < < < | | < < < | | | | 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | getter raw_data : Bytes def initialize(@query : Query, @id : UInt16, @settings : Settings, @block : Response | Error ->) @ns_index = 0 @attempt = 0 @used_ns = nil # Header io = IO::Memory.new(512) io.write_bytes(@id, IO::ByteFormat::BigEndian) # RD io.write_bytes(0x100_u16, IO::ByteFormat::BigEndian) # QDCOUNT io.write_bytes(1_u16, IO::ByteFormat::BigEndian) # ANCOUNT, NSCOUNT and ARCOUNT 3.times { io.write_bytes(0_u16) } # Question # QNAME @query.domain.split('.').each do |component| if component.bytesize > 63 || io.size + component.bytesize > 512 raise ArgumentError.new("Domain component too long") end io << component end # QTYPE io.write_bytes(@query.rr_type.to_u16, IO::ByteFormat::BigEndian) # QCLASS io.write_bytes(@query.dns_class.to_u16, IO::ByteFormat::BigEndian) @raw_data = io.to_slice end end def initialize @settings = Settings.new @queries = Hash(UInt16, Context).new @tcp_queries = Hash(Socket, Context).new |
︙ | ︙ |