mirror of
https://github.com/XTLS/Xray-core.git
synced 2025-08-22 01:26:49 +08:00
common/buf/multi_buffer.go: Fix Compact() (#5015)
Fixes https://github.com/XTLS/Xray-core/issues/5012 Co-authored-by: patterniha <71074308+patterniha@users.noreply.github.com>
This commit is contained in:
@@ -244,6 +244,14 @@ func (b *Buffer) Cap() int32 {
|
|||||||
return int32(len(b.v))
|
return int32(len(b.v))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Available returns the available capacity of the buffer content.
|
||||||
|
func (b *Buffer) Available() int32 {
|
||||||
|
if b == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return int32(len(b.v)) - b.end
|
||||||
|
}
|
||||||
|
|
||||||
// IsEmpty returns true if the buffer is empty.
|
// IsEmpty returns true if the buffer is empty.
|
||||||
func (b *Buffer) IsEmpty() bool {
|
func (b *Buffer) IsEmpty() bool {
|
||||||
return b.Len() == 0
|
return b.Len() == 0
|
||||||
|
@@ -144,7 +144,7 @@ func Compact(mb MultiBuffer) MultiBuffer {
|
|||||||
|
|
||||||
for i := 1; i < len(mb); i++ {
|
for i := 1; i < len(mb); i++ {
|
||||||
curr := mb[i]
|
curr := mb[i]
|
||||||
if last.Len()+curr.Len() > Size {
|
if curr.Len() > last.Available() {
|
||||||
mb2 = append(mb2, last)
|
mb2 = append(mb2, last)
|
||||||
last = curr
|
last = curr
|
||||||
} else {
|
} else {
|
||||||
|
@@ -175,6 +175,29 @@ func TestCompact(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCompactWithConsumed(t *testing.T) {
|
||||||
|
// make a consumed buffer (a.Start != 0)
|
||||||
|
a := New()
|
||||||
|
for range 8192 {
|
||||||
|
common.Must2(a.WriteString("a"))
|
||||||
|
}
|
||||||
|
a.Read(make([]byte, 2))
|
||||||
|
|
||||||
|
b := New()
|
||||||
|
for range 2 {
|
||||||
|
common.Must2(b.WriteString("b"))
|
||||||
|
}
|
||||||
|
|
||||||
|
mb := MultiBuffer{a, b}
|
||||||
|
cmb := Compact(mb)
|
||||||
|
mbc := &MultiBufferContainer{mb}
|
||||||
|
mbc.Read(make([]byte, 8190))
|
||||||
|
|
||||||
|
if w := cmb.String(); w != "bb" {
|
||||||
|
t.Error("unexpected Compact result ", w)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func BenchmarkSplitBytes(b *testing.B) {
|
func BenchmarkSplitBytes(b *testing.B) {
|
||||||
var mb MultiBuffer
|
var mb MultiBuffer
|
||||||
raw := make([]byte, Size)
|
raw := make([]byte, Size)
|
||||||
|
Reference in New Issue
Block a user