mirror of
https://github.com/shtorm-7/sing-box-extended.git
synced 2026-05-25 05:37:40 +03:00
42 lines
1.1 KiB
Go
42 lines
1.1 KiB
Go
package xhttp
|
|
|
|
import (
|
|
common "github.com/sagernet/sing-box/common/xray"
|
|
"github.com/sagernet/sing-box/common/xray/buf"
|
|
"github.com/sagernet/sing-box/common/xray/pipe"
|
|
)
|
|
|
|
// A wrapper around pipe that ensures the size limit is exactly honored.
|
|
//
|
|
// The MultiBuffer pipe accepts any single WriteMultiBuffer call even if that
|
|
// single MultiBuffer exceeds the size limit, and then starts blocking on the
|
|
// next WriteMultiBuffer call. This means that ReadMultiBuffer can return more
|
|
// bytes than the size limit. We work around this by splitting a potentially
|
|
// too large write up into multiple.
|
|
type uploadWriter struct {
|
|
*pipe.Writer
|
|
maxLen int32
|
|
}
|
|
|
|
func (w uploadWriter) Write(b []byte) (int, error) {
|
|
/*
|
|
capacity := int(w.maxLen - w.Len())
|
|
if capacity > 0 && capacity < len(b) {
|
|
b = b[:capacity]
|
|
}
|
|
*/
|
|
|
|
buffer := buf.MultiBufferContainer{}
|
|
common.Must2(buffer.Write(b))
|
|
|
|
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 writed, nil
|
|
}
|