Browse Source

Fix SplitHTTP H3 crash on v2rayNG (#3559)

Fixes https://github.com/XTLS/Xray-core/issues/3556
ll11l1lIllIl1lll 1 year ago
parent
commit
d8994b7603
1 changed files with 25 additions and 4 deletions
  1. 25 4
      transport/internet/splithttp/dialer.go

+ 25 - 4
transport/internet/splithttp/dialer.go

@@ -101,11 +101,32 @@ func getHTTPClient(ctx context.Context, dest net.Destination, streamSettings *in
 				if err != nil {
 					return nil, err
 				}
-				udpAddr, err := net.ResolveUDPAddr("udp", conn.RemoteAddr().String())
-				if err != nil {
-					return nil, err
+
+				var udpConn *net.UDPConn
+				var udpAddr *net.UDPAddr
+
+				switch c := conn.(type) {
+				case *internet.PacketConnWrapper:
+					var ok bool
+					udpConn, ok = c.Conn.(*net.UDPConn)
+					if !ok {
+						return nil, errors.New("PacketConnWrapper does not contain a UDP connection")
+					}
+					udpAddr, err = net.ResolveUDPAddr("udp", c.Dest.String())
+					if err != nil {
+						return nil, err
+					}
+				case *net.UDPConn:
+					udpConn = c
+					udpAddr, err = net.ResolveUDPAddr("udp", c.RemoteAddr().String())
+					if err != nil {
+						return nil, err
+					}
+				default:
+					return nil, errors.New("unsupported connection type: %T", conn)
 				}
-				return quic.DialEarly(ctx, conn.(*internet.PacketConnWrapper).Conn.(*net.UDPConn), udpAddr, tlsCfg, cfg)
+
+				return quic.DialEarly(ctx, udpConn, udpAddr, tlsCfg, cfg)
 			},
 		}
 		downloadTransport = roundTripper