1
0
mirror of https://github.com/fumiama/terasu.git synced 2026-06-05 01:00:23 +08:00

feat: add DoH fallback supports

This commit is contained in:
源文雨
2024-05-02 18:19:19 +09:00
parent 871703d644
commit c887e26289
5 changed files with 279 additions and 13 deletions

View File

@@ -22,24 +22,28 @@ var (
ErrEmptyHostAddress = errors.New("empty host addr")
)
var DefaultDialer = net.Dialer{
var defaultDialer = net.Dialer{
Timeout: time.Minute,
}
func SetDefaultClientTimeout(t time.Duration) {
defaultDialer.Timeout = t
}
var lookupTable = ttl.NewCache[string, []string](time.Hour)
var DefaultClient = http.Client{
Transport: &http.Transport{
DialTLSContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
if DefaultDialer.Timeout != 0 {
if defaultDialer.Timeout != 0 {
var cancel context.CancelFunc
ctx, cancel = context.WithTimeout(ctx, DefaultDialer.Timeout)
ctx, cancel = context.WithTimeout(ctx, defaultDialer.Timeout)
defer cancel()
}
if !DefaultDialer.Deadline.IsZero() {
if !defaultDialer.Deadline.IsZero() {
var cancel context.CancelFunc
ctx, cancel = context.WithDeadline(ctx, DefaultDialer.Deadline)
ctx, cancel = context.WithDeadline(ctx, defaultDialer.Deadline)
defer cancel()
}
@@ -68,7 +72,7 @@ var DefaultClient = http.Client{
var conn net.Conn
var tlsConn *tls.Conn
for _, a := range addrs {
conn, err = DefaultDialer.DialContext(ctx, network, net.JoinHostPort(a, port))
conn, err = defaultDialer.DialContext(ctx, network, net.JoinHostPort(a, port))
if err != nil {
continue
}
@@ -81,6 +85,19 @@ var DefaultClient = http.Client{
}
_ = tlsConn.Close()
tlsConn = nil
conn, err = defaultDialer.DialContext(ctx, network, net.JoinHostPort(a, port))
if err != nil {
continue
}
tlsConn = tls.Client(conn, &tls.Config{
ServerName: host,
})
err = tlsConn.HandshakeContext(ctx)
if err == nil {
break
}
_ = tlsConn.Close()
tlsConn = nil
}
return tlsConn, err
},