Add quic fingerprints and preset configs

This commit is contained in:
yuhan6665 2024-11-02 13:51:40 -04:00
parent 0b7a5086a2
commit 091725fd5d
3 changed files with 63 additions and 3 deletions

View file

@ -73,7 +73,7 @@ func getHTTPClient(ctx context.Context, dest net.Destination, streamSettings *in
}
muxManager = NewMuxManager(mux, func() interface{} {
return createHTTPClient(dest, streamSettings)
return createHTTPClient(ctx, dest, streamSettings)
})
globalDialerMap[key] = muxManager
}
@ -82,7 +82,7 @@ func getHTTPClient(ctx context.Context, dest net.Destination, streamSettings *in
return res.Resource.(DialerClient), res
}
func createHTTPClient(dest net.Destination, streamSettings *internet.MemoryStreamConfig) DialerClient {
func createHTTPClient(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) DialerClient {
tlsConfig := tls.ConfigFromStreamSettings(streamSettings)
realityConfig := reality.ConfigFromStreamSettings(streamSettings)
@ -145,7 +145,7 @@ func createHTTPClient(dest net.Destination, streamSettings *internet.MemoryStrea
MaxIncomingStreams: -1,
KeepAlivePeriod: h3KeepalivePeriod,
}
transport = &http3.RoundTripper{
roundTripper := &http3.RoundTripper{
QuicConfig: quicConfig,
TLSClientConfig: tls.CopyConfig(gotlsConfig),
Dial: func(ctx context.Context, addr string, tlsCfg *utls.Config, cfg *quic.Config) (quic.EarlyConnection, error) {
@ -185,6 +185,15 @@ func createHTTPClient(dest net.Destination, streamSettings *internet.MemoryStrea
return quic.DialEarly(ctx, udpConn, udpAddr, tlsCfg, cfg)
},
}
transport = roundTripper
if fingerprint := tls.GetQuicFingerprint(tlsConfig.Fingerprint); fingerprint != nil {
quicSpec, err := quic.QUICID2Spec(*fingerprint)
if err != nil {
errors.LogError(ctx, "unknown fingerprint: ", tlsConfig.Fingerprint)
} else {
transport = http3.GetURoundTripper(roundTripper, &quicSpec, nil)
}
}
} else if isH2 {
transport = &http2.Transport{
DialTLSContext: func(ctxInner context.Context, network string, addr string, cfg *gotls.Config) (net.Conn, error) {