9seconds 7 лет назад
Родитель
Сommit
d636010377
3 измененных файлов: 96 добавлений и 11 удалений
  1. 10
    9
      mtproto/wrappers/abridged.go
  2. 83
    0
      mtproto/wrappers/intermediate.go
  3. 3
    2
      mtproto/wrappers/proxy_request.go

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

@@ -20,14 +20,14 @@ const (
20 20
 	abridgedLargePacketLength = 16777216 // 256 ^ 3
21 21
 )
22 22
 
23
-type AbridgedReadWriteCloserAddr struct {
23
+type AbridgedReadWriteCloserWithAddr struct {
24 24
 	wrappers.BufferedReader
25 25
 
26 26
 	conn wrappers.ReadWriteCloserWithAddr
27 27
 	opts *mtproto.ConnectionOpts
28 28
 }
29 29
 
30
-func (a *AbridgedReadWriteCloserAddr) Read(p []byte) (int, error) {
30
+func (a *AbridgedReadWriteCloserWithAddr) Read(p []byte) (int, error) {
31 31
 	return a.BufferedRead(p, func() error {
32 32
 		var msgLength uint8
33 33
 		if err := binary.Read(a.conn, binary.LittleEndian, &msgLength); err != nil {
@@ -62,7 +62,7 @@ func (a *AbridgedReadWriteCloserAddr) Read(p []byte) (int, error) {
62 62
 	})
63 63
 }
64 64
 
65
-func (a *AbridgedReadWriteCloserAddr) Write(p []byte) (int, error) {
65
+func (a *AbridgedReadWriteCloserWithAddr) Write(p []byte) (int, error) {
66 66
 	if len(p)%4 != 0 {
67 67
 		return 0, errors.Errorf("Incorrect packet length %d", len(p))
68 68
 	}
@@ -92,15 +92,15 @@ func (a *AbridgedReadWriteCloserAddr) Write(p []byte) (int, error) {
92 92
 	}
93 93
 }
94 94
 
95
-func (a *AbridgedReadWriteCloserAddr) Close() error {
95
+func (a *AbridgedReadWriteCloserWithAddr) Close() error {
96 96
 	return a.conn.Close()
97 97
 }
98 98
 
99
-func (a *AbridgedReadWriteCloserAddr) LocalAddr() *net.TCPAddr {
99
+func (a *AbridgedReadWriteCloserWithAddr) LocalAddr() *net.TCPAddr {
100 100
 	return a.conn.LocalAddr()
101 101
 }
102 102
 
103
-func (a *AbridgedReadWriteCloserAddr) RemoteAddr() *net.TCPAddr {
103
+func (a *AbridgedReadWriteCloserWithAddr) RemoteAddr() *net.TCPAddr {
104 104
 	return a.conn.RemoteAddr()
105 105
 }
106 106
 
@@ -113,8 +113,9 @@ func fromUint24(number uint24) uint32 {
113 113
 }
114 114
 
115 115
 func NewAbridgedRWC(conn wrappers.ReadWriteCloserWithAddr, connOpts *mtproto.ConnectionOpts) wrappers.ReadWriteCloserWithAddr {
116
-	return &AbridgedReadWriteCloserAddr{
117
-		conn: conn,
118
-		opts: connOpts,
116
+	return &AbridgedReadWriteCloserWithAddr{
117
+		BufferedReader: wrappers.NewBufferedReader(),
118
+		conn:           conn,
119
+		opts:           connOpts,
119 120
 	}
120 121
 }

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

@@ -0,0 +1,83 @@
1
+package wrappers
2
+
3
+import (
4
+	"bytes"
5
+	"encoding/binary"
6
+	"io"
7
+	"net"
8
+
9
+	"github.com/juju/errors"
10
+
11
+	"github.com/9seconds/mtg/mtproto"
12
+	"github.com/9seconds/mtg/wrappers"
13
+)
14
+
15
+const intermediateQuickAckLength = 0x80000000
16
+
17
+type IntermediateReadWriteCloserWithAddr struct {
18
+	wrappers.BufferedReader
19
+
20
+	conn wrappers.ReadWriteCloserWithAddr
21
+	opts *mtproto.ConnectionOpts
22
+}
23
+
24
+func (i *IntermediateReadWriteCloserWithAddr) Read(p []byte) (int, error) {
25
+	return i.BufferedRead(p, func() error {
26
+		var length uint32
27
+		if err := binary.Read(i.conn, binary.LittleEndian, &length); err != nil {
28
+			return errors.Annotate(err, "Cannot read message length")
29
+		}
30
+
31
+		if length > intermediateQuickAckLength {
32
+			i.opts.QuickAck = true
33
+			length -= intermediateQuickAckLength
34
+		}
35
+
36
+		buf := &bytes.Buffer{}
37
+		buf.Grow(int(length))
38
+		if _, err := io.CopyN(buf, i.conn, int64(length)); err != nil {
39
+			return errors.Annotate(err, "Cannot read the message")
40
+		}
41
+
42
+		if length%4 != 0 {
43
+			length -= length % 4
44
+			i.Buffer.Write(buf.Bytes()[:length])
45
+			return nil
46
+		}
47
+
48
+		i.Buffer.Write(buf.Bytes())
49
+
50
+		return nil
51
+	})
52
+}
53
+
54
+func (i *IntermediateReadWriteCloserWithAddr) Write(p []byte) (int, error) {
55
+	if i.opts.SimpleAck {
56
+		return i.conn.Write(p)
57
+	}
58
+
59
+	var length [4]byte
60
+	binary.LittleEndian.PutUint32(length[:], uint32(len(p)))
61
+
62
+	return i.conn.Write(append(length[:], p...))
63
+}
64
+
65
+func (i *IntermediateReadWriteCloserWithAddr) Close() error {
66
+	return i.conn.Close()
67
+}
68
+
69
+func (i *IntermediateReadWriteCloserWithAddr) LocalAddr() *net.TCPAddr {
70
+	return i.conn.LocalAddr()
71
+}
72
+
73
+func (i *IntermediateReadWriteCloserWithAddr) RemoteAddr() *net.TCPAddr {
74
+	return i.conn.RemoteAddr()
75
+}
76
+
77
+func NewIntermediateRWC(conn wrappers.ReadWriteCloserWithAddr, connOpts *mtproto.ConnectionOpts) wrappers.ReadWriteCloserWithAddr {
78
+	return &IntermediateReadWriteCloserWithAddr{
79
+		BufferedReader: wrappers.NewBufferedReader(),
80
+		conn:           conn,
81
+		opts:           connOpts,
82
+	}
83
+}

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

@@ -105,7 +105,8 @@ func NewProxyRequestRWC(conn wrappers.ReadWriteCloserWithAddr, connOpts *mtproto
105 105
 	}
106 106
 
107 107
 	return &ProxyRequestReadWriteCloserWithAddr{
108
-		conn: conn,
109
-		req:  req,
108
+		BufferedReader: wrappers.NewBufferedReader(),
109
+		conn:           conn,
110
+		req:            req,
110 111
 	}, nil
111 112
 }

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