mirror of
https://github.com/bolucat/Archive.git
synced 2025-12-24 13:28:37 +08:00
Update On Fri Aug 15 20:40:56 CEST 2025
This commit is contained in:
@@ -13,6 +13,8 @@ const (
|
||||
Size = 8192
|
||||
)
|
||||
|
||||
var ErrBufferFull = errors.New("buffer is full")
|
||||
|
||||
var zero = [Size * 10]byte{0}
|
||||
|
||||
var pool = bytespool.GetPool(Size)
|
||||
@@ -244,6 +246,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
|
||||
@@ -258,13 +268,16 @@ func (b *Buffer) IsFull() bool {
|
||||
func (b *Buffer) Write(data []byte) (int, error) {
|
||||
nBytes := copy(b.v[b.end:], data)
|
||||
b.end += int32(nBytes)
|
||||
if nBytes < len(data) {
|
||||
return nBytes, ErrBufferFull
|
||||
}
|
||||
return nBytes, nil
|
||||
}
|
||||
|
||||
// WriteByte writes a single byte into the buffer.
|
||||
func (b *Buffer) WriteByte(v byte) error {
|
||||
if b.IsFull() {
|
||||
return errors.New("buffer full")
|
||||
return ErrBufferFull
|
||||
}
|
||||
b.v[b.end] = v
|
||||
b.end++
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
module github.com/xtls/xray-core
|
||||
|
||||
go 1.24
|
||||
go 1.25
|
||||
|
||||
require (
|
||||
github.com/cloudflare/circl v1.6.1
|
||||
|
||||
@@ -6,9 +6,7 @@ import (
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
"net"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"unsafe"
|
||||
|
||||
"github.com/xtls/xray-core/main/commands/base"
|
||||
. "github.com/xtls/xray-core/transport/internet/tls"
|
||||
@@ -139,14 +137,15 @@ func printCertificates(certs []*x509.Certificate) {
|
||||
}
|
||||
|
||||
func printTLSConnDetail(tlsConn *gotls.Conn) {
|
||||
connectionState := tlsConn.ConnectionState()
|
||||
var tlsVersion string
|
||||
if tlsConn.ConnectionState().Version == gotls.VersionTLS13 {
|
||||
if connectionState.Version == gotls.VersionTLS13 {
|
||||
tlsVersion = "TLS 1.3"
|
||||
} else if tlsConn.ConnectionState().Version == gotls.VersionTLS12 {
|
||||
} else if connectionState.Version == gotls.VersionTLS12 {
|
||||
tlsVersion = "TLS 1.2"
|
||||
}
|
||||
fmt.Println("TLS Version: ", tlsVersion)
|
||||
curveID := *(*gotls.CurveID)(unsafe.Pointer(reflect.ValueOf(tlsConn).Elem().FieldByName("curveID").UnsafeAddr()))
|
||||
curveID := connectionState.CurveID
|
||||
if curveID != 0 {
|
||||
PostQuantum := (curveID == gotls.X25519MLKEM768)
|
||||
fmt.Println("TLS Post-Quantum key exchange: ", PostQuantum, "("+curveID.String()+")")
|
||||
|
||||
@@ -489,15 +489,16 @@ func (w uploadWriter) Write(b []byte) (int, error) {
|
||||
}
|
||||
*/
|
||||
|
||||
buffer := buf.New()
|
||||
n, err := buffer.Write(b)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
buffer := buf.MultiBufferContainer{}
|
||||
common.Must2(buffer.Write(b))
|
||||
|
||||
err = w.WriteMultiBuffer([]*buf.Buffer{buffer})
|
||||
if err != nil {
|
||||
return 0, err
|
||||
var writed int
|
||||
for _, buff := range buffer.MultiBuffer {
|
||||
err := w.WriteMultiBuffer(buf.MultiBuffer{buff})
|
||||
if err != nil {
|
||||
return writed, err
|
||||
}
|
||||
writed += int(buff.Len())
|
||||
}
|
||||
return n, nil
|
||||
return writed, nil
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package splithttp_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"crypto/rand"
|
||||
"fmt"
|
||||
@@ -421,18 +422,12 @@ func Test_maxUpload(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
var uploadSize int
|
||||
uploadReceived := make([]byte, 10001)
|
||||
listen, err := ListenXH(context.Background(), net.LocalHostIP, listenPort, streamSettings, func(conn stat.Connection) {
|
||||
go func(c stat.Connection) {
|
||||
defer c.Close()
|
||||
var b [10240]byte
|
||||
c.SetReadDeadline(time.Now().Add(2 * time.Second))
|
||||
n, err := c.Read(b[:])
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
uploadSize = n
|
||||
io.ReadFull(c, uploadReceived)
|
||||
|
||||
common.Must2(c.Write([]byte("Response")))
|
||||
}(conn)
|
||||
@@ -441,10 +436,12 @@ func Test_maxUpload(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
|
||||
conn, err := Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), listenPort), streamSettings)
|
||||
common.Must(err)
|
||||
|
||||
// send a slightly too large upload
|
||||
var upload [10001]byte
|
||||
_, err = conn.Write(upload[:])
|
||||
upload := make([]byte, 10001)
|
||||
rand.Read(upload)
|
||||
_, err = conn.Write(upload)
|
||||
common.Must(err)
|
||||
|
||||
var b [10240]byte
|
||||
@@ -455,8 +452,8 @@ func Test_maxUpload(t *testing.T) {
|
||||
}
|
||||
common.Must(conn.Close())
|
||||
|
||||
if uploadSize > 10000 || uploadSize == 0 {
|
||||
t.Error("incorrect upload size: ", uploadSize)
|
||||
if !bytes.Equal(upload, uploadReceived) {
|
||||
t.Error("incorrect upload", upload, uploadReceived)
|
||||
}
|
||||
|
||||
common.Must(listen.Close())
|
||||
|
||||
Reference in New Issue
Block a user