netty/netty — pull request #3146 by timboudreau (2014-11-16 23:06:26+00:00)
Title: DNS server support

Support for writing DNS servers, and various API changes to accomplish that, specifically:

- `DnsType` -> `DnsType` where RecordType is a subclass of `DnsEntry`, and has payload decoders for specific types
- Introduced record-specific subclasses of `DnsEntry` for common types, with fallback to the ByteBuf-based `DnsResource`
- `DnsEntry` gains public `writeTo()` and `writePayload()` to write itself correctly into a ByteBuf
- Added `DnsQueryDecoder` and `DnsResponseEncoder`
- Introduced `NameWriter` for writing names, so that it's possible to implement a stateful `NameWriter` to do DNS name compression
- `DnsMessage` is threadsafe (needed for proxy DNS servers where multiple calls to remote DNS servers may contribute partial responses)
- If someone really feels strongly that creating the `List` instances it uses internally should be lazy, that could be done, but it would be good to have some evidence that really accomplishes something - feels like premature optimization
- `DnsQuestion` is no longer a subclass of `DnsEntry` (which now has a time-to-live, since that is common to all other record types).
- Added the package io.netty.handler.codec.dns.server with `DnsServerHandler`, a `SimpleChannelInboundHandler` that handles the common plumbing of writing a DNS server that is unlikely to differ between implementations
- Corrected error codes in `DnsResponseCode` to match https://tools.ietf.org/html/rfc2929 (they were sequential, but in fact 11-15 are unused and numbering restarts at 16)
- Added error codes that exist but were not included in `DnsResponseCode` but are part of the spec
- Added `DnsDecoderException` which can specify a `DnsResponseCode`
- `DnsQuery` implements `Iterable`, simply because it's intuitive
- Reasonable `toString()` implementations on entity classes for logging purposes
- Added to netty-examples: DNS server, DNS client, proxy DNS server