fix(netxlite): add error wrappers (#480)

See https://github.com/ooni/probe/issues/1591
This commit is contained in:
Simone Basso 2021-09-07 19:56:42 +02:00 committed by GitHub
commit 323266da83
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 729 additions and 15 deletions

View file

@ -6,6 +6,7 @@ import (
"net"
"time"
"github.com/ooni/probe-cli/v3/internal/netxlite/errorsx"
"golang.org/x/net/idna"
)
@ -30,7 +31,9 @@ func NewResolverSystem(logger Logger) Resolver {
return &resolverIDNA{
Resolver: &resolverLogger{
Resolver: &resolverShortCircuitIPAddr{
Resolver: &resolverSystem{},
Resolver: &resolverErrWrapper{
Resolver: &resolverSystem{},
},
},
Logger: logger,
},
@ -182,3 +185,23 @@ func (r *nullResolver) Address() string {
func (r *nullResolver) CloseIdleConnections() {
// nothing
}
// resolverErrWrapper is a Resolver that knows about wrapping errors.
type resolverErrWrapper struct {
Resolver
}
var _ Resolver = &resolverErrWrapper{}
// LookupHost implements Resolver.LookupHost
func (r *resolverErrWrapper) LookupHost(ctx context.Context, hostname string) ([]string, error) {
addrs, err := r.Resolver.LookupHost(ctx, hostname)
if err != nil {
return nil, &errorsx.ErrWrapper{
Failure: errorsx.ClassifyResolverError(err),
Operation: errorsx.ResolveOperation,
WrappedErr: err,
}
}
return addrs, nil
}