9seconds 7 лет назад
Родитель
Сommit
a7d46727ba
3 измененных файлов: 134 добавлений и 96 удалений
  1. 0
    90
      mtproto/wrappers/intermediate.go
  2. 15
    6
      wrappers/mtproto_abridged.go
  3. 119
    0
      wrappers/mtproto_intermediate.go

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

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
-		buf := &bytes.Buffer{}
27
-		buf.Grow(4)
28
-
29
-		if _, err := io.CopyN(buf, i.conn, 4); err != nil {
30
-			return errors.Annotate(err, "Cannot read message length")
31
-		}
32
-		length := binary.LittleEndian.Uint32(buf.Bytes())
33
-		buf.Reset()
34
-		buf.Grow(int(length))
35
-
36
-		if length > intermediateQuickAckLength {
37
-			i.opts.ReadHacks.QuickAck = true
38
-			length -= intermediateQuickAckLength
39
-		}
40
-
41
-		if _, err := io.CopyN(buf, i.conn, int64(length)); err != nil {
42
-			return errors.Annotate(err, "Cannot read the message")
43
-		}
44
-
45
-		if length%4 != 0 {
46
-			length -= length % 4
47
-			i.Buffer.Write(buf.Bytes()[:length])
48
-			return nil
49
-		}
50
-
51
-		i.Buffer.Write(buf.Bytes())
52
-
53
-		return nil
54
-	})
55
-}
56
-
57
-func (i *IntermediateReadWriteCloserWithAddr) Write(p []byte) (int, error) {
58
-	if i.opts.WriteHacks.SimpleAck {
59
-		return i.conn.Write(p)
60
-	}
61
-
62
-	var length [4]byte
63
-	binary.LittleEndian.PutUint32(length[:], uint32(len(p)))
64
-
65
-	return i.conn.Write(append(length[:], p...))
66
-}
67
-
68
-func (i *IntermediateReadWriteCloserWithAddr) Close() error {
69
-	return i.conn.Close()
70
-}
71
-
72
-func (i *IntermediateReadWriteCloserWithAddr) LocalAddr() *net.TCPAddr {
73
-	return i.conn.LocalAddr()
74
-}
75
-
76
-func (i *IntermediateReadWriteCloserWithAddr) RemoteAddr() *net.TCPAddr {
77
-	return i.conn.RemoteAddr()
78
-}
79
-
80
-func (i *IntermediateReadWriteCloserWithAddr) SocketID() string {
81
-	return i.conn.SocketID()
82
-}
83
-
84
-func NewIntermediateRWC(conn wrappers.ReadWriteCloserWithAddr, connOpts *mtproto.ConnectionOpts) wrappers.ReadWriteCloserWithAddr {
85
-	return &IntermediateReadWriteCloserWithAddr{
86
-		BufferedReader: wrappers.NewBufferedReader(),
87
-		conn:           conn,
88
-		opts:           connOpts,
89
-	}
90
-}

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

26
 }
26
 }
27
 
27
 
28
 func (m *MTProtoAbridged) Read() ([]byte, error) {
28
 func (m *MTProtoAbridged) Read() ([]byte, error) {
29
-	m.LogDebug("Read abridged packet",
30
-		"simple_ack", m.opts.WriteHacks.SimpleAck,
31
-		"quick_ack", m.opts.WriteHacks.QuickAck,
29
+	m.LogDebug("Read packet",
30
+		"simple_ack", m.opts.ReadHacks.SimpleAck,
31
+		"quick_ack", m.opts.ReadHacks.QuickAck,
32
 		"counter", m.readCounter,
32
 		"counter", m.readCounter,
33
 	)
33
 	)
34
 
34
 
41
 	msgLength := uint8(buf.Bytes()[0])
41
 	msgLength := uint8(buf.Bytes()[0])
42
 	buf.Reset()
42
 	buf.Reset()
43
 
43
 
44
-	m.LogDebug("Abridged packet first byte",
44
+	m.LogDebug("Packet first byte",
45
 		"byte", msgLength,
45
 		"byte", msgLength,
46
 		"counter", m.readCounter,
46
 		"counter", m.readCounter,
47
+		"simple_ack", m.opts.ReadHacks.SimpleAck,
48
+		"quick_ack", m.opts.ReadHacks.QuickAck,
47
 	)
49
 	)
48
 
50
 
49
 	if msgLength >= mtprotoAbridgedQuickAckLength {
51
 	if msgLength >= mtprotoAbridgedQuickAckLength {
62
 	}
64
 	}
63
 	msgLength32 *= 4
65
 	msgLength32 *= 4
64
 
66
 
65
-	m.LogDebug("Abridged packet length",
67
+	m.LogDebug("Packet length",
66
 		"length", msgLength32,
68
 		"length", msgLength32,
69
+		"simple_ack", m.opts.ReadHacks.SimpleAck,
70
+		"quick_ack", m.opts.ReadHacks.QuickAck,
67
 		"counter", m.readCounter,
71
 		"counter", m.readCounter,
68
 	)
72
 	)
69
 
73
 
79
 }
83
 }
80
 
84
 
81
 func (m *MTProtoAbridged) Write(p []byte) (int, error) {
85
 func (m *MTProtoAbridged) Write(p []byte) (int, error) {
82
-	m.LogDebug("Write abridged packet",
86
+	m.LogDebug("Write packet",
83
 		"length", len(p),
87
 		"length", len(p),
84
 		"simple_ack", m.opts.WriteHacks.SimpleAck,
88
 		"simple_ack", m.opts.WriteHacks.SimpleAck,
85
 		"quick_ack", m.opts.WriteHacks.QuickAck,
89
 		"quick_ack", m.opts.WriteHacks.QuickAck,
91
 	}
95
 	}
92
 
96
 
93
 	if m.opts.WriteHacks.SimpleAck {
97
 	if m.opts.WriteHacks.SimpleAck {
98
+		m.writeCounter++
94
 		return m.conn.Write(utils.ReverseBytes(p))
99
 		return m.conn.Write(utils.ReverseBytes(p))
95
 	}
100
 	}
96
 
101
 
120
 }
125
 }
121
 
126
 
122
 func (m *MTProtoAbridged) LogDebug(msg string, data ...interface{}) {
127
 func (m *MTProtoAbridged) LogDebug(msg string, data ...interface{}) {
128
+	data = append(data, []interface{}{"type", "abridged"})
123
 	m.conn.LogDebug(msg, data...)
129
 	m.conn.LogDebug(msg, data...)
124
 }
130
 }
125
 
131
 
126
 func (m *MTProtoAbridged) LogInfo(msg string, data ...interface{}) {
132
 func (m *MTProtoAbridged) LogInfo(msg string, data ...interface{}) {
133
+	data = append(data, []interface{}{"type", "abridged"})
127
 	m.conn.LogInfo(msg, data...)
134
 	m.conn.LogInfo(msg, data...)
128
 }
135
 }
129
 
136
 
130
 func (m *MTProtoAbridged) LogWarn(msg string, data ...interface{}) {
137
 func (m *MTProtoAbridged) LogWarn(msg string, data ...interface{}) {
138
+	data = append(data, []interface{}{"type", "abridged"})
131
 	m.conn.LogWarn(msg, data...)
139
 	m.conn.LogWarn(msg, data...)
132
 }
140
 }
133
 
141
 
134
 func (m *MTProtoAbridged) LogError(msg string, data ...interface{}) {
142
 func (m *MTProtoAbridged) LogError(msg string, data ...interface{}) {
143
+	data = append(data, []interface{}{"type", "abridged"})
135
 	m.conn.LogError(msg, data...)
144
 	m.conn.LogError(msg, data...)
136
 }
145
 }
137
 
146
 

+ 119
- 0
wrappers/mtproto_intermediate.go Просмотреть файл

1
+package wrappers
2
+
3
+import (
4
+	"bytes"
5
+	"encoding/binary"
6
+	"io"
7
+	"net"
8
+
9
+	"github.com/9seconds/mtg/mtproto"
10
+	"github.com/juju/errors"
11
+)
12
+
13
+const mtprotoIntermediateQuickAckLength = 0x80000000
14
+
15
+type MTProtoIntermediate struct {
16
+	conn WrapStreamReadWriteCloser
17
+	opts *mtproto.ConnectionOpts
18
+
19
+	readCounter  uint32
20
+	writeCounter uint32
21
+}
22
+
23
+func (m *MTProtoIntermediate) Read() ([]byte, error) {
24
+	m.LogDebug("Read packet",
25
+		"simple_ack", m.opts.ReadHacks.SimpleAck,
26
+		"quick_ack", m.opts.ReadHacks.QuickAck,
27
+		"counter", m.readCounter,
28
+	)
29
+
30
+	buf := &bytes.Buffer{}
31
+	buf.Grow(4)
32
+
33
+	if _, err := io.CopyN(buf, m.conn, 4); err != nil {
34
+		return nil, errors.Annotate(err, "Cannot read message length")
35
+	}
36
+	length := binary.LittleEndian.Uint32(buf.Bytes())
37
+
38
+	m.LogDebug("Packet message length",
39
+		"simple_ack", m.opts.ReadHacks.SimpleAck,
40
+		"quick_ack", m.opts.ReadHacks.QuickAck,
41
+		"counter", m.readCounter,
42
+		"length", length,
43
+	)
44
+
45
+	if length > mtprotoIntermediateQuickAckLength {
46
+		m.opts.ReadHacks.QuickAck = true
47
+		length -= mtprotoIntermediateQuickAckLength
48
+	}
49
+
50
+	buf.Reset()
51
+	buf.Grow(int(length))
52
+	if _, err := io.CopyN(buf, m.conn, int64(length)); err != nil {
53
+		return nil, errors.Annotate(err, "Cannot read the message")
54
+	}
55
+
56
+	if length%4 != 0 {
57
+		length -= length % 4
58
+	}
59
+	m.readCounter++
60
+
61
+	return buf.Bytes()[:length], nil
62
+}
63
+
64
+func (m *MTProtoIntermediate) Write(p []byte) (int, error) {
65
+	m.LogDebug("Write packet",
66
+		"simple_ack", m.opts.WriteHacks.SimpleAck,
67
+		"quick_ack", m.opts.WriteHacks.QuickAck,
68
+		"counter", m.writeCounter,
69
+	)
70
+	m.writeCounter++
71
+
72
+	if m.opts.ReadHacks.SimpleAck {
73
+		return m.conn.Write(p)
74
+	}
75
+
76
+	var length [4]byte
77
+	binary.LittleEndian.PutUint32(length[:], uint32(len(p)))
78
+
79
+	return m.conn.Write(append(length[:], p...))
80
+}
81
+
82
+func (m *MTProtoIntermediate) LogDebug(msg string, data ...interface{}) {
83
+	data = append(data, []interface{}{"type", "intermediate"})
84
+	m.conn.LogDebug(msg, data...)
85
+}
86
+
87
+func (m *MTProtoIntermediate) LogInfo(msg string, data ...interface{}) {
88
+	data = append(data, []interface{}{"type", "intermediate"})
89
+	m.conn.LogInfo(msg, data...)
90
+}
91
+
92
+func (m *MTProtoIntermediate) LogWarn(msg string, data ...interface{}) {
93
+	data = append(data, []interface{}{"type", "intermediate"})
94
+	m.conn.LogWarn(msg, data...)
95
+}
96
+
97
+func (m *MTProtoIntermediate) LogError(msg string, data ...interface{}) {
98
+	data = append(data, []interface{}{"type", "intermediate"})
99
+	m.conn.LogError(msg, data...)
100
+}
101
+
102
+func (m *MTProtoIntermediate) LocalAddr() *net.TCPAddr {
103
+	return m.conn.LocalAddr()
104
+}
105
+
106
+func (m *MTProtoIntermediate) RemoteAddr() *net.TCPAddr {
107
+	return m.conn.RemoteAddr()
108
+}
109
+
110
+func (m *MTProtoIntermediate) Close() error {
111
+	return m.conn.Close()
112
+}
113
+
114
+func NewMTProtoIntermediate(conn WrapStreamReadWriteCloser, opts *mtproto.ConnectionOpts) WrapPacketReadWriteCloser {
115
+	return &MTProtoIntermediate{
116
+		conn: conn,
117
+		opts: opts,
118
+	}
119
+}

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