packages feed

dnsbase-1.0.0.0: README.md

# Base DNS library with extensible core types

A DNS stub-resolver library with a typed `RData` model and a runtime
extension API.  The IO layer is derived from Kazu Yamamoto's
[`dns`](https://hackage.haskell.org/package/dns) package; what
`dnsbase` layers on top sits in the RR-data model and the
configuration story.

Every RR type's payload is modeled via a dedicated Haskell type —
these include, for example, the recent SVCB / HTTPS service-binding
records, with up-to-date extensible SvcParam coverage.  EDNS option
support includes Extended DNS Errors (EDE) with a user-extensible
info-code name table.  Coverage of both widely used and historical
DNS RR types is comprehensive — only the most marginal obsolete or
experimental types remain unimplemented.

Applications can extend the library with any *missing* RRtypes,
EDNS(0) options, or SVCB / HTTPS SvcParam values.
Application-specified data types take precedence over any existing
or later-added built-in implementations.

Extensions are registered by constructing a pure resolver
configuration value, rather than via IO actions on mutable global
state.  Adding custom data types to the library does not require a
source-code fork.  See
[Adding a custom RR type](https://hackage.haskell.org/package/dnsbase/docs/Net-DNSBase-Extensible.html#customRRtype)
and
[Adding a custom EDNS option](https://hackage.haskell.org/package/dnsbase/docs/Net-DNSBase-Extensible.html#customEDNS)
for detailed examples.

The basic lookup interface (`lookupA`, `lookupMX`, `lookupTXT`, …)
is deliberately similar to `dns`; the differences are concentrated
in the typed-data layer and the configuration surface.

## Basic MX lookup example

The example below prints the MX records of `ietf.org`, if any, or an error
message if the answer can't be obtained.

The compile-time literal splice used here is `dnLit8`, the octet-level form
that accepts any RFC 1035 master-file string (the input is treated as raw
bytes, with `\DDD` and `\C` escapes).  For IDN-aware literals — strict
IDNA2008 validation, U-label encoding to A-labels, optional cross-label Bidi
checks — use `dnLit` from `Net.DNSBase.Domain` with a parser from the
companion `idna2008` package; see the `dnLit` haddock for the composition
idiom.

```haskell
{-# LANGUAGE
    BlockArguments
  , LambdaCase
  , RecordWildCards
  , TemplateHaskell
  #-}
import Control.Exception (throwIO)
import Net.DNSBase
import System.IO (stdout)

main :: IO ()
main = makeResolvSeed defaultResolvConf >>= \ case
    Right seed -> withResolver seed \ r ->
        lookupMX r $$(dnLit8 "ietf.org") >>= \ case
            Right mxs -> hPutBuilder stdout $ foldr presentLn mempty mxs
            Left errs -> throwIO errs
    Left errs -> throwIO errs
```

## Custom extensions

The [`demos/`](https://github.com/dnsbase/dnsbase/tree/main/demos)
directory contains worked examples for each of the three extension
targets:

- [`demoextrr.hs`](https://github.com/dnsbase/dnsbase/blob/main/demos/demoextrr.hs)
  — adding a custom RR type, by shadowing the standard `A` record
  with a raw-`Word32` representation that presents each address as
  eight hex nibbles under a made-up name `HEXA`.  Shows the
  `KnownRData` instance shape and registration via
  `registerRRtype`.
- [`demoextopt.hs`](https://github.com/dnsbase/dnsbase/blob/main/demos/demoextopt.hs)
  — adding an EDNS(0) option (the EDNS cookie, RFC 7873), queried
  directly against `ns1.isc.org` to elicit a server cookie.  Shows
  the `KnownEdnsOption` instance shape, registration via
  `registerEdnsOption`, and per-call option injection via
  `optCtlAdd`.
- [`demoextspv.hs`](https://github.com/dnsbase/dnsbase/blob/main/demos/demoextspv.hs)
  — adding (here, shadowing) an HTTPS / SVCB service parameter, by
  re-implementing the `ipv4hint` key (codepoint 4) with a
  raw-`Word32`-list representation and a hex presentation form
  under a made-up name `IPV4HEX`.  Shows the `KnownSVCParamValue`
  instance shape and the registration via `extendRRwithType`
  applied to both `T_svcb` and `T_https` (SVCB-shaped RRs share
  the SvcParam codec map).

Each demo is a self-contained program; copy one into a project
and adjust the queries to taste.