mirror of https://github.com/XTLS/Xray-core
				
				
				
			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>pull/5006/head^2
							parent
							
								
									5a8e9c25a4
								
							
						
					
					
						commit
						f3cdcad541
					
				| 
						 | 
				
			
			@ -244,6 +244,14 @@ func (b *Buffer) Cap() int32 {
 | 
			
		|||
	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.
 | 
			
		||||
func (b *Buffer) IsEmpty() bool {
 | 
			
		||||
	return b.Len() == 0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -144,7 +144,7 @@ func Compact(mb MultiBuffer) MultiBuffer {
 | 
			
		|||
 | 
			
		||||
	for i := 1; i < len(mb); i++ {
 | 
			
		||||
		curr := mb[i]
 | 
			
		||||
		if last.Len()+curr.Len() > Size {
 | 
			
		||||
		if curr.Len() > last.Available() {
 | 
			
		||||
			mb2 = append(mb2, last)
 | 
			
		||||
			last = curr
 | 
			
		||||
		} 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) {
 | 
			
		||||
	var mb MultiBuffer
 | 
			
		||||
	raw := make([]byte, Size)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue