feat(netxlite): implement DNSTransport wrapping (#776)
Acknowledge that transports MAY be used in isolation (i.e., outside of a Resolver) and add support for wrapping. Ensure that every factory that creates an unwrapped type is named accordingly to hopefully ensure there are no surprises. Implement DNSTransport wrapping and use a technique similar to the one used by Dialer to customize the DNSTransport while constructing more complex data types (e.g., a specific resolver). Ensure that the stdlib resolver's own "getaddrinfo" transport (1) is wrapped and (2) could be extended during construction. This work is part of my ongoing effort to bring to this repository websteps-illustrated changes relative to netxlite. Ref issue: https://github.com/ooni/probe/issues/2096
This commit is contained in:
parent
923d81cdee
commit
8f7e3803eb
20 changed files with 369 additions and 91 deletions
|
|
@ -23,18 +23,23 @@ import (
|
|||
var ErrNoDNSTransport = errors.New("operation requires a DNS transport")
|
||||
|
||||
// NewResolverStdlib creates a new Resolver by combining WrapResolver
|
||||
// with an internal "system" resolver type.
|
||||
func NewResolverStdlib(logger model.DebugLogger) model.Resolver {
|
||||
return WrapResolver(logger, newResolverSystem())
|
||||
// with an internal "system" resolver type. The list of optional wrappers
|
||||
// allow to wrap the underlying getaddrinfo transport. Any nil wrapper
|
||||
// will be silently ignored by the code that performs the wrapping.
|
||||
func NewResolverStdlib(logger model.DebugLogger, wrappers ...model.DNSTransportWrapper) model.Resolver {
|
||||
return WrapResolver(logger, newResolverSystem(wrappers...))
|
||||
}
|
||||
|
||||
func newResolverSystem() *resolverSystem {
|
||||
func newResolverSystem(wrappers ...model.DNSTransportWrapper) *resolverSystem {
|
||||
return &resolverSystem{
|
||||
t: &dnsOverGetaddrinfoTransport{},
|
||||
t: WrapDNSTransport(&dnsOverGetaddrinfoTransport{}, wrappers...),
|
||||
}
|
||||
}
|
||||
|
||||
// NewResolverUDP creates a new Resolver using DNS-over-UDP.
|
||||
// NewSerialResolverUDP creates a new Resolver using DNS-over-UDP
|
||||
// that performs serial A/AAAA lookups during LookupHost.
|
||||
//
|
||||
// Deprecated: use NewParallelResolverUDP.
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
|
|
@ -43,9 +48,33 @@ func newResolverSystem() *resolverSystem {
|
|||
// - dialer is the dialer to create and connect UDP conns
|
||||
//
|
||||
// - address is the server address (e.g., 1.1.1.1:53)
|
||||
func NewResolverUDP(logger model.DebugLogger, dialer model.Dialer, address string) model.Resolver {
|
||||
return WrapResolver(logger, NewSerialResolver(
|
||||
NewDNSOverUDPTransport(dialer, address),
|
||||
//
|
||||
// - wrappers is the optional list of wrappers to wrap the underlying
|
||||
// transport. Any nil wrapper will be silently ignored.
|
||||
func NewSerialResolverUDP(logger model.DebugLogger, dialer model.Dialer,
|
||||
address string, wrappers ...model.DNSTransportWrapper) model.Resolver {
|
||||
return WrapResolver(logger, NewUnwrappedSerialResolver(
|
||||
WrapDNSTransport(NewUnwrappedDNSOverUDPTransport(dialer, address), wrappers...),
|
||||
))
|
||||
}
|
||||
|
||||
// NewParallelResolverUDP creates a new Resolver using DNS-over-UDP
|
||||
// that performs parallel A/AAAA lookups during LookupHost.
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// - logger is the logger to use
|
||||
//
|
||||
// - dialer is the dialer to create and connect UDP conns
|
||||
//
|
||||
// - address is the server address (e.g., 1.1.1.1:53)
|
||||
//
|
||||
// - wrappers is the optional list of wrappers to wrap the underlying
|
||||
// transport. Any nil wrapper will be silently ignored.
|
||||
func NewParallelResolverUDP(logger model.DebugLogger, dialer model.Dialer,
|
||||
address string, wrappers ...model.DNSTransportWrapper) model.Resolver {
|
||||
return WrapResolver(logger, NewUnwrappedParallelResolver(
|
||||
WrapDNSTransport(NewUnwrappedDNSOverUDPTransport(dialer, address), wrappers...),
|
||||
))
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue