1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2026-05-07 04:59:07 -04:00

handle read with data and error at same time

This commit is contained in:
Darien Raymond
2017-11-24 23:16:01 +01:00
parent 96a7587164
commit 2fdccb2424
4 changed files with 72 additions and 43 deletions

View File

@@ -6,6 +6,11 @@ import (
"v2ray.com/core/common/errors"
)
var (
_ Reader = (*BytesToBufferReader)(nil)
_ io.Reader = (*BytesToBufferReader)(nil)
)
// BytesToBufferReader is a Reader that adjusts its reading speed automatically.
type BytesToBufferReader struct {
io.Reader
@@ -37,15 +42,21 @@ func (r *BytesToBufferReader) ReadMultiBuffer() (MultiBuffer, error) {
}
nBytes, err := r.Reader.Read(r.buffer)
if err != nil {
return nil, err
if nBytes > 0 {
mb := NewMultiBufferCap(nBytes/Size + 1)
mb.Write(r.buffer[:nBytes])
return mb, err
}
mb := NewMultiBufferCap(nBytes/Size + 1)
mb.Write(r.buffer[:nBytes])
return mb, nil
return nil, err
}
var (
_ Reader = (*BufferedReader)(nil)
_ io.Reader = (*BufferedReader)(nil)
_ io.ByteReader = (*BufferedReader)(nil)
_ io.WriterTo = (*BufferedReader)(nil)
)
type BufferedReader struct {
stream Reader
legacyReader io.Reader
@@ -72,6 +83,12 @@ func (r *BufferedReader) IsBuffered() bool {
return r.buffered
}
func (r *BufferedReader) ReadByte() (byte, error) {
var b [1]byte
_, err := r.Read(b[:])
return b[0], err
}
func (r *BufferedReader) Read(b []byte) (int, error) {
if r.leftOver != nil {
nBytes, _ := r.leftOver.Read(b)
@@ -87,15 +104,14 @@ func (r *BufferedReader) Read(b []byte) (int, error) {
}
mb, err := r.stream.ReadMultiBuffer()
if err != nil {
return 0, err
if mb != nil {
nBytes, _ := mb.Read(b)
if !mb.IsEmpty() {
r.leftOver = mb
}
return nBytes, err
}
nBytes, _ := mb.Read(b)
if !mb.IsEmpty() {
r.leftOver = mb
}
return nBytes, nil
return 0, err
}
func (r *BufferedReader) ReadMultiBuffer() (MultiBuffer, error) {
@@ -120,11 +136,13 @@ func (r *BufferedReader) writeToInternal(writer io.Writer) (int64, error) {
for {
mb, err := r.stream.ReadMultiBuffer()
if err != nil {
return totalBytes, err
if mb != nil {
totalBytes += int64(mb.Len())
if werr := mbWriter.WriteMultiBuffer(mb); werr != nil {
return totalBytes, err
}
}
totalBytes += int64(mb.Len())
if err := mbWriter.WriteMultiBuffer(mb); err != nil {
if err != nil {
return totalBytes, err
}
}