mirror of https://github.com/v2ray/v2ray-core
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.1 KiB
52 lines
1.1 KiB
package mux |
|
|
|
import ( |
|
"io" |
|
|
|
"v2ray.com/core/common/buf" |
|
"v2ray.com/core/common/crypto" |
|
"v2ray.com/core/common/serial" |
|
) |
|
|
|
// PacketReader is an io.Reader that reads whole chunk of Mux frames every time. |
|
type PacketReader struct { |
|
reader io.Reader |
|
eof bool |
|
} |
|
|
|
// NewPacketReader creates a new PacketReader. |
|
func NewPacketReader(reader io.Reader) *PacketReader { |
|
return &PacketReader{ |
|
reader: reader, |
|
eof: false, |
|
} |
|
} |
|
|
|
// ReadMultiBuffer implements buf.Reader. |
|
func (r *PacketReader) ReadMultiBuffer() (buf.MultiBuffer, error) { |
|
if r.eof { |
|
return nil, io.EOF |
|
} |
|
|
|
size, err := serial.ReadUint16(r.reader) |
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
if size > buf.Size { |
|
return nil, newError("packet size too large: ", size) |
|
} |
|
|
|
b := buf.New() |
|
if _, err := b.ReadFullFrom(r.reader, int32(size)); err != nil { |
|
b.Release() |
|
return nil, err |
|
} |
|
r.eof = true |
|
return buf.MultiBuffer{b}, nil |
|
} |
|
|
|
// NewStreamReader creates a new StreamReader. |
|
func NewStreamReader(reader *buf.BufferedReader) buf.Reader { |
|
return crypto.NewChunkStreamReaderWithChunkCount(crypto.PlainChunkSizeParser{}, reader, 1) |
|
}
|
|
|