dns.bend fails
raw source on the hub · import bend-kit-dns@0.3.2.1/dns.bend as Dns
DNS codec and host lookup. Source: https://github.com/paymog/bend-kit/tree/main/dns
2 imports
import Base import 0x096635686408886b7d907f16c4550317/wire.bend as Wire
Types
type Cur source · line 10 · raw
Data
Cur@v:U32 -> @rest:String -> Cur
type RR source · line 13 · raw
Data
RRBadRR
RRA@ip:String -> RR
RRSkip@rest:String -> RR
type Try source · line 329 · raw
Data
One attempt's outcome: try again, or this answer (None: no address).
AgainTry
Got@ip:Maybe<&2, String> -> Try
Definitions
def u8 source · line 18 · raw
@s:String -> Maybe<&2, Cur>
def u16.lo source · line 25 · raw
@hi:U32 -> @m:Maybe<&2, Cur> -> Maybe<&2, Cur>
def u16.go source · line 32 · raw
@m:Maybe<&2, Cur> -> Maybe<&2, Cur>
def u16 source · line 39 · raw
@s:String -> Maybe<&2, Cur>
def skip.if source · line 42 · raw
@+s:String -> @+n:Nat -> @short:Bool -> Maybe<&2, String>
def skip source · line 49 · raw
@+s:String -> @+n:Nat -> Maybe<&2, String>
def then source · line 52 · raw
@m:Maybe<&2, String> -> @n:Nat -> Maybe<&2, String>
def push16 source · line 59 · raw
@+n:U32 -> @acc:String -> String
def label.ok source · line 65 · raw
@+l:String -> Bool
def label.ascii source · line 69 · raw
@s:String -> Bool
def labels.ok source · line 76 · raw
@xs:List<&2, String> -> Bool
def labels.put source · line 83 · raw
@xs:List<&2, String> -> @acc:String -> String
def query.if source · line 90 · raw
@+id:U32 -> @xs:List<&2, String> -> @ok:Bool -> Maybe<&2, String>
def query.labels source · line 98 · raw
@+id:U32 -> @+xs:List<&2, String> -> Maybe<&2, String>
def strip_dot.if source · line 101 · raw
@+s:String -> @dot:Bool -> String
def strip_dot source · line 108 · raw
@+s:String -> String
def query source · line 112 · raw
@id:U32 -> @name:String -> Maybe<&2, String>
RFC 1035 §4.1: a standard query for the A record of name.
def name.skip source · line 119 · raw
@fuel:Nat -> @s:String -> Maybe<&2, String>
§4.1.4: a name is labels ending in a zero octet, or a two-octet pointer.
def name.then source · line 130 · raw
@m:Maybe<&2, String> -> @n:Nat -> Maybe<&2, String>
def dotted source · line 137 · raw
@s:String -> String
def rr.f source · line 148 · raw
@+r:String -> @+len:U32 -> @a:Bool -> RR
def rr.data source · line 155 · raw
@+r:String -> @+len:U32 -> @a:Bool -> @short:Bool -> RR
def rr.e source · line 162 · raw
@+ty:U32 -> @+cl:U32 -> @m:Maybe<&2, Cur> -> RR
def rr.d source · line 169 · raw
@ty:U32 -> @cl:U32 -> @m:Maybe<&2, String> -> RR
def rr.c source · line 176 · raw
@ty:U32 -> @m:Maybe<&2, Cur> -> RR
def rr.b source · line 183 · raw
@m:Maybe<&2, Cur> -> RR
def rr.a source · line 190 · raw
@m:Maybe<&2, String> -> RR
def rr source · line 198 · raw
@+s:String -> RR
§4.1.3: NAME, TYPE, CLASS, TTL, RDLENGTH, RDATA.
def answers.scan source · line 202 · raw
@fuel:Nat -> @r:RR -> Maybe<&2, String>
fuel = records left. The first A record wins; CNAMEs before it are skipped.
def questions source · line 215 · raw
@fuel:Nat -> @m:Maybe<&2, String> -> Maybe<&2, String>
def body.go source · line 222 · raw
@an:U32 -> @m:Maybe<&2, String> -> Maybe<&2, String>
def body.an source · line 229 · raw
@qd:U32 -> @m:Maybe<&2, Cur> -> Maybe<&2, String>
def body.qd source · line 236 · raw
@m:Maybe<&2, Cur> -> Maybe<&2, String>
def flags.ok source · line 244 · raw
@+f:U32 -> Bool
§4.1.1: QR set, opcode QUERY, not truncated, RCODE 0.
def head.flags.if source · line 247 · raw
@r:String -> @ok:Bool -> Maybe<&2, String>
def head.flags source · line 254 · raw
@m:Maybe<&2, Cur> -> Maybe<&2, String>
def head.id.if source · line 261 · raw
@r:String -> @ok:Bool -> Maybe<&2, String>
def head.id source · line 268 · raw
@id:U32 -> @m:Maybe<&2, Cur> -> Maybe<&2, String>
def answer source · line 276 · raw
@id:U32 -> @msg:String -> Maybe<&2, String>
The IPv4 address the response gives for the query with this id.
def nameservers.add source · line 282 · raw
@+line:String -> @rest:List<&2, String> -> @hit:Bool -> List<&2, String>
def nameservers.go source · line 289 · raw
@xs:List<&2, String> -> List<&2, String>
def nameservers source · line 297 · raw
@conf:String -> List<&2, String>
Every nameserver line, in file order.
def nameserver.first source · line 300 · raw
@xs:List<&2, String> -> Maybe<&2, String>
def nameserver source · line 308 · raw
@conf:String -> Maybe<&2, String>
The first nameserver line of a resolv.conf.
def none source · line 314 · raw
IO(Maybe<&2, String>)
def ipv4.go source · line 317 · raw
@s:String -> Bool
def ipv4 source · line 325 · raw
@+s:String -> Bool
Digits and dots; TCP.connect rejects anything else that is not an address.
def try.pure source · line 333 · raw
@s:Socket -> @t:Try -> IO(Pair(Socket, Try))
def try.from source · line 337 · raw
@s:Socket -> @+ns:String -> @id:U32 -> @hpd:Pair(String, Pair(U32, String)) -> IO(Pair(Socket, Try))
A datagram from anyone but the nameserver's port 53 is ignored (retried).
def try.back source · line 341 · raw
@ns:String -> @id:U32 -> @m:Pair(Socket, Result<&1, &1, Pair(U32, String), Pair(String, Pair(U32, String))>) -> IO(Pair(Socket, Try))
def try.sent source · line 350 · raw
@ns:String -> @id:U32 -> @m:Pair(Socket, Result<&1, &1, Pair(U32, String), Unit>) -> IO(Pair(Socket, Try))
§4.2.1 and resolv.conf defaults: 5 s per attempt.
def try.once source · line 360 · raw
@s:Socket -> @+ns:String -> @id:U32 -> @q:String -> IO(Pair(Socket, Try))
def try.close source · line 365 · raw
@s:Socket -> @r:Maybe<&2, String> -> IO(Maybe<&2, String>)
def tries.end source · line 370 · raw
@st:Pair(Socket, Try) -> IO(Maybe<&2, String>)
def tries source · line 379 · raw
@fuel:Nat -> @+ns:String -> @+id:U32 -> @+q:String -> @st:Pair(Socket, Try) -> IO(Maybe<&2, String>)
fuel: attempts left (resolv.conf's default is 2).
def resolve.sock source · line 393 · raw
@ns:String -> @id:U32 -> @q:String -> @r:Result<&1, &1, Pair(U32, String), Socket> -> IO(Maybe<&2, String>)
def resolve.q source · line 400 · raw
@ns:String -> @id:U32 -> @q:Maybe<&2, String> -> IO(Maybe<&2, String>)
def resolve.id source · line 410 · raw
@name:String -> @ns:String -> @r:Result<&1, &1, Pair(U32, String), U32> -> IO(Maybe<&2, String>)
§7.3: a random id makes forged answers harder to land.
def resolve.ns source · line 418 · raw
@name:String -> @ns:Maybe<&2, String> -> IO(Maybe<&2, String>)
def resolve.at source · line 428 · raw
@+host:String -> @ns:String -> IO(Maybe<&2, String>)
Ask one nameserver. Tests use this; resolve reads /etc/resolv.conf.
def conf.text source · line 431 · raw
@r:Result<&1, &1, Pair(U32, String), String> -> String
def resolve.n3 source · line 439 · raw
@+name:String -> @xs:List<&2, String> -> IO(Maybe<&2, String>)
ponytail: 3 nameservers; a longer resolv.conf ignores the rest
def resolve.n2b source · line 446 · raw
@+name:String -> @rest:List<&2, String> -> @ip:Maybe<&2, String> -> IO(Maybe<&2, String>)
def resolve.n2 source · line 453 · raw
@+name:String -> @xs:List<&2, String> -> IO(Maybe<&2, String>)
def resolve.n1b source · line 462 · raw
@+name:String -> @rest:List<&2, String> -> @ip:Maybe<&2, String> -> IO(Maybe<&2, String>)
def resolve.list source · line 469 · raw
@+name:String -> @xs:List<&2, String> -> IO(Maybe<&2, String>)
def resolve.read source · line 478 · raw
@name:String -> @m:Pair(File, Result<&1, &1, Pair(U32, String), String>) -> IO(Maybe<&2, String>)
def resolve.conf source · line 484 · raw
@name:String -> @r:Result<&1, &1, Pair(U32, String), File> -> IO(Maybe<&2, String>)
def resolve.dns source · line 493 · raw
@name:String -> IO(Maybe<&2, String>)
def hosts.pick source · line 499 · raw
@found:Maybe<&2, String> -> @now:Maybe<&2, String> -> Maybe<&2, String>
def hosts.hit source · line 506 · raw
@+ip:String -> @hit:Bool -> Maybe<&2, String>
def hosts.names source · line 513 · raw
@xs:List<&2, String> -> @+name:String -> @+ip:String -> @found:Maybe<&2, String> -> Maybe<&2, String>
def hosts.ip source · line 520 · raw
@+name:String -> @+ip:String -> @ns:List<&2, String> -> @ok:Bool -> Maybe<&2, String>
def hosts.line source · line 527 · raw
@+name:String -> @xs:List<&2, String> -> Maybe<&2, String>
def hosts.sp source · line 534 · raw
@+c:U32 -> @tab:Bool -> U32
def hosts.flat source · line 541 · raw
@s:String -> String
def hosts.scan source · line 548 · raw
@xs:List<&2, String> -> @+name:String -> @found:Maybe<&2, String> -> Maybe<&2, String>
def hosts source · line 556 · raw
@+name:String -> @text:String -> Maybe<&2, String>
First IPv4 address for name in an /etc/hosts file. The name is already lowercase.
def resolve.from source · line 559 · raw
@+name:String -> @m:Maybe<&2, String> -> IO(Maybe<&2, String>)
def resolve.text source · line 566 · raw
@+name:String -> @r:Result<&1, &1, Pair(U32, String), String> -> IO(Maybe<&2, String>)
def resolve.opened source · line 573 · raw
@+name:String -> @m:Pair(File, Result<&1, &1, Pair(U32, String), String>) -> IO(Maybe<&2, String>)
def resolve.hosts source · line 579 · raw
@+name:String -> @r:Result<&1, &1, Pair(U32, String), File> -> IO(Maybe<&2, String>)
def resolve.got source · line 592 · raw
@r:Result<&1, &1, Pair(U32, String), String> -> IO(Maybe<&2, String>)
def resolve.os source · line 599 · raw
@+name:String -> IO(Maybe<&2, String>)
def resolve.ask source · line 606 · raw
@+name:String -> IO(Maybe<&2, String>)
An IPv4 address for host: literals as is, localhost (RFC 6761), /etc/hosts, else UDP DNS. ponytail: no AAAA, no TCP retry on TC
def resolve.pure source · line 611 · raw
@+host:String -> IO(Maybe<&2, String>)
def resolve source · line 614 · raw
@+host:String -> IO(Maybe<&2, String>)
Effects (foreign code)
effect lookup source · line 588 · raw
@host:String -> IO(Result<&1, &1, Pair(U32, String), String>)
foreign: effs/dns.c, effs/dns.js