9fcd7d6890
Add a new "utls" dialer type that uses the refraction-networking/utls library to mimic browser TLS fingerprints (Chrome, Firefox, Safari, etc.). - x/dialer/utls/dialer.go: Registered as "utls", mirrors the TLS dialer with Handshake() using utls.UClient() for fingerprint emulation. - x/dialer/utls/fingerprint.go: Maps string names (chrome, firefox, ios, safari, edge, randomized, golang, custom) to utls.ClientHelloID presets. - x/dialer/utls/metadata.go: Parses fingerprint from dialer metadata. - go.mod: Add github.com/refraction-networking/utls v1.8.2. The fingerprint is dialer-only metadata — the standard TLS dialer is untouched. Falls back to crypto/tls if no fingerprint is configured. Closes go-gost/gost#31
38 lines
848 B
Go
38 lines
848 B
Go
package utls
|
|
|
|
import (
|
|
"time"
|
|
|
|
mdata "github.com/go-gost/core/metadata"
|
|
mdutil "github.com/go-gost/x/metadata/util"
|
|
)
|
|
|
|
type metadata struct {
|
|
handshakeTimeout time.Duration
|
|
|
|
keepalive bool
|
|
keepaliveIdle time.Duration
|
|
keepaliveInterval time.Duration
|
|
keepaliveCount int
|
|
|
|
fingerprint string
|
|
}
|
|
|
|
func (d *utlsDialer) parseMetadata(md mdata.Metadata) (err error) {
|
|
const (
|
|
handshakeTimeout = "handshakeTimeout"
|
|
fingerprint = "fingerprint"
|
|
)
|
|
|
|
d.md.handshakeTimeout = mdutil.GetDuration(md, handshakeTimeout)
|
|
|
|
d.md.keepalive = mdutil.GetBool(md, "keepalive")
|
|
d.md.keepaliveIdle = mdutil.GetDuration(md, "keepalive.idle")
|
|
d.md.keepaliveInterval = mdutil.GetDuration(md, "keepalive.interval")
|
|
d.md.keepaliveCount = mdutil.GetInt(md, "keepalive.count")
|
|
|
|
d.md.fingerprint = mdutil.GetString(md, fingerprint)
|
|
|
|
return
|
|
}
|