0e96f602fa
matcher: fix IPv6 normalization via netip.ParseAddr, port-range overwrite by switching to []*PortRange map, case-insensitive domain/host matching, glob.MustCompile→Compile to avoid panic on invalid patterns. plugin: guard nil *Options in NewGRPCConn and NewHTTPClient; add HTTPClientTransport helper for idle-connection cleanup. net/*: add doc comments for all exported symbols (no code changes). Add 30 tests (matcher_test.go 22, plugin_test.go 8) covering all matcher types, nil safety, case insensitivity, IPv6 normalization, port ranges, and plugin option composition.
56 lines
1.3 KiB
Go
56 lines
1.3 KiB
Go
package net
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net"
|
|
|
|
"github.com/go-gost/core/hosts"
|
|
"github.com/go-gost/core/logger"
|
|
"github.com/go-gost/core/resolver"
|
|
ctxvalue "github.com/go-gost/x/ctx"
|
|
)
|
|
|
|
// Resolve resolves addr to a concrete IP address. If hosts is non-nil, it is
|
|
// consulted first. If r is non-nil and no host mapping matched, the resolver
|
|
// is used. If neither is available, addr is returned unchanged.
|
|
func Resolve(ctx context.Context, network, addr string, r resolver.Resolver, hosts hosts.HostMapper, log logger.Logger) (string, error) {
|
|
if addr == "" {
|
|
return addr, nil
|
|
}
|
|
|
|
host, port, _ := net.SplitHostPort(addr)
|
|
if host == "" {
|
|
return addr, nil
|
|
}
|
|
|
|
if log == nil {
|
|
log = logger.Default()
|
|
}
|
|
log = log.WithFields(map[string]any{
|
|
"sid": ctxvalue.SidFromContext(ctx),
|
|
})
|
|
|
|
if hosts != nil {
|
|
if ips, _ := hosts.Lookup(ctx, network, host); len(ips) > 0 {
|
|
log.Debugf("hit host mapper: %s -> %s", host, ips)
|
|
return net.JoinHostPort(ips[0].String(), port), nil
|
|
}
|
|
}
|
|
|
|
if r != nil {
|
|
ips, err := r.Resolve(ctx, network, host)
|
|
if err != nil {
|
|
if err == resolver.ErrInvalid {
|
|
return addr, nil
|
|
}
|
|
log.Error(err)
|
|
}
|
|
if len(ips) == 0 {
|
|
return "", fmt.Errorf("resolver: domain %s does not exist", host)
|
|
}
|
|
return net.JoinHostPort(ips[0].String(), port), nil
|
|
}
|
|
return addr, nil
|
|
}
|