diff --git a/adapter/inbound/socket.go b/adapter/inbound/socket.go index a6b1288c..e41ee925 100644 --- a/adapter/inbound/socket.go +++ b/adapter/inbound/socket.go @@ -30,21 +30,18 @@ func NewSocket(target socks5.Addr, conn net.Conn, source C.Type, additions ...Ad return context.NewConnContext(conn, metadata) } -func NewInner(conn net.Conn, dst string, host string) *context.ConnContext { +func NewInner(conn net.Conn, address string) *context.ConnContext { metadata := &C.Metadata{} metadata.NetWork = C.TCP metadata.Type = C.INNER metadata.DNSMode = C.DNSNormal - metadata.Host = host metadata.Process = C.ClashName - if h, port, err := net.SplitHostPort(dst); err == nil { + if h, port, err := net.SplitHostPort(address); err == nil { metadata.DstPort = port - if host == "" { - if ip, err := netip.ParseAddr(h); err == nil { - metadata.DstIP = ip - } else { - metadata.Host = h - } + if ip, err := netip.ParseAddr(h); err == nil { + metadata.DstIP = ip + } else { + metadata.Host = h } } diff --git a/component/http/http.go b/component/http/http.go index ece7b442..bcede09f 100644 --- a/component/http/http.go +++ b/component/http/http.go @@ -53,8 +53,12 @@ func HttpRequest(ctx context.Context, url, method string, header map[string][]st TLSHandshakeTimeout: 10 * time.Second, ExpectContinueTimeout: 1 * time.Second, DialContext: func(ctx context.Context, network, address string) (net.Conn, error) { - conn := inner.HandleTcp(address, "") - return conn, nil + if conn, err := inner.HandleTcp(address); err == nil { + return conn, nil + } else { + d := net.Dialer{} + return d.DialContext(ctx, network, address) + } }, TLSClientConfig: tls.GetDefaultTLSConfig(), } diff --git a/listener/inner/tcp.go b/listener/inner/tcp.go index a7e38588..9ba87e2f 100644 --- a/listener/inner/tcp.go +++ b/listener/inner/tcp.go @@ -1,9 +1,11 @@ package inner import ( + "errors" + "net" + "github.com/Dreamacro/clash/adapter/inbound" C "github.com/Dreamacro/clash/constant" - "net" ) var tcpIn chan<- C.ConnContext @@ -12,9 +14,13 @@ func New(in chan<- C.ConnContext) { tcpIn = in } -func HandleTcp(dst string, host string) net.Conn { +func HandleTcp(address string) (conn net.Conn, err error) { + if tcpIn == nil { + return nil, errors.New("tcp uninitialized") + } + // executor Parsed conn1, conn2 := net.Pipe() - context := inbound.NewInner(conn2, dst, host) + context := inbound.NewInner(conn2, address) tcpIn <- context - return conn1 + return conn1, nil }