This PR adds experimental support for client transport of DNS messages.
It also adds a new concept of unstable features which gate code that can introduce breaking changes also in non-breaking releases.
This PR refactors the existing support for OPT options. It does the
following things:
o Changes all option data types to ensure their wire format is at most
65,535 octets long. This requires changing the signatures of some
creator functions. Their naming scheme and signatures are also changed
to follow the pattern established with record data.
o Renamed `UnknownOptData::from_octets` to `new` and return a result.
o Completely redesigns DNS cookie options, adding support for standard
server cookies introduced in RFC 9018.
o Change the type of `ExtendedError`’s text to `Str<Octs>` and change the
return type of `set_text` to `()`.
o Changed the type `TcpKeepalive`’s content to a newtype `IdleTimeout` to
make it easier to convert to and from durations.
o Changes Padding to just contain the padding octets and drop
`PaddingMode`. Instead, the methods on OptBuilder` should be used to
add padding.
This is a breaking change.
This commit swaps the traits and types defined in `base::octets` for their
equivalent in the `octseq` trait. These are mostly the same except that they
facilitate Generic Associated Types as stabilized in Rust 1.65. This results
in subtly changed trait bounds, though mostly these should be invisible to
the user.
One notable change is that `octseq` makes the error type of the
`OctetsBuilder` generic and uses `Infallible` for those types where
appending data will never fail (which, for most users, is all of them). It
provides methods for either case and we are mirroring these in `domain`.
While this means that converting you code to using the PR will require some
work, that work should mostly be removing unwraps – which is nice.
We’re using the opportunity to clean up a few more things that have crept
into the code over time. A list of which will be added here:
* The range, slice, and split methods on the domain name types have
changed. They have been merge into a single method taking ranges – except
for those on `Dname` that require type changes. The split methods now
take references and don’t change `self` anymore. This is somewhat
required by the limitations imposed by the new `Octets` trait but feels
better, anyway.
* The `Parse`, `Compose`, and `Scan` traits have been demoted to mere
extension traits for foreign types (primarily the built-in integers, so
that you can do things like `u16::parse`). All other types now simply have
methods matching the patterns. Where generics are necessary, dedicated
traits have been added. E.g., there now are `ParseRecordData` and
`ComposeRecordData` traits that are implemented by all record data types.
* Composing of record data and options has been switched to a scheme where
the size is predetermined whenever possible instead of composing the data
and then updating the length after. Since this is not possible for record
data that uses compressed names when compression is actually in use, the
old scheme is still used in this particular case.
This commit completely redesigns zone file parsing. The primary change is to
convert the scanner into a trait in order to allow multiple zone parser
implementations for different sources and purposes. A number of changes had
to be made in order to make this possible.
The commit also contains an initial implementation of a scanner that modifies
data in-place and can thus returned parsed data with only a minimal amount
of additional allocations. While working, this scanner is more a
proof-of-concept at this point to ensure that the API design is sound.
This commit is based on ideas and code proposed by @not-my-profile in #106.
This commit increases the minimal supported Rust version to 1.59.0.