mirror of https://github.com/v2ray/v2ray-core
merging reader
parent
eab2f1effc
commit
cb0e29ccdb
|
@ -41,14 +41,15 @@ func (b *Buffer) Clear() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// AppendBytes appends one or more bytes to the end of the buffer.
|
// AppendBytes appends one or more bytes to the end of the buffer.
|
||||||
func (b *Buffer) AppendBytes(bytes ...byte) {
|
func (b *Buffer) AppendBytes(bytes ...byte) int {
|
||||||
b.Append(bytes)
|
return b.Append(bytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Append appends a byte array to the end of the buffer.
|
// Append appends a byte array to the end of the buffer.
|
||||||
func (b *Buffer) Append(data []byte) {
|
func (b *Buffer) Append(data []byte) int {
|
||||||
nBytes := copy(b.v[b.end:], data)
|
nBytes := copy(b.v[b.end:], data)
|
||||||
b.end += nBytes
|
b.end += nBytes
|
||||||
|
return nBytes
|
||||||
}
|
}
|
||||||
|
|
||||||
// AppendSupplier appends the content of a BytesWriter to the buffer.
|
// AppendSupplier appends the content of a BytesWriter to the buffer.
|
||||||
|
|
|
@ -2,6 +2,7 @@ package buf
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
|
"time"
|
||||||
|
|
||||||
"v2ray.com/core/common/errors"
|
"v2ray.com/core/common/errors"
|
||||||
"v2ray.com/core/common/signal"
|
"v2ray.com/core/common/signal"
|
||||||
|
@ -13,6 +14,12 @@ type Reader interface {
|
||||||
Read() (*Buffer, error)
|
Read() (*Buffer, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var ErrReadTimeout = errors.New("Buf: IO timeout.")
|
||||||
|
|
||||||
|
type TimeoutReader interface {
|
||||||
|
ReadTimeout(time.Duration) (*Buffer, error)
|
||||||
|
}
|
||||||
|
|
||||||
// Writer extends io.Writer with alloc.Buffer.
|
// Writer extends io.Writer with alloc.Buffer.
|
||||||
type Writer interface {
|
type Writer interface {
|
||||||
// Write writes an alloc.Buffer into underlying writer.
|
// Write writes an alloc.Buffer into underlying writer.
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
package buf
|
||||||
|
|
||||||
|
type MergingReader struct {
|
||||||
|
reader Reader
|
||||||
|
leftover *Buffer
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewMergingReader(reader Reader) Reader {
|
||||||
|
return &MergingReader{
|
||||||
|
reader: reader,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *MergingReader) Read() (*Buffer, error) {
|
||||||
|
if r.leftover != nil {
|
||||||
|
return r.leftover, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
b, err := r.reader.Read()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if b.IsFull() {
|
||||||
|
return b, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
b2, err := r.reader.Read()
|
||||||
|
if err != nil {
|
||||||
|
return b, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
nBytes := b.Append(b2.Bytes())
|
||||||
|
b2.SliceFrom(nBytes)
|
||||||
|
if b2.IsEmpty() {
|
||||||
|
b2.Release()
|
||||||
|
} else {
|
||||||
|
r.leftover = b2
|
||||||
|
}
|
||||||
|
|
||||||
|
return b, nil
|
||||||
|
}
|
|
@ -2,7 +2,6 @@ package ray
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
|
||||||
"io"
|
"io"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -13,8 +12,6 @@ const (
|
||||||
bufferSize = 512
|
bufferSize = 512
|
||||||
)
|
)
|
||||||
|
|
||||||
var ErrReadTimeout = errors.New("Ray: timeout.")
|
|
||||||
|
|
||||||
// NewRay creates a new Ray for direct traffic transport.
|
// NewRay creates a new Ray for direct traffic transport.
|
||||||
func NewRay(ctx context.Context) Ray {
|
func NewRay(ctx context.Context) Ray {
|
||||||
return &directRay{
|
return &directRay{
|
||||||
|
@ -101,7 +98,7 @@ func (v *Stream) ReadTimeout(timeout time.Duration) (*buf.Buffer, error) {
|
||||||
case <-v.err:
|
case <-v.err:
|
||||||
return nil, io.ErrClosedPipe
|
return nil, io.ErrClosedPipe
|
||||||
case <-time.After(timeout):
|
case <-time.After(timeout):
|
||||||
return nil, ErrReadTimeout
|
return nil, buf.ErrReadTimeout
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue