Skip to content
This repository was archived by the owner on Aug 27, 2020. It is now read-only.

Commit 10b22e9

Browse files
committed
client web ui
2 parents 3ed8f13 + 9a782f9 commit 10b22e9

File tree

17 files changed

+604
-315
lines changed

17 files changed

+604
-315
lines changed

config/config.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package config
22

33
import (
4+
"github.com/lzjluzijie/websocks/core/client"
45
"github.com/urfave/cli"
56
)
67

@@ -43,7 +44,7 @@ var Command = cli.Command{
4344
Usage: "InsecureSkipVerify: true",
4445
},
4546
},
46-
Action: GenerateClientConfig,
47+
Action: client.GenerateClientConfig,
4748
},
4849
{
4950
Name: "server",

config/server.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77

88
"github.com/gorilla/websocket"
99
"github.com/lzjluzijie/websocks/core"
10-
"github.com/pkg/errors"
1110
"github.com/urfave/cli"
1211
)
1312

@@ -47,10 +46,10 @@ func GenerateServerConfig(c *cli.Context) (err error) {
4746
keyPath := c.String("key")
4847
reverseProxy := c.String("reverse-proxy")
4948

50-
if []byte(pattern)[0] != '/' {
51-
err = errors.New("pattern does not start with '/'")
52-
return
53-
}
49+
//if []byte(pattern)[0] != '/' {
50+
// err = errors.New("pattern does not start with '/'")
51+
// return
52+
//}
5453

5554
config := &core.ServerConfig{
5655
Pattern: pattern,

core/client.go

Lines changed: 0 additions & 136 deletions
This file was deleted.

core/client/client.go

Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
package client
2+
3+
import (
4+
"io"
5+
"net"
6+
"time"
7+
8+
"net/url"
9+
10+
"crypto/tls"
11+
12+
"github.com/gorilla/websocket"
13+
"github.com/lzjluzijie/websocks/core"
14+
"github.com/sirupsen/logrus"
15+
)
16+
17+
var log = logrus.New()
18+
19+
type WebSocksClientConfig struct {
20+
ListenAddr string
21+
ServerURL string
22+
23+
SNI string
24+
InsecureCert bool
25+
26+
Mux bool
27+
}
28+
29+
type WebSocksClient struct {
30+
ServerURL *url.URL
31+
ListenAddr *net.TCPAddr
32+
Dialer *websocket.Dialer
33+
muxWS *core.MuxWebSocket
34+
35+
//todo enable mux
36+
Mux bool
37+
38+
stopC chan int
39+
40+
//statistics
41+
CreatedAt time.Time
42+
}
43+
44+
func NewWebSocksClient(config *WebSocksClientConfig) (client *WebSocksClient) {
45+
serverURL, err := url.Parse(config.ServerURL)
46+
if err != nil {
47+
return
48+
}
49+
50+
laddr, err := net.ResolveTCPAddr("tcp", config.ListenAddr)
51+
if err != nil {
52+
return
53+
}
54+
55+
tlsConfig := &tls.Config{
56+
InsecureSkipVerify: config.InsecureCert,
57+
ServerName: config.SNI,
58+
}
59+
60+
client = &WebSocksClient{
61+
ServerURL: serverURL,
62+
ListenAddr: laddr,
63+
Dialer: &websocket.Dialer{
64+
ReadBufferSize: 4 * 1024,
65+
WriteBufferSize: 4 * 1024,
66+
HandshakeTimeout: 10 * time.Second,
67+
TLSClientConfig: tlsConfig,
68+
},
69+
70+
CreatedAt: time.Now(),
71+
}
72+
73+
return
74+
}
75+
76+
func (client *WebSocksClient) Listen() (err error) {
77+
listener, err := net.ListenTCP("tcp", client.ListenAddr)
78+
if err != nil {
79+
return err
80+
}
81+
82+
log.Infof("Start to listen at %s", client.ListenAddr.String())
83+
84+
defer listener.Close()
85+
86+
if client.Mux {
87+
err := client.OpenMux()
88+
if err != nil {
89+
log.Debugf(err.Error())
90+
return err
91+
}
92+
93+
go client.ListenMuxWS(client.muxWS)
94+
}
95+
96+
go func() {
97+
client.stopC = make(chan int)
98+
<-client.stopC
99+
err = listener.Close()
100+
if err != nil {
101+
log.Errorf(err.Error())
102+
return
103+
}
104+
105+
log.Infof("stopped")
106+
}()
107+
108+
for {
109+
conn, err := listener.AcceptTCP()
110+
if err != nil {
111+
log.Debugf(err.Error())
112+
break
113+
}
114+
115+
go client.handleConn(conn)
116+
}
117+
return nil
118+
}
119+
120+
func (client *WebSocksClient) Stop() {
121+
client.stopC <- 1911
122+
return
123+
}
124+
125+
func (client *WebSocksClient) handleConn(conn *net.TCPConn) {
126+
defer conn.Close()
127+
128+
conn.SetLinger(0)
129+
130+
err := handShake(conn)
131+
if err != nil {
132+
log.Debugf(err.Error())
133+
return
134+
}
135+
136+
_, host, err := getRequest(conn)
137+
if err != nil {
138+
log.Debugf(err.Error())
139+
return
140+
}
141+
142+
_, err = conn.Write([]byte{0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x43})
143+
if err != nil {
144+
log.Debugf(err.Error())
145+
return
146+
}
147+
148+
if client.Mux {
149+
client.DialMuxConn(host, conn)
150+
} else {
151+
client.DialWSConn(host, conn)
152+
}
153+
154+
return
155+
}
156+
157+
func (client *WebSocksClient) DialWSConn(host string, conn *net.TCPConn) {
158+
wsConn, _, err := client.Dialer.Dial(client.ServerURL.String(), map[string][]string{
159+
"WebSocks-Host": {host},
160+
})
161+
162+
if err != nil {
163+
log.Errorf(err.Error())
164+
return
165+
}
166+
defer wsConn.Close()
167+
168+
log.Debugf("dialed ws for %s", host)
169+
170+
ws := core.NewWebSocket(wsConn)
171+
172+
go func() {
173+
_, err = io.Copy(ws, conn)
174+
if err != nil {
175+
log.Debugf(err.Error())
176+
return
177+
}
178+
return
179+
}()
180+
181+
_, err = io.Copy(conn, ws)
182+
if err != nil {
183+
log.Debugf(err.Error())
184+
return
185+
}
186+
return
187+
}

0 commit comments

Comments
 (0)