- `CacheControl.FlushCaches`
- `Querier.Query`
- `Resolver.Resolve`
Besides all the API churn, this leads to `ParallelBestResolver`,
`StrictResolver` and `UpstreamResolver` simplification: timeouts only
need to be setup in one place, `UpstreamResolver`.
We also benefit from using HTTP request contexts, so if the client
closes the connection we stop processing on our side.
* refactor: make `config.Duration` a struct with `time.Duration` embed
Allows directly calling `time.Duration` methods.
* refactor(HostsFileResolver): don't copy individual config items
The idea is to make adding configuration options easier, and searching
for references straight forward.
* refactor: move config printing to struct and use a logger
Using a logger allows using multiple levels so the whole configuration
can be printed in trace/verbose mode, but only important parts are
shown by default.
* squash: rename `Cast` to `ToDuration`
* squash: revert `Duration` to a simple wrapper ("new type" pattern)
* squash: `Duration.IsZero` tests
* squash: refactor resolvers to rely on their config directly if possible
* squash: implement `IsEnabled` and `LogValues` for all resolvers
* refactor: use go-enum `--values` to simplify getting all log fields
* refactor: simplify `QType` unmarshaling
* squash: rename `ValueLogger` to `Configurable`
* squash: rename `UpstreamConfig` to `ParallelBestConfig`
* squash: rename `RewriteConfig` to `RewriterConfig`
* squash: config tests
* squash: resolver tests
* squash: add `ForEach` test and improve `Chain` ones
* squash: simplify implementing `config.Configurable`
* squash: minor changes for better coverage
* squash: more `UnmarshalYAML` -> `UnmarshalText`
* refactor: move `config.Upstream` into own file
* refactor: add `Resolver.Type` method
* squash: add `log` method to `typed` to use `Resolover.Type` as prefix
* squash: tweak startup config logging
* squash: add `LogResolverConfig` tests
* squash: make sure all options of type `Duration` use `%s`