Procházet zdrojové kódy

Preliminary debug state

tags/0.9
9seconds před 7 roky
rodič
revize
a3933e6ede

+ 1
- 1
client/client.go Zobrazit soubor

@@ -9,4 +9,4 @@ import (
9 9
 )
10 10
 
11 11
 // Init has to initialize client connection based on given config.
12
-type Init func(net.Conn, *config.Config) (wrappers.ReadWriteCloserWithAddr, *mtproto.ConnectionOpts, error)
12
+type Init func(net.Conn, string, *config.Config) (wrappers.ReadWriteCloserWithAddr, *mtproto.ConnectionOpts, error)

+ 2
- 2
client/direct.go Zobrazit soubor

@@ -15,7 +15,7 @@ import (
15 15
 const handshakeTimeout = 10 * time.Second
16 16
 
17 17
 // DirectInit initializes client to access Telegram bypassing middleproxies.
18
-func DirectInit(conn net.Conn, conf *config.Config) (wrappers.ReadWriteCloserWithAddr, *mtproto.ConnectionOpts, error) {
18
+func DirectInit(conn net.Conn, socketID string, conf *config.Config) (wrappers.ReadWriteCloserWithAddr, *mtproto.ConnectionOpts, error) {
19 19
 	if err := config.SetSocketOptions(conn); err != nil {
20 20
 		return nil, nil, errors.Annotate(err, "Cannot set socket options")
21 21
 	}
@@ -34,7 +34,7 @@ func DirectInit(conn net.Conn, conf *config.Config) (wrappers.ReadWriteCloserWit
34 34
 	connOpts.ConnectionProto = mtproto.ConnectionProtocolAny
35 35
 	connOpts.ClientAddr = conn.RemoteAddr().(*net.TCPAddr)
36 36
 
37
-	socket := wrappers.NewTimeoutRWC(conn, conf.PublicIPv4, conf.PublicIPv6)
37
+	socket := wrappers.NewTimeoutRWC(conn, socketID, conf.PublicIPv4, conf.PublicIPv6)
38 38
 	socket = wrappers.NewStreamCipherRWC(socket, obfs2.Encryptor, obfs2.Decryptor)
39 39
 
40 40
 	return socket, connOpts, nil

+ 2
- 2
client/middle.go Zobrazit soubor

@@ -9,8 +9,8 @@ import (
9 9
 	"github.com/9seconds/mtg/wrappers"
10 10
 )
11 11
 
12
-func MiddleInit(conn net.Conn, conf *config.Config) (wrappers.ReadWriteCloserWithAddr, *mtproto.ConnectionOpts, error) {
13
-	newConn, opts, err := DirectInit(conn, conf)
12
+func MiddleInit(conn net.Conn, socketID string, conf *config.Config) (wrappers.ReadWriteCloserWithAddr, *mtproto.ConnectionOpts, error) {
13
+	newConn, opts, err := DirectInit(conn, socketID, conf)
14 14
 	if err != nil {
15 15
 		return nil, nil, err
16 16
 	}

+ 12
- 4
mtproto/wrappers/abridged.go Zobrazit soubor

@@ -31,15 +31,18 @@ func (a *AbridgedReadWriteCloserWithAddr) Read(p []byte) (int, error) {
31 31
 		buf := &bytes.Buffer{}
32 32
 		buf.Grow(3)
33 33
 
34
+		q := make([]byte, 1)
35
+
34 36
 		if _, err := io.CopyN(buf, a.conn, 1); err != nil {
35 37
 			return errors.Annotate(err, "Cannot read message length")
36 38
 		}
37 39
 		msgLength := uint8(buf.Bytes()[0])
40
+		q[0] = msgLength
38 41
 		buf.Reset()
39 42
 
40 43
 		if msgLength >= abridgedQuickAckLength {
41 44
 			a.opts.ReadHacks.QuickAck = true
42
-			msgLength -= 0x80
45
+			msgLength -= abridgedQuickAckLength
43 46
 		}
44 47
 
45 48
 		msgLength32 := uint32(msgLength)
@@ -49,6 +52,7 @@ func (a *AbridgedReadWriteCloserWithAddr) Read(p []byte) (int, error) {
49 52
 			}
50 53
 			number := uint24{}
51 54
 			copy(number[:], buf.Bytes())
55
+			q = append(q, buf.Bytes()...)
52 56
 			msgLength32 = fromUint24(number)
53 57
 		}
54 58
 		msgLength32 *= 4
@@ -59,6 +63,7 @@ func (a *AbridgedReadWriteCloserWithAddr) Read(p []byte) (int, error) {
59 63
 		if _, err := io.CopyN(buf, a.conn, int64(msgLength32)); err != nil {
60 64
 			return errors.Annotate(err, "Cannot read message")
61 65
 		}
66
+		q = append(q, buf.Bytes()...)
62 67
 		a.Buffer.Write(buf.Bytes())
63 68
 
64 69
 		return nil
@@ -87,10 +92,9 @@ func (a *AbridgedReadWriteCloserWithAddr) Write(p []byte) (int, error) {
87 92
 		buf.Write(length24[:])
88 93
 		buf.Write(p)
89 94
 		return a.conn.Write(buf.Bytes())
90
-
91
-	default:
92
-		return 0, errors.Errorf("Packet is too big %d", len(p))
93 95
 	}
96
+
97
+	return 0, errors.Errorf("Packet is too big %d", len(p))
94 98
 }
95 99
 
96 100
 func (a *AbridgedReadWriteCloserWithAddr) Close() error {
@@ -105,6 +109,10 @@ func (a *AbridgedReadWriteCloserWithAddr) RemoteAddr() *net.TCPAddr {
105 109
 	return a.conn.RemoteAddr()
106 110
 }
107 111
 
112
+func (a *AbridgedReadWriteCloserWithAddr) SocketID() string {
113
+	return a.conn.SocketID()
114
+}
115
+
108 116
 func toUint24(number uint32) uint24 {
109 117
 	return uint24{byte(number), byte(number >> 8), byte(number >> 16)}
110 118
 }

+ 4
- 0
mtproto/wrappers/frame.go Zobrazit soubor

@@ -120,6 +120,10 @@ func (f *FrameRWC) RemoteAddr() *net.TCPAddr {
120 120
 	return f.conn.RemoteAddr()
121 121
 }
122 122
 
123
+func (f *FrameRWC) SocketID() string {
124
+	return f.conn.SocketID()
125
+}
126
+
123 127
 func NewFrameRWC(conn wrappers.ReadWriteCloserWithAddr, seqNo int32) wrappers.ReadWriteCloserWithAddr {
124 128
 	return &FrameRWC{
125 129
 		BufferedReader: wrappers.NewBufferedReader(),

+ 4
- 0
mtproto/wrappers/intermediate.go Zobrazit soubor

@@ -77,6 +77,10 @@ func (i *IntermediateReadWriteCloserWithAddr) RemoteAddr() *net.TCPAddr {
77 77
 	return i.conn.RemoteAddr()
78 78
 }
79 79
 
80
+func (i *IntermediateReadWriteCloserWithAddr) SocketID() string {
81
+	return i.conn.SocketID()
82
+}
83
+
80 84
 func NewIntermediateRWC(conn wrappers.ReadWriteCloserWithAddr, connOpts *mtproto.ConnectionOpts) wrappers.ReadWriteCloserWithAddr {
81 85
 	return &IntermediateReadWriteCloserWithAddr{
82 86
 		BufferedReader: wrappers.NewBufferedReader(),

+ 11
- 11
mtproto/wrappers/proxy_request.go Zobrazit soubor

@@ -10,6 +10,7 @@ import (
10 10
 
11 11
 	"github.com/9seconds/mtg/mtproto"
12 12
 	"github.com/9seconds/mtg/mtproto/rpc"
13
+	"github.com/9seconds/mtg/utils"
13 14
 	"github.com/9seconds/mtg/wrappers"
14 15
 )
15 16
 
@@ -29,7 +30,7 @@ func (p *ProxyRequestReadWriteCloserWithAddr) Read(buf []byte) (int, error) {
29 30
 
30 31
 		switch {
31 32
 		case bytes.Equal(ans, rpc.TagProxyAns):
32
-			return p.readProxyAns(buf)
33
+			return p.readProxyAns()
33 34
 		case bytes.Equal(ans, rpc.TagSimpleAck):
34 35
 			return p.readSimpleAck()
35 36
 		case bytes.Equal(ans, rpc.TagCloseExt):
@@ -44,21 +45,16 @@ func (p *ProxyRequestReadWriteCloserWithAddr) readCloseExt() error {
44 45
 	return errors.New("Connection has been closed remotely")
45 46
 }
46 47
 
47
-func (p *ProxyRequestReadWriteCloserWithAddr) readProxyAns(buf []byte) (err error) {
48
+func (p *ProxyRequestReadWriteCloserWithAddr) readProxyAns() (err error) {
48 49
 	if _, err = io.CopyN(ioutil.Discard, p.conn, 8+4); err != nil {
49 50
 		return errors.Annotate(err, "Cannot skip flags and connid")
50 51
 	}
51 52
 
52
-	n := len(buf)
53
-	preBuffer := &bytes.Buffer{}
54
-	for n == len(buf) {
55
-		n, err = p.conn.Read(buf)
56
-		if err != nil {
57
-			return errors.Annotate(err, "Cannot read proxy answer")
58
-		}
59
-		preBuffer.Write(buf[:n])
53
+	buf, err := utils.ReadCurrentData(p.conn)
54
+	if err != nil {
55
+		return errors.Annotate(err, "Cannot read proxy answer")
60 56
 	}
61
-	p.Buffer.Write(preBuffer.Bytes())
57
+	p.Buffer.Write(buf)
62 58
 
63 59
 	return nil
64 60
 }
@@ -97,6 +93,10 @@ func (p *ProxyRequestReadWriteCloserWithAddr) RemoteAddr() *net.TCPAddr {
97 93
 	return p.conn.RemoteAddr()
98 94
 }
99 95
 
96
+func (p *ProxyRequestReadWriteCloserWithAddr) SocketID() string {
97
+	return p.conn.SocketID()
98
+}
99
+
100 100
 func NewProxyRequestRWC(conn wrappers.ReadWriteCloserWithAddr, connOpts *mtproto.ConnectionOpts, adTag []byte) (wrappers.ReadWriteCloserWithAddr, error) {
101 101
 	req, err := rpc.NewProxyRequest(connOpts.ClientAddr, conn.LocalAddr(), connOpts, adTag)
102 102
 	if err != nil {

+ 10
- 16
proxy/server.go Zobrazit soubor

@@ -14,6 +14,7 @@ import (
14 14
 	"github.com/9seconds/mtg/config"
15 15
 	"github.com/9seconds/mtg/mtproto"
16 16
 	"github.com/9seconds/mtg/telegram"
17
+	"github.com/9seconds/mtg/utils"
17 18
 	"github.com/9seconds/mtg/wrappers"
18 19
 )
19 20
 
@@ -122,7 +123,7 @@ func (s *Server) accept(conn net.Conn) {
122 123
 }
123 124
 
124 125
 func (s *Server) getClientStream(ctx context.Context, cancel context.CancelFunc, conn net.Conn, socketID string) (*mtproto.ConnectionOpts, io.ReadWriteCloser, error) {
125
-	socket, connOpts, err := s.clientInit(conn, s.conf)
126
+	socket, connOpts, err := s.clientInit(conn, socketID, s.conf)
126 127
 	if err != nil {
127 128
 		return nil, nil, errors.Annotate(err, "Cannot init client connection")
128 129
 	}
@@ -135,7 +136,7 @@ func (s *Server) getClientStream(ctx context.Context, cancel context.CancelFunc,
135 136
 }
136 137
 
137 138
 func (s *Server) getTelegramStream(ctx context.Context, cancel context.CancelFunc, connOpts *mtproto.ConnectionOpts, socketID string) (io.ReadWriteCloser, error) {
138
-	conn, err := s.tg.Dial(connOpts)
139
+	conn, err := s.tg.Dial(socketID, connOpts)
139 140
 	if err != nil {
140 141
 		return nil, errors.Annotate(err, "Cannot connect to Telegram")
141 142
 	}
@@ -152,22 +153,15 @@ func (s *Server) getTelegramStream(ctx context.Context, cancel context.CancelFun
152 153
 	return conn, nil
153 154
 }
154 155
 
155
-func (s *Server) pump(src io.Reader, dst io.Writer, socketID, name string) (err error) {
156
-	copyBuf := make([]byte, 1024*1024*2)
157
-
158
-	n := config.BufferSizeCopy
159
-	for n == config.BufferSizeCopy {
160
-		n, err = src.Read(copyBuf)
161
-		if err != nil {
162
-			break
163
-		}
164
-		_, err = dst.Write(copyBuf[:n])
165
-		if err != nil {
166
-			break
167
-		}
156
+func (s *Server) pump(src io.Reader, dst io.Writer, socketID, name string) error {
157
+	buf, err := utils.ReadCurrentData(src)
158
+	if err != nil {
159
+		return errors.Annotate(err, "Cannot pump the socket")
168 160
 	}
169 161
 
170
-	return
162
+	_, err = dst.Write(buf)
163
+
164
+	return err
171 165
 }
172 166
 
173 167
 // NewServer creates new instance of MTPROTO proxy.

+ 2
- 2
telegram/dialer.go Zobrazit soubor

@@ -30,11 +30,11 @@ func (t *tgDialer) dial(addr string) (net.Conn, error) {
30 30
 	return conn, nil
31 31
 }
32 32
 
33
-func (t *tgDialer) dialRWC(addr string) (wrappers.ReadWriteCloserWithAddr, error) {
33
+func (t *tgDialer) dialRWC(addr, sock string) (wrappers.ReadWriteCloserWithAddr, error) {
34 34
 	conn, err := t.dial(addr)
35 35
 	if err != nil {
36 36
 		return nil, err
37 37
 	}
38 38
 
39
-	return wrappers.NewTimeoutRWC(conn, t.conf.PublicIPv4, t.conf.PublicIPv6), nil
39
+	return wrappers.NewTimeoutRWC(conn, sock, t.conf.PublicIPv4, t.conf.PublicIPv6), nil
40 40
 }

+ 2
- 2
telegram/direct.go Zobrazit soubor

@@ -33,7 +33,7 @@ type directTelegram struct {
33 33
 	baseTelegram
34 34
 }
35 35
 
36
-func (t *directTelegram) Dial(connOpts *mtproto.ConnectionOpts) (wrappers.ReadWriteCloserWithAddr, error) {
36
+func (t *directTelegram) Dial(sock string, connOpts *mtproto.ConnectionOpts) (wrappers.ReadWriteCloserWithAddr, error) {
37 37
 	dc := connOpts.DC
38 38
 	if dc < 0 {
39 39
 		dc = -dc
@@ -41,7 +41,7 @@ func (t *directTelegram) Dial(connOpts *mtproto.ConnectionOpts) (wrappers.ReadWr
41 41
 		dc = 1
42 42
 	}
43 43
 
44
-	return t.baseTelegram.dial(dc-1, connOpts.ConnectionProto)
44
+	return t.baseTelegram.dial(dc-1, sock, connOpts.ConnectionProto)
45 45
 }
46 46
 
47 47
 func (t *directTelegram) Init(connOpts *mtproto.ConnectionOpts, conn wrappers.ReadWriteCloserWithAddr) (wrappers.ReadWriteCloserWithAddr, error) {

+ 2
- 2
telegram/middle_caller.go Zobrazit soubor

@@ -39,7 +39,7 @@ type middleTelegramCaller struct {
39 39
 	httpClient  *http.Client
40 40
 }
41 41
 
42
-func (t *middleTelegramCaller) Dial(connOpts *mtproto.ConnectionOpts) (wrappers.ReadWriteCloserWithAddr, error) {
42
+func (t *middleTelegramCaller) Dial(sock string, connOpts *mtproto.ConnectionOpts) (wrappers.ReadWriteCloserWithAddr, error) {
43 43
 	dc := connOpts.DC
44 44
 	if dc == 0 {
45 45
 		dc = 1
@@ -47,7 +47,7 @@ func (t *middleTelegramCaller) Dial(connOpts *mtproto.ConnectionOpts) (wrappers.
47 47
 	t.dialerMutex.RLock()
48 48
 	defer t.dialerMutex.RUnlock()
49 49
 
50
-	return t.baseTelegram.dial(dc, connOpts.ConnectionProto)
50
+	return t.baseTelegram.dial(dc, sock, connOpts.ConnectionProto)
51 51
 }
52 52
 
53 53
 func (t *middleTelegramCaller) autoUpdate() {

+ 3
- 3
telegram/telegram.go Zobrazit soubor

@@ -13,7 +13,7 @@ import (
13 13
 // encapsulates logic of working with middleproxies or direct
14 14
 // connections.
15 15
 type Telegram interface {
16
-	Dial(*mtproto.ConnectionOpts) (wrappers.ReadWriteCloserWithAddr, error)
16
+	Dial(string, *mtproto.ConnectionOpts) (wrappers.ReadWriteCloserWithAddr, error)
17 17
 	Init(*mtproto.ConnectionOpts, wrappers.ReadWriteCloserWithAddr) (wrappers.ReadWriteCloserWithAddr, error)
18 18
 }
19 19
 
@@ -24,7 +24,7 @@ type baseTelegram struct {
24 24
 	v6Addresses map[int16][]string
25 25
 }
26 26
 
27
-func (b *baseTelegram) dial(dcIdx int16, proto mtproto.ConnectionProtocol) (wrappers.ReadWriteCloserWithAddr, error) {
27
+func (b *baseTelegram) dial(dcIdx int16, sock string, proto mtproto.ConnectionProtocol) (wrappers.ReadWriteCloserWithAddr, error) {
28 28
 	addrs := make([]string, 2)
29 29
 
30 30
 	if proto&mtproto.ConnectionProtocolIPv6 != 0 {
@@ -39,7 +39,7 @@ func (b *baseTelegram) dial(dcIdx int16, proto mtproto.ConnectionProtocol) (wrap
39 39
 	}
40 40
 
41 41
 	for _, addr := range addrs {
42
-		if conn, err := b.dialer.dialRWC(addr); err == nil {
42
+		if conn, err := b.dialer.dialRWC(addr, sock); err == nil {
43 43
 			return conn, err
44 44
 		}
45 45
 	}

+ 20
- 0
utils/read_current_data.go Zobrazit soubor

@@ -0,0 +1,20 @@
1
+package utils
2
+
3
+import "io"
4
+
5
+const readCurrentDataBufferSize = 1024 + 1
6
+
7
+func ReadCurrentData(src io.Reader) (rv []byte, err error) {
8
+	buf := make([]byte, readCurrentDataBufferSize)
9
+	n := readCurrentDataBufferSize
10
+
11
+	for n == len(buf) {
12
+		n, err = src.Read(buf)
13
+		if err != nil {
14
+			return nil, err
15
+		}
16
+		rv = append(rv, buf[:n]...)
17
+	}
18
+
19
+	return rv, nil
20
+}

+ 16
- 7
wrappers/blockcipherrwc.go Zobrazit soubor

@@ -1,12 +1,14 @@
1 1
 package wrappers
2 2
 
3 3
 import (
4
-	"bytes"
5 4
 	"crypto/aes"
6 5
 	"crypto/cipher"
6
+	"fmt"
7 7
 	"net"
8 8
 
9 9
 	"github.com/juju/errors"
10
+
11
+	"github.com/9seconds/mtg/utils"
10 12
 )
11 13
 
12 14
 type BlockCipherReadWriteCloserWithAddr struct {
@@ -19,16 +21,18 @@ type BlockCipherReadWriteCloserWithAddr struct {
19 21
 
20 22
 func (c *BlockCipherReadWriteCloserWithAddr) Read(p []byte) (int, error) {
21 23
 	return c.BufferedRead(p, func() error {
22
-		buf := &bytes.Buffer{}
23
-		for buf.Len()%aes.BlockSize != 0 || buf.Len() == 0 {
24
-			n, err := c.conn.Read(p)
24
+		var buf []byte
25
+
26
+		for len(buf) == 0 || len(buf)%aes.BlockSize != 0 {
27
+			rv, err := utils.ReadCurrentData(c.conn)
25 28
 			if err != nil {
26 29
 				return errors.Annotate(err, "Cannot read from socket")
27 30
 			}
28
-			buf.Write(p[:n])
31
+			buf = append(buf, rv...)
29 32
 		}
30
-		c.decryptor.CryptBlocks(buf.Bytes(), buf.Bytes())
31
-		c.Buffer.Write(buf.Bytes())
33
+
34
+		c.decryptor.CryptBlocks(buf, buf)
35
+		c.Buffer.Write(buf)
32 36
 
33 37
 		return nil
34 38
 	})
@@ -46,6 +50,7 @@ func (c *BlockCipherReadWriteCloserWithAddr) Write(p []byte) (int, error) {
46 50
 }
47 51
 
48 52
 func (c *BlockCipherReadWriteCloserWithAddr) Close() error {
53
+	fmt.Println("BlockCipherReadWriteCloserWithAddr closes", "sockid", c.SocketID(), "bufsize", c.Buffer.Len())
49 54
 	return c.conn.Close()
50 55
 }
51 56
 
@@ -57,6 +62,10 @@ func (c *BlockCipherReadWriteCloserWithAddr) RemoteAddr() *net.TCPAddr {
57 62
 	return c.conn.RemoteAddr()
58 63
 }
59 64
 
65
+func (c *BlockCipherReadWriteCloserWithAddr) SocketID() string {
66
+	return c.conn.SocketID()
67
+}
68
+
60 69
 func NewBlockCipherRWC(conn ReadWriteCloserWithAddr, encryptor, decryptor cipher.BlockMode) ReadWriteCloserWithAddr {
61 70
 	return &BlockCipherReadWriteCloserWithAddr{
62 71
 		BufferedReader: NewBufferedReader(),

+ 10
- 2
wrappers/buffered_reader.go Zobrazit soubor

@@ -1,11 +1,19 @@
1 1
 package wrappers
2 2
 
3
-import "bytes"
3
+import (
4
+	"bytes"
5
+
6
+	"github.com/juju/errors"
7
+)
4 8
 
5 9
 type BufferedReader struct {
6 10
 	Buffer *bytes.Buffer
7 11
 }
8 12
 
13
+var (
14
+	BufferedReaderContinue = errors.New("Please continue reading")
15
+)
16
+
9 17
 func (b *BufferedReader) BufferedRead(p []byte, callback func() error) (int, error) {
10 18
 	if b.Buffer.Len() > 0 {
11 19
 		return b.flush(p)
@@ -17,7 +25,7 @@ func (b *BufferedReader) BufferedRead(p []byte, callback func() error) (int, err
17 25
 }
18 26
 
19 27
 func (b *BufferedReader) flush(p []byte) (int, error) {
20
-	if b.Buffer.Len() < len(p) {
28
+	if b.Buffer.Len() <= len(p) {
21 29
 		sizeToReturn := b.Buffer.Len()
22 30
 		copy(p, b.Buffer.Bytes())
23 31
 		b.Buffer.Reset()

+ 4
- 0
wrappers/ctxrwc.go Zobrazit soubor

@@ -56,6 +56,10 @@ func (c *CtxReadWriteCloserWithAddr) RemoteAddr() *net.TCPAddr {
56 56
 	return c.conn.RemoteAddr()
57 57
 }
58 58
 
59
+func (c *CtxReadWriteCloserWithAddr) SocketID() string {
60
+	return c.conn.SocketID()
61
+}
62
+
59 63
 // NewCtxRWC returns ReadWriteCloser which respects given context,
60 64
 // cancellation etc.
61 65
 func NewCtxRWC(ctx context.Context, cancel context.CancelFunc, conn ReadWriteCloserWithAddr) ReadWriteCloserWithAddr {

+ 6
- 2
wrappers/logrwc.go Zobrazit soubor

@@ -18,14 +18,14 @@ type LogReadWriteCloserWithAddr struct {
18 18
 // Read reads from connection
19 19
 func (l *LogReadWriteCloserWithAddr) Read(p []byte) (n int, err error) {
20 20
 	n, err = l.conn.Read(p)
21
-	l.logger.Debugw("Finish reading", "name", l.name, "socketid", l.sockid, "nbytes", n, "error", err)
21
+	l.logger.Debugw("Finish reading", "name", l.name, "socketid", l.sockid, "nbytes", n, "error", err, "localAddr", l.LocalAddr())
22 22
 	return
23 23
 }
24 24
 
25 25
 // Write writes into connection.
26 26
 func (l *LogReadWriteCloserWithAddr) Write(p []byte) (n int, err error) {
27 27
 	n, err = l.conn.Write(p)
28
-	l.logger.Debugw("Finish writing", "name", l.name, "socketid", l.sockid, "nbytes", n, "error", err)
28
+	l.logger.Debugw("Finish writing", "name", l.name, "socketid", l.sockid, "nbytes", n, "error", err, "localAddr", l.LocalAddr())
29 29
 	return
30 30
 }
31 31
 
@@ -44,6 +44,10 @@ func (l *LogReadWriteCloserWithAddr) RemoteAddr() *net.TCPAddr {
44 44
 	return l.conn.RemoteAddr()
45 45
 }
46 46
 
47
+func (l *LogReadWriteCloserWithAddr) SocketID() string {
48
+	return l.sockid
49
+}
50
+
47 51
 // NewLogRWC wraps ReadWriteCloser with logger calls.
48 52
 func NewLogRWC(conn ReadWriteCloserWithAddr, logger *zap.SugaredLogger, sockid string, name string) ReadWriteCloserWithAddr {
49 53
 	return &LogReadWriteCloserWithAddr{

+ 1
- 0
wrappers/rwcaddr.go Zobrazit soubor

@@ -10,4 +10,5 @@ type ReadWriteCloserWithAddr interface {
10 10
 
11 11
 	LocalAddr() *net.TCPAddr
12 12
 	RemoteAddr() *net.TCPAddr
13
+	SocketID() string
13 14
 }

+ 4
- 0
wrappers/streamcipherrwc.go Zobrazit soubor

@@ -51,6 +51,10 @@ func (c *StreamCipherReadWriteCloserWithAddr) RemoteAddr() *net.TCPAddr {
51 51
 	return c.conn.RemoteAddr()
52 52
 }
53 53
 
54
+func (c *StreamCipherReadWriteCloserWithAddr) SocketID() string {
55
+	return c.conn.SocketID()
56
+}
57
+
54 58
 // NewStreamCipherRWC returns wrapper which transparently
55 59
 // encrypts/decrypts traffic with obfuscated2 protocol.
56 60
 func NewStreamCipherRWC(conn ReadWriteCloserWithAddr, encryptor, decryptor cipher.Stream) ReadWriteCloserWithAddr {

+ 7
- 1
wrappers/timeoutrwc.go Zobrazit soubor

@@ -9,6 +9,7 @@ import (
9 9
 
10 10
 type TimeoutReadWriteCloserWithAddr struct {
11 11
 	conn       net.Conn
12
+	sock       string
12 13
 	publicIPv4 net.IP
13 14
 	publicIPv6 net.IP
14 15
 }
@@ -46,10 +47,15 @@ func (t *TimeoutReadWriteCloserWithAddr) LocalAddr() *net.TCPAddr {
46 47
 	return &newAddr
47 48
 }
48 49
 
49
-func NewTimeoutRWC(conn net.Conn, ipv4, ipv6 net.IP) ReadWriteCloserWithAddr {
50
+func (t *TimeoutReadWriteCloserWithAddr) SocketID() string {
51
+	return t.sock
52
+}
53
+
54
+func NewTimeoutRWC(conn net.Conn, sock string, ipv4, ipv6 net.IP) ReadWriteCloserWithAddr {
50 55
 	return &TimeoutReadWriteCloserWithAddr{
51 56
 		conn:       conn,
52 57
 		publicIPv4: ipv4,
53 58
 		publicIPv6: ipv6,
59
+		sock:       sock,
54 60
 	}
55 61
 }

+ 4
- 0
wrappers/trafficrwc.go Zobrazit soubor

@@ -37,6 +37,10 @@ func (t *TrafficReadWriteCloserWithAddr) RemoteAddr() *net.TCPAddr {
37 37
 	return t.conn.RemoteAddr()
38 38
 }
39 39
 
40
+func (t *TrafficReadWriteCloserWithAddr) SocketID() string {
41
+	return t.conn.SocketID()
42
+}
43
+
40 44
 // NewTrafficRWC wraps ReadWriteCloser to have read/write callbacks.
41 45
 func NewTrafficRWC(conn ReadWriteCloserWithAddr, readCallback, writeCallback func(int)) ReadWriteCloserWithAddr {
42 46
 	return &TrafficReadWriteCloserWithAddr{

Načítá se…
Zrušit
Uložit