dns === This library is a DNS-over-HTTPS client for Common Lisp. The ambition is to transform it into a fully-featured DNS resolver instead of piggy-backing on the HTTPS implementation, but ... baby-steps! Note that there is no Common Lisp HTTP client that fully supports the HTTP2 protocol at the moment, so you can not expect this library to provide equivalent performance to a native DNS resolver (yet). ## API The API is kept as simple as it can be. ### Types The types of this library are implemented as several structs that support binary (de-)serialisation via [lisp-binary][]. The existing structs are as follows and directly implement the corresponding definitions from [RFC 1035][]: * `dns-header` * `dns-question` * `dns-rr` * `dns-message` All relevant field accessors for these structs are exported and can be used to inspect query results. ### Functions All lookup functions are of the type `(function (string &key doh-url) (dns-message))` and signal a `dns:doh-error` condition for unsuccessful requests. If `:doh-url` is unspecified, Google's public DNS-over-HTTPS servers at [dns.google][https://dns.google] will be used. Currently implemented lookup functions: * `lookup-a` * `lookup-mx` * `lookup-txt` ## Example usage ```lisp DNS> (dns-message-answer (lookup-a "git.tazj.in.")) #(#S(DNS-RR :NAME #S(QNAME :START-AT 29 :NAMES #(12)) :TYPE A :CLASS 1 :TTL 286 :RDLENGTH 4 :RDATA #(34 98 120 189))) ``` ## TODO Various things in this library are currently broken because I only implemented it to work for my blog setup, but these things will be ironed out. Most importantly, the following needs to be fixed: * Each qname *fragment* needs to track its offset, not each qname. * The RDATA for a TXT record can have multiple counted strings. * qnames should be canonicalised after parsing. [lisp-binary]: https://github.com/j3pic/lisp-binary [RFC 1035]: https://tools.ietf.org/html/rfc1035