Skip to content

Commit 7c1ef20

Browse files
authored
Try fix
1 parent c6a76ff commit 7c1ef20

File tree

2 files changed

+42
-23
lines changed

2 files changed

+42
-23
lines changed

common/buf/copy.go

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -115,12 +115,7 @@ func Copy(reader Reader, writer Writer, options ...CopyOption) error {
115115
for _, option := range options {
116116
option(&handler)
117117
}
118-
var err error
119-
if sReader, ok := reader.(*SingleReader); ok && false {
120-
err = copyV(sReader, writer, &handler)
121-
} else {
122-
err = copyInternal(reader, writer, &handler)
123-
}
118+
err := copyInternal(reader, writer, &handler)
124119
if err != nil && errors.Cause(err) != io.EOF {
125120
return err
126121
}
@@ -141,7 +136,29 @@ func CopyOnceTimeout(reader Reader, writer Writer, timeout time.Duration) error
141136
return writer.WriteMultiBuffer(mb)
142137
}
143138

144-
func copyV(r *SingleReader, w Writer, handler *copyHandler) error {
139+
func TryCopyV(reader Reader, writer Writer, options ...CopyOption) error {
140+
var doCopyV bool
141+
if _, ok := reader.(TimeoutReader); ok {
142+
doCopyV = true
143+
}
144+
if _, ok := reader.(*SingleReader); !ok {
145+
doCopyV = true
146+
}
147+
if !doCopyV {
148+
return Copy(reader, writer, options...)
149+
}
150+
var handler copyHandler
151+
for _, option := range options {
152+
option(&handler)
153+
}
154+
err := copyVInternal(reader, writer, &handler)
155+
if err != nil && errors.Cause(err) != io.EOF {
156+
return err
157+
}
158+
return nil
159+
}
160+
161+
func copyVInternal(r Reader, w Writer, handler *copyHandler) error {
145162
// channel buffer size is maxBuffer/maxPerPacketLen (ignore the case of many small packets)
146163
// default buffer size:
147164
// 0 in ARM MIPS MIPSLE
@@ -162,23 +179,25 @@ func copyV(r *SingleReader, w Writer, handler *copyHandler) error {
162179
defer wg.Done()
163180
defer close(cache)
164181
for {
165-
b, err := r.readBuffer()
166-
if err == nil {
167-
select {
168-
case cache <- b:
169-
// must be write error
170-
case <-stopRead:
171-
b.Release()
182+
mb, err := r.ReadMultiBuffer()
183+
for _, b := range mb {
184+
if err == nil {
185+
select {
186+
case cache <- b:
187+
// must be write error
188+
case <-stopRead:
189+
b.Release()
190+
return
191+
}
192+
} else {
193+
rErr = err
194+
select {
195+
case cache <- b:
196+
case <-stopRead:
197+
b.Release()
198+
}
172199
return
173200
}
174-
} else {
175-
rErr = err
176-
select {
177-
case cache <- b:
178-
case <-stopRead:
179-
b.Release()
180-
}
181-
return
182201
}
183202
}
184203
}()

proxy/vless/outbound/outbound.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
394394
err = encoding.XtlsRead(serverReader, clientWriter, timer, conn, trafficState, false, ctx)
395395
} else {
396396
// from serverReader.ReadMultiBuffer to clientWriter.WriteMultiBuffer
397-
err = buf.Copy(serverReader, clientWriter, buf.UpdateActivity(timer))
397+
err = buf.TryCopyV(serverReader, clientWriter, buf.UpdateActivity(timer))
398398
}
399399

400400
if err != nil {

0 commit comments

Comments
 (0)