9seconds 7 лет назад
Родитель
Сommit
5413a5b090

+ 3
- 3
mtproto/wrappers/abridged.go Просмотреть файл

28
 
28
 
29
 func (a *AbridgedReadWriteCloserWithAddr) Read(p []byte) (int, error) {
29
 func (a *AbridgedReadWriteCloserWithAddr) Read(p []byte) (int, error) {
30
 	return a.BufferedRead(p, func() error {
30
 	return a.BufferedRead(p, func() error {
31
+		a.opts.QuickAck = false
32
+		a.opts.SimpleAck = false
33
+
31
 		buf := &bytes.Buffer{}
34
 		buf := &bytes.Buffer{}
32
 		buf.Grow(3)
35
 		buf.Grow(3)
33
 
36
 
37
 		msgLength := uint8(buf.Bytes()[0])
40
 		msgLength := uint8(buf.Bytes()[0])
38
 		buf.Reset()
41
 		buf.Reset()
39
 
42
 
40
-		a.opts.QuickAck = false
41
 		if msgLength >= abridgedQuickAckLength {
43
 		if msgLength >= abridgedQuickAckLength {
42
 			a.opts.QuickAck = true
44
 			a.opts.QuickAck = true
43
 			msgLength -= 0x80
45
 			msgLength -= 0x80
78
 
80
 
79
 	case packetLength < abridgedLargePacketLength:
81
 	case packetLength < abridgedLargePacketLength:
80
 		length24 := toUint24(uint32(packetLength))
82
 		length24 := toUint24(uint32(packetLength))
81
-
82
 		buf := &bytes.Buffer{}
83
 		buf := &bytes.Buffer{}
83
 		buf.Grow(1 + 3 + len(p))
84
 		buf.Grow(1 + 3 + len(p))
84
 		buf.WriteByte(byte(abridgedSmallPacketLength))
85
 		buf.WriteByte(byte(abridgedSmallPacketLength))
85
 		buf.Write(length24[:])
86
 		buf.Write(length24[:])
86
 		buf.Write(p)
87
 		buf.Write(p)
87
-
88
 		return a.conn.Write(buf.Bytes())
88
 		return a.conn.Write(buf.Bytes())
89
 
89
 
90
 	default:
90
 	default:

+ 1
- 1
mtproto/wrappers/frame.go Просмотреть файл

66
 			if _, err := io.CopyN(writer, f.conn, 4); err != nil {
66
 			if _, err := io.CopyN(writer, f.conn, 4); err != nil {
67
 				return errors.Annotate(err, "Cannot read frame padding")
67
 				return errors.Annotate(err, "Cannot read frame padding")
68
 			}
68
 			}
69
-			if !bytes.Equal(buf.Bytes(), frameRWCPadding[:]) {
69
+			if !bytes.Equal(buf.Bytes(), frameRWCPadding) {
70
 				break
70
 				break
71
 			}
71
 			}
72
 		}
72
 		}

+ 3
- 0
mtproto/wrappers/intermediate.go Просмотреть файл

23
 
23
 
24
 func (i *IntermediateReadWriteCloserWithAddr) Read(p []byte) (int, error) {
24
 func (i *IntermediateReadWriteCloserWithAddr) Read(p []byte) (int, error) {
25
 	return i.BufferedRead(p, func() error {
25
 	return i.BufferedRead(p, func() error {
26
+		i.opts.QuickAck = false
27
+		i.opts.SimpleAck = false
28
+
26
 		buf := &bytes.Buffer{}
29
 		buf := &bytes.Buffer{}
27
 		buf.Grow(4)
30
 		buf.Grow(4)
28
 
31
 

+ 5
- 6
mtproto/wrappers/proxy_request.go Просмотреть файл

29
 			return errors.Annotate(err, "Cannot read RPC tag")
29
 			return errors.Annotate(err, "Cannot read RPC tag")
30
 		}
30
 		}
31
 
31
 
32
-		if bytes.Equal(ansBuf.Bytes(), rpc.TagCloseExt) {
32
+		switch {
33
+		case bytes.Equal(ansBuf.Bytes(), rpc.TagCloseExt):
33
 			return p.readCloseExt()
34
 			return p.readCloseExt()
34
-		} else if bytes.Equal(ansBuf.Bytes(), rpc.TagProxyAns) {
35
+		case bytes.Equal(ansBuf.Bytes(), rpc.TagProxyAns):
35
 			return p.readProxyAns(buf)
36
 			return p.readProxyAns(buf)
36
-		} else if bytes.Equal(ansBuf.Bytes(), rpc.TagSimpleAck) {
37
+		case bytes.Equal(ansBuf.Bytes(), rpc.TagSimpleAck):
37
 			return p.readSimpleAck()
38
 			return p.readSimpleAck()
38
 		}
39
 		}
39
 
40
 
40
-		return nil
41
+		return errors.Errorf("Unknown RPC answer %s", ansBuf.Bytes())
41
 	})
42
 	})
42
 }
43
 }
43
 
44
 
80
 	if _, err := p.conn.Write(p.req.Bytes(raw)); err != nil {
81
 	if _, err := p.conn.Write(p.req.Bytes(raw)); err != nil {
81
 		return 0, err
82
 		return 0, err
82
 	}
83
 	}
83
-	p.req.Options.SimpleAck = false
84
-	p.req.Options.QuickAck = false
85
 
84
 
86
 	return len(raw), nil
85
 	return len(raw), nil
87
 }
86
 }

+ 6
- 5
wrappers/blockcipherrwc.go Просмотреть файл

1
 package wrappers
1
 package wrappers
2
 
2
 
3
 import (
3
 import (
4
+	"bytes"
4
 	"crypto/aes"
5
 	"crypto/aes"
5
 	"crypto/cipher"
6
 	"crypto/cipher"
6
 	"net"
7
 	"net"
18
 
19
 
19
 func (c *BlockCipherReadWriteCloserWithAddr) Read(p []byte) (int, error) {
20
 func (c *BlockCipherReadWriteCloserWithAddr) Read(p []byte) (int, error) {
20
 	return c.BufferedRead(p, func() error {
21
 	return c.BufferedRead(p, func() error {
21
-		bufferLength := c.Buffer.Len()
22
-		for bufferLength%aes.BlockSize != 0 || bufferLength == 0 {
22
+		buf := &bytes.Buffer{}
23
+		for buf.Len()%aes.BlockSize != 0 || buf.Len() == 0 {
23
 			n, err := c.conn.Read(p)
24
 			n, err := c.conn.Read(p)
24
 			if err != nil {
25
 			if err != nil {
25
 				return errors.Annotate(err, "Cannot read from socket")
26
 				return errors.Annotate(err, "Cannot read from socket")
26
 			}
27
 			}
27
-			c.Buffer.Write(p[:n])
28
-			bufferLength = c.Buffer.Len()
28
+			buf.Write(p[:n])
29
 		}
29
 		}
30
-		c.decryptor.CryptBlocks(c.Buffer.Bytes(), c.Buffer.Bytes())
30
+		c.decryptor.CryptBlocks(buf.Bytes(), buf.Bytes())
31
+		c.Buffer.Write(buf.Bytes())
31
 
32
 
32
 		return nil
33
 		return nil
33
 	})
34
 	})

Загрузка…
Отмена
Сохранить