Skip to content

Commit 24a6d8c

Browse files
authored
Try fix
1 parent c6a76ff commit 24a6d8c

File tree

2 files changed

+44
-23
lines changed

2 files changed

+44
-23
lines changed

common/buf/copy.go

Lines changed: 43 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,31 @@ 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 tr, ok := reader.(*TimeoutWrapperReader); ok {
142+
if _, ok := tr.Reader.(*SingleReader); ok {
143+
doCopyV = true
144+
}
145+
}
146+
if _, ok := reader.(*SingleReader); ok {
147+
doCopyV = true
148+
}
149+
if doCopyV {
150+
return Copy(reader, writer, options...)
151+
}
152+
var handler copyHandler
153+
for _, option := range options {
154+
option(&handler)
155+
}
156+
err := copyVInternal(reader, writer, &handler)
157+
if err != nil && errors.Cause(err) != io.EOF {
158+
return err
159+
}
160+
return nil
161+
}
162+
163+
func copyVInternal(r Reader, w Writer, handler *copyHandler) error {
145164
// channel buffer size is maxBuffer/maxPerPacketLen (ignore the case of many small packets)
146165
// default buffer size:
147166
// 0 in ARM MIPS MIPSLE
@@ -162,23 +181,25 @@ func copyV(r *SingleReader, w Writer, handler *copyHandler) error {
162181
defer wg.Done()
163182
defer close(cache)
164183
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()
184+
mb, err := r.ReadMultiBuffer()
185+
for _, b := range mb {
186+
if err == nil {
187+
select {
188+
case cache <- b:
189+
// must be write error
190+
case <-stopRead:
191+
b.Release()
192+
return
193+
}
194+
} else {
195+
rErr = err
196+
select {
197+
case cache <- b:
198+
case <-stopRead:
199+
b.Release()
200+
}
172201
return
173202
}
174-
} else {
175-
rErr = err
176-
select {
177-
case cache <- b:
178-
case <-stopRead:
179-
b.Release()
180-
}
181-
return
182203
}
183204
}
184205
}()

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)