diff --git a/connector/relay/conn.go b/connector/relay/conn.go index 4e9cc4f..e2d16a2 100644 --- a/connector/relay/conn.go +++ b/connector/relay/conn.go @@ -13,6 +13,7 @@ import ( "github.com/go-gost/core/common/bufpool" mdata "github.com/go-gost/core/metadata" "github.com/go-gost/relay" + xrelay "github.com/go-gost/x/internal/util/relay" ) type tcpConn struct { @@ -129,7 +130,7 @@ func readResponse(r io.Reader) (err error) { } if resp.Status != relay.StatusOK { - err = fmt.Errorf("status %d", resp.Status) + err = fmt.Errorf("%d %s", resp.Status, xrelay.StatusText(resp.Status)) return } return nil @@ -223,16 +224,3 @@ func (c *bindUDPConn) RemoteAddr() net.Addr { func (c *bindUDPConn) Metadata() mdata.Metadata { return c.md } - -type bindAddr struct { - network string - addr string -} - -func (p *bindAddr) Network() string { - return p.network -} - -func (p *bindAddr) String() string { - return p.addr -} diff --git a/connector/tunnel/conn.go b/connector/tunnel/conn.go index cd712b2..2a025bc 100644 --- a/connector/tunnel/conn.go +++ b/connector/tunnel/conn.go @@ -1,67 +1,24 @@ package tunnel import ( - "bytes" "encoding/binary" "errors" "fmt" "io" "math" "net" - "sync" "github.com/go-gost/core/common/bufpool" mdata "github.com/go-gost/core/metadata" "github.com/go-gost/relay" + xrelay "github.com/go-gost/x/internal/util/relay" ) -type tcpConn struct { - net.Conn - wbuf *bytes.Buffer - once sync.Once -} - -func (c *tcpConn) Read(b []byte) (n int, err error) { - c.once.Do(func() { - if c.wbuf != nil { - err = readResponse(c.Conn) - } - }) - - if err != nil { - return - } - return c.Conn.Read(b) -} - -func (c *tcpConn) Write(b []byte) (n int, err error) { - n = len(b) // force byte length consistent - if c.wbuf != nil && c.wbuf.Len() > 0 { - c.wbuf.Write(b) // append the data to the cached header - _, err = c.Conn.Write(c.wbuf.Bytes()) - c.wbuf.Reset() - return - } - _, err = c.Conn.Write(b) - return -} - type udpConn struct { net.Conn - wbuf *bytes.Buffer - once sync.Once } func (c *udpConn) Read(b []byte) (n int, err error) { - c.once.Do(func() { - if c.wbuf != nil { - err = readResponse(c.Conn) - } - }) - if err != nil { - return - } - var bb [2]byte _, err = io.ReadFull(c.Conn, bb[:]) if err != nil { @@ -88,14 +45,6 @@ func (c *udpConn) Write(b []byte) (n int, err error) { } n = len(b) - if c.wbuf != nil && c.wbuf.Len() > 0 { - var bb [2]byte - binary.BigEndian.PutUint16(bb[:], uint16(len(b))) - c.wbuf.Write(bb[:]) - c.wbuf.Write(b) // append the data to the cached header - _, err = c.wbuf.WriteTo(c.Conn) - return - } var bb [2]byte binary.BigEndian.PutUint16(bb[:], uint16(len(b))) @@ -119,7 +68,7 @@ func readResponse(r io.Reader) (err error) { } if resp.Status != relay.StatusOK { - err = fmt.Errorf("status %d", resp.Status) + err = fmt.Errorf("%d %s", resp.Status, xrelay.StatusText(resp.Status)) return } return nil diff --git a/connector/tunnel/connector.go b/connector/tunnel/connector.go index 824cf28..a427dfd 100644 --- a/connector/tunnel/connector.go +++ b/connector/tunnel/connector.go @@ -1,7 +1,6 @@ package tunnel import ( - "bytes" "context" "fmt" "net" @@ -90,39 +89,20 @@ func (c *tunnelConnector) Connect(ctx context.Context, conn net.Conn, network, a ID: c.md.tunnelID.ID(), }) - if c.md.noDelay { - if _, err := req.WriteTo(conn); err != nil { - return nil, err - } - // drain the response - if err := readResponse(conn); err != nil { - return nil, err - } + if _, err := req.WriteTo(conn); err != nil { + return nil, err + } + // drain the response + if err := readResponse(conn); err != nil { + return nil, err } switch network { case "tcp", "tcp4", "tcp6": - if !c.md.noDelay { - cc := &tcpConn{ - Conn: conn, - wbuf: &bytes.Buffer{}, - } - if _, err := req.WriteTo(cc.wbuf); err != nil { - return nil, err - } - conn = cc - } case "udp", "udp4", "udp6": - cc := &udpConn{ + conn = &udpConn{ Conn: conn, } - if !c.md.noDelay { - cc.wbuf = &bytes.Buffer{} - if _, err := req.WriteTo(cc.wbuf); err != nil { - return nil, err - } - } - conn = cc default: err := fmt.Errorf("network %s is unsupported", network) log.Error(err) diff --git a/connector/tunnel/metadata.go b/connector/tunnel/metadata.go index 4839cbe..d678b62 100644 --- a/connector/tunnel/metadata.go +++ b/connector/tunnel/metadata.go @@ -18,13 +18,11 @@ var ( type metadata struct { connectTimeout time.Duration tunnelID relay.TunnelID - noDelay bool muxCfg *mux.Config } func (c *tunnelConnector) parseMetadata(md mdata.Metadata) (err error) { c.md.connectTimeout = mdutil.GetDuration(md, "connectTimeout") - c.md.noDelay = mdutil.GetBool(md, "nodelay") if s := mdutil.GetString(md, "tunnelID", "tunnel.id"); s != "" { uuid, err := uuid.Parse(s) diff --git a/internal/util/relay/conn.go b/internal/util/relay/conn.go index 2d25125..865094d 100644 --- a/internal/util/relay/conn.go +++ b/internal/util/relay/conn.go @@ -6,8 +6,32 @@ import ( "github.com/go-gost/core/common/bufpool" "github.com/go-gost/gosocks5" + "github.com/go-gost/relay" ) +func StatusText(code uint8) string { + switch code { + case relay.StatusBadRequest: + return "Bad Request" + case relay.StatusForbidden: + return "Forbidden" + case relay.StatusHostUnreachable: + return "Host Unreachable" + case relay.StatusInternalServerError: + return "Internal Server Error" + case relay.StatusNetworkUnreachable: + return "Network Unreachable" + case relay.StatusServiceUnavailable: + return "Service Unavailable" + case relay.StatusTimeout: + return "Timeout" + case relay.StatusUnauthorized: + return "Unauthorized" + default: + return "" + } +} + type udpTunConn struct { net.Conn taddr net.Addr