summaryrefslogtreecommitdiff
path: root/obfs4.go
diff options
context:
space:
mode:
Diffstat (limited to 'obfs4.go')
-rw-r--r--obfs4.go39
1 files changed, 5 insertions, 34 deletions
diff --git a/obfs4.go b/obfs4.go
index 3cb464e..f2a0139 100644
--- a/obfs4.go
+++ b/obfs4.go
@@ -252,49 +252,20 @@ func (c *Obfs4Conn) ServerHandshake() error {
return err
}
-func (c *Obfs4Conn) Read(b []byte) (int, error) {
+func (c *Obfs4Conn) Read(b []byte) (n int, err error) {
if !c.isOk {
return 0, syscall.EINVAL
}
- if c.receiveDecodedBuffer.Len() > 0 {
- n, err := c.receiveDecodedBuffer.Read(b)
- return n, err
- }
-
- // Consume and decode frames off the network.
- buf := make([]byte, defaultReadSize)
for c.receiveDecodedBuffer.Len() == 0 {
- n, err := c.conn.Read(buf)
+ err = c.consumeFramedPackets()
if err != nil {
- return 0, err
- }
- c.receiveBuffer.Write(buf[:n])
-
- // Decode the data just read.
- for c.receiveBuffer.Len() > 0 {
- _, frame, err := c.decoder.Decode(&c.receiveBuffer)
- if err == framing.ErrAgain {
- break
- } else if err != nil {
- // Any other frame decoder errors are fatal.
- c.isOk = false
- return 0, err
- }
-
- // Decode the packet, if there is payload, it will be placed in
- // receiveDecodedBuffer automatically.
- err = c.decodePacket(frame)
- if err != nil {
- // All packet decoder errors are fatal.
- c.isOk = false
- return 0, err
- }
+ return
}
}
- n, err := c.receiveDecodedBuffer.Read(b)
- return n, err
+ n, err = c.receiveDecodedBuffer.Read(b)
+ return
}
func (c *Obfs4Conn) Write(b []byte) (int, error) {