From 296d87a597793f28c3911b77c7cab74ba4cfdc4b Mon Sep 17 00:00:00 2001 From: ginuerzh Date: Sat, 20 Jun 2026 14:58:19 +0800 Subject: [PATCH] fix(quic): preserve user-configured ALPN instead of hardcoding NextProtos The QUIC listener and the QUIC/ICMP dialers unconditionally set tlsCfg.NextProtos = ["h3", "quic/v1"], discarding any user-specified ALPN values from TLS options (via tls.options.alpn in config). Clone the TLS config and only apply the default NextProtos when none are already configured, matching the existing pattern in the MASQUE HTTP/3 dialer. This enables non-HTTP/3 QUIC use cases like SMB-over-QUIC which requires ALPN "smb". Fixes go-gost/gost#872 --- dialer/icmp/dialer.go | 5 ++++- dialer/quic/dialer.go | 5 ++++- listener/quic/listener.go | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/dialer/icmp/dialer.go b/dialer/icmp/dialer.go index b307522a..dff41ad2 100644 --- a/dialer/icmp/dialer.go +++ b/dialer/icmp/dialer.go @@ -133,7 +133,10 @@ func (d *icmpDialer) initSession(ctx context.Context, addr net.Addr, conn net.Pa } tlsCfg := d.options.TLSConfig - tlsCfg.NextProtos = []string{"h3", "quic/v1"} + tlsCfg = tlsCfg.Clone() + if len(tlsCfg.NextProtos) == 0 { + tlsCfg.NextProtos = []string{"h3", "quic/v1"} + } session, err := quic.DialEarly(ctx, conn, addr, tlsCfg, quicConfig) if err != nil { diff --git a/dialer/quic/dialer.go b/dialer/quic/dialer.go index 857ff5e1..55812787 100644 --- a/dialer/quic/dialer.go +++ b/dialer/quic/dialer.go @@ -115,7 +115,10 @@ func (d *quicDialer) initSession(ctx context.Context, addr net.Addr, conn net.Pa } tlsCfg := d.options.TLSConfig - tlsCfg.NextProtos = []string{"h3", "quic/v1"} + tlsCfg = tlsCfg.Clone() + if len(tlsCfg.NextProtos) == 0 { + tlsCfg.NextProtos = []string{"h3", "quic/v1"} + } session, err := quic.DialEarly(ctx, conn, addr, tlsCfg, quicConfig) if err != nil { diff --git a/listener/quic/listener.go b/listener/quic/listener.go index 455cc748..4f71d1cb 100644 --- a/listener/quic/listener.go +++ b/listener/quic/listener.go @@ -110,7 +110,10 @@ func (l *quicListener) Init(md md.Metadata) (err error) { } tlsCfg := l.options.TLSConfig - tlsCfg.NextProtos = []string{"h3", "quic/v1"} + tlsCfg = tlsCfg.Clone() + if len(tlsCfg.NextProtos) == 0 { + tlsCfg.NextProtos = []string{"h3", "quic/v1"} + } ln, err := quic.ListenEarly(conn, tlsCfg, config) if err != nil {