Browse Source

fix: always send Trojan header

AkinoKaede 2 years ago
parent
commit
72475c2924
2 changed files with 10 additions and 3 deletions
  1. 8 1
      proxy/trojan/client.go
  2. 2 2
      proxy/trojan/protocol.go

+ 8 - 1
proxy/trojan/client.go

@@ -146,7 +146,14 @@ func (c *Client) Process(ctx context.Context, link *transport.Link, dialer inter
 		}
 
 		// write some request payload to buffer
-		if err = buf.CopyOnceTimeout(link.Reader, bodyWriter, proxy.FirstPayloadTimeout); err != nil && err != buf.ErrNotTimeoutReader && err != buf.ErrReadTimeout {
+		err = buf.CopyOnceTimeout(link.Reader, bodyWriter, proxy.FirstPayloadTimeout)
+		switch err {
+		case buf.ErrNotTimeoutReader, buf.ErrReadTimeout:
+			if err := connWriter.WriteHeader(); err != nil {
+				return newError("failed to write request header").Base(err).AtWarning()
+			}
+		case nil:
+		default:
 			return newError("failed to write a request payload").Base(err).AtWarning()
 		}
 

+ 2 - 2
proxy/trojan/protocol.go

@@ -37,7 +37,7 @@ type ConnWriter struct {
 // Write implements io.Writer
 func (c *ConnWriter) Write(p []byte) (n int, err error) {
 	if !c.headerSent {
-		if err := c.writeHeader(); err != nil {
+		if err := c.WriteHeader(); err != nil {
 			return 0, newError("failed to write request header").Base(err)
 		}
 	}
@@ -60,7 +60,7 @@ func (c *ConnWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
 	return nil
 }
 
-func (c *ConnWriter) writeHeader() error {
+func (c *ConnWriter) WriteHeader() error {
 	buffer := buf.StackNew()
 	defer buffer.Release()