mirror of
https://github.com/go-gost/x.git
synced 2026-10-19 16:16:32 +00:00
The tunnel bind conns (bindConn/bindUDPConn) now expose their metadata (the tunneled hostname) via the xctx.Context interface, so the service accept loop forwards it into the handler context. handleRawForwarding selects a hop node by that hostname when a hop is configured, so a node with a matching filter.host is picked; otherwise it falls back to dialing the hostname directly. Fixes reverse-proxy-tunnel TCP routing (gost#898) where the docs example failed with "node not available" because the mux path never set the host metadata.
46 lines
1.5 KiB
Go
46 lines
1.5 KiB
Go
package tunnel
|
|
|
|
import (
|
|
"net"
|
|
"testing"
|
|
|
|
mdata "github.com/go-gost/core/metadata"
|
|
ictx "github.com/go-gost/x/internal/ctx"
|
|
xmd "github.com/go-gost/x/metadata"
|
|
mdutil "github.com/go-gost/x/metadata/util"
|
|
)
|
|
|
|
// TestBindConnContext verifies that a bindConn exposes its connection metadata
|
|
// (the tunneled hostname) via the xctx.Context interface, so the service accept
|
|
// loop forwards it into the handler context for filter.host routing (gost#898).
|
|
func TestBindConnContext(t *testing.T) {
|
|
md := mdata.Metadata(xmd.NewMetadata(map[string]any{"host": "example.local:80"}))
|
|
cn := &bindConn{
|
|
Conn: &net.TCPConn{},
|
|
localAddr: &net.TCPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 0},
|
|
remoteAddr: &net.TCPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 80},
|
|
md: md,
|
|
}
|
|
|
|
got := mdutil.GetString(ictx.MetadataFromContext(cn.Context()), "host")
|
|
if got != "example.local:80" {
|
|
t.Errorf("host from Context() = %q, want %q", got, "example.local:80")
|
|
}
|
|
}
|
|
|
|
// TestBindUDPConnContext is the same check for the UDP reverse-tunnel conn.
|
|
func TestBindUDPConnContext(t *testing.T) {
|
|
md := mdata.Metadata(xmd.NewMetadata(map[string]any{"host": "example.local:80"}))
|
|
cn := &bindUDPConn{
|
|
Conn: &net.TCPConn{},
|
|
localAddr: &net.TCPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 0},
|
|
remoteAddr: &net.TCPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 80},
|
|
md: md,
|
|
}
|
|
|
|
got := mdutil.GetString(ictx.MetadataFromContext(cn.Context()), "host")
|
|
if got != "example.local:80" {
|
|
t.Errorf("host from Context() = %q, want %q", got, "example.local:80")
|
|
}
|
|
}
|