-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathproto_test.go
More file actions
96 lines (87 loc) · 1.84 KB
/
proto_test.go
File metadata and controls
96 lines (87 loc) · 1.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package main
import (
"context"
"crypto/tls"
"net"
"os"
"testing"
"github.com/fangdingjun/go-log/v5"
"github.com/fangdingjun/protolistener"
yaml "gopkg.in/yaml.v2"
)
func TestProxyProto(t *testing.T) {
log.Default.Level = log.DEBUG
data, err := os.ReadFile("config.sample.yaml")
if err != nil {
log.Fatal(err)
}
if err = yaml.Unmarshal(data, &cfg); err != nil {
log.Fatal(err)
}
listener, err := net.Listen("tcp", "127.0.0.1:0")
if err != nil {
t.Fatal(err)
}
defer listener.Close()
log.Printf("listen %s", listener.Addr().String())
go func() {
for {
conn, err := listener.Accept()
if err != nil {
return
}
go serve(context.Background(), conn)
}
}()
cert, err := tls.LoadX509KeyPair("server.crt", "server.key")
if err != nil {
t.Fatal(err)
}
listener2, err := net.Listen("tcp", "127.0.0.1:8443")
if err != nil {
t.Fatal(err)
}
defer listener2.Close()
listener2 = tls.NewListener(protolistener.New(listener2), &tls.Config{
Certificates: []tls.Certificate{cert},
})
go func() {
for {
conn, err := listener2.Accept()
if err != nil {
return
}
go func(c net.Conn) {
defer c.Close()
addr := conn.RemoteAddr()
_conn := c.(*tls.Conn)
if err := _conn.Handshake(); err != nil {
log.Errorf("handshake error: %s", err)
return
}
conn.Write([]byte(addr.String()))
}(conn)
}
}()
conn, err := tls.Dial("tcp", listener.Addr().String(), &tls.Config{
ServerName: "www.example.com",
InsecureSkipVerify: true,
})
if err != nil {
log.Println("dial error")
t.Fatal(err)
}
conn.Handshake()
buf := make([]byte, 200)
n, err := conn.Read(buf)
if err != nil {
log.Println("read error")
t.Fatal(err)
}
addr1 := conn.LocalAddr().String()
addr2 := string(buf[:n])
conn.Close()
if addr1 != addr2 {
t.Errorf("expect %s, got: %s", addr1, addr2)
}
}