mirror of
https://github.com/XTLS/Xray-core.git
synced 2024-12-22 11:23:32 +02:00
splithttp Read() using blocking mode (#3473)
* blocking splithttp read * Add testcase * simplify conditions --------- Co-authored-by: mmmray <142015632+mmmray@users.noreply.github.com>
This commit is contained in:
parent
7acd5a623b
commit
e4f9d03bef
2 changed files with 36 additions and 14 deletions
|
@ -47,13 +47,19 @@ func (h *UploadQueue) Close() error {
|
|||
}
|
||||
|
||||
func (h *UploadQueue) Read(b []byte) (int, error) {
|
||||
if h.closed && len(h.heap) == 0 && len(h.pushedPackets) == 0 {
|
||||
if h.closed {
|
||||
return 0, io.EOF
|
||||
}
|
||||
|
||||
needMorePackets := false
|
||||
if len(h.heap) == 0 {
|
||||
packet, more := <-h.pushedPackets
|
||||
if !more {
|
||||
return 0, io.EOF
|
||||
}
|
||||
heap.Push(&h.heap, packet)
|
||||
}
|
||||
|
||||
if len(h.heap) > 0 {
|
||||
for len(h.heap) > 0 {
|
||||
packet := heap.Pop(&h.heap).(Packet)
|
||||
n := 0
|
||||
|
||||
|
@ -81,18 +87,12 @@ func (h *UploadQueue) Read(b []byte) (int, error) {
|
|||
return 0, newError("packet queue is too large")
|
||||
}
|
||||
heap.Push(&h.heap, packet)
|
||||
needMorePackets = true
|
||||
packet2, more := <-h.pushedPackets
|
||||
if !more {
|
||||
return 0, io.EOF
|
||||
}
|
||||
heap.Push(&h.heap, packet2)
|
||||
}
|
||||
} else {
|
||||
needMorePackets = true
|
||||
}
|
||||
|
||||
if needMorePackets {
|
||||
packet, more := <-h.pushedPackets
|
||||
if !more {
|
||||
return 0, io.EOF
|
||||
}
|
||||
heap.Push(&h.heap, packet)
|
||||
}
|
||||
|
||||
return 0, nil
|
||||
|
|
22
transport/internet/splithttp/upload_queue_test.go
Normal file
22
transport/internet/splithttp/upload_queue_test.go
Normal file
|
@ -0,0 +1,22 @@
|
|||
package splithttp_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/xtls/xray-core/common"
|
||||
. "github.com/xtls/xray-core/transport/internet/splithttp"
|
||||
)
|
||||
|
||||
func Test_regression_readzero(t *testing.T) {
|
||||
q := NewUploadQueue(10)
|
||||
q.Push(Packet{
|
||||
Payload: []byte("x"),
|
||||
Seq: 0,
|
||||
})
|
||||
buf := make([]byte, 20)
|
||||
n, err := q.Read(buf)
|
||||
common.Must(err)
|
||||
if n != 1 {
|
||||
t.Error("n=", n)
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue