fix(stream): properly handle remote stream scheme IPv4/6

This commit is contained in:
yusing
2026-01-09 01:49:22 +08:00
parent 19d6f3757b
commit 1a20a2cda7
4 changed files with 66 additions and 47 deletions

View File

@@ -70,7 +70,7 @@ func (r *StreamRoute) Start(parent task.Parent) gperr.Error {
r.ListenAndServe(r.task.Context(), nil, nil)
r.l = log.With().
Str("type", r.LisURL.Scheme).
Str("type", r.LisURL.Scheme+"->"+r.ProxyURL.Scheme).
Str("name", r.Name()).
Stringer("rurl", r.ProxyURL).
Stringer("laddr", r.LocalAddr()).Logger()
@@ -102,9 +102,10 @@ func (r *StreamRoute) LocalAddr() net.Addr {
func (r *StreamRoute) initStream() (nettypes.Stream, error) {
lurl, rurl := r.LisURL, r.ProxyURL
// lurl scheme is either tcp4/tcp6 -> tcp, udp4/udp6 -> udp
// rurl scheme does not have the trailing 4/6
if strings.TrimRight(lurl.Scheme, "46") != rurl.Scheme {
// tcp4/tcp6 -> tcp, udp4/udp6 -> udp
lScheme := strings.TrimRight(lurl.Scheme, "46")
rScheme := strings.TrimRight(rurl.Scheme, "46")
if lScheme != rScheme {
return nil, fmt.Errorf("incoherent scheme is not yet supported: %s != %s", lurl.Scheme, rurl.Scheme)
}
@@ -113,11 +114,11 @@ func (r *StreamRoute) initStream() (nettypes.Stream, error) {
laddr = lurl.Host
}
switch rurl.Scheme {
switch rScheme {
case "tcp":
return stream.NewTCPTCPStream(r.LisURL.Scheme, laddr, rurl.Host)
return stream.NewTCPTCPStream(lurl.Scheme, rurl.Scheme, laddr, rurl.Host)
case "udp":
return stream.NewUDPUDPStream(r.LisURL.Scheme, laddr, rurl.Host)
return stream.NewUDPUDPStream(lurl.Scheme, rurl.Scheme, laddr, rurl.Host)
}
return nil, fmt.Errorf("unknown scheme: %s", rurl.Scheme)
}