Browse Source

fix timeout reader usage

Darien Raymond 8 years ago
parent
commit
14824c8451
3 changed files with 12 additions and 6 deletions
  1. 10 4
      common/buf/merge_reader.go
  2. 1 1
      proxy/vmess/outbound/outbound.go
  3. 1 1
      transport/ray/direct.go

+ 10 - 4
common/buf/merge_reader.go

@@ -1,13 +1,15 @@
 package buf
 
 type MergingReader struct {
-	reader   Reader
-	leftover *Buffer
+	reader        Reader
+	timeoutReader TimeoutReader
+	leftover      *Buffer
 }
 
 func NewMergingReader(reader Reader) Reader {
 	return &MergingReader{
-		reader: reader,
+		reader:        reader,
+		timeoutReader: reader.(TimeoutReader),
 	}
 }
 
@@ -25,7 +27,11 @@ func (r *MergingReader) Read() (*Buffer, error) {
 		return b, nil
 	}
 
-	b2, err := r.reader.Read()
+	if r.timeoutReader == nil {
+		return b, nil
+	}
+
+	b2, err := r.timeoutReader.ReadTimeout(0)
 	if err != nil {
 		return b, nil
 	}

+ 1 - 1
proxy/vmess/outbound/outbound.go

@@ -114,7 +114,7 @@ func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial
 
 		bodyWriter := session.EncodeRequestBody(request, writer)
 		firstPayload, err := input.ReadTimeout(time.Millisecond * 500)
-		if err != nil && err != ray.ErrReadTimeout {
+		if err != nil && err != buf.ErrReadTimeout {
 			return errors.Base(err).Message("VMess|Outbound: Failed to get first payload.")
 		}
 		if !firstPayload.IsEmpty() {

+ 1 - 1
transport/ray/direct.go

@@ -89,7 +89,7 @@ func (v *Stream) ReadTimeout(timeout time.Duration) (*buf.Buffer, error) {
 		return b, nil
 	default:
 		if timeout == 0 {
-			return nil, ErrReadTimeout
+			return nil, buf.ErrReadTimeout
 		}
 
 		select {