| skipped 2 lines |
3 | 3 | | import ( |
4 | 4 | | "bufio" |
5 | 5 | | "context" |
6 | | - | "github.com/DVKunion/SeaMoon/pkg/consts" |
7 | | - | "github.com/DVKunion/SeaMoon/pkg/server" |
8 | | - | "github.com/DVKunion/SeaMoon/pkg/utils" |
9 | | - | "github.com/gorilla/websocket" |
10 | | - | log "github.com/sirupsen/logrus" |
11 | 6 | | "net" |
12 | 7 | | "net/http" |
13 | 8 | | "strings" |
| 9 | + | "sync" |
| 10 | + | |
| 11 | + | "github.com/gorilla/websocket" |
| 12 | + | log "github.com/sirupsen/logrus" |
| 13 | + | |
| 14 | + | "github.com/DVKunion/SeaMoon/pkg/consts" |
| 15 | + | "github.com/DVKunion/SeaMoon/pkg/server" |
| 16 | + | "github.com/DVKunion/SeaMoon/pkg/utils" |
14 | 17 | | ) |
15 | 18 | | |
16 | 19 | | type bufferedConn struct { |
| skipped 53 lines |
70 | 73 | | }() |
71 | 74 | | go func() { |
72 | 75 | | for { |
| 76 | + | lock := &sync.Mutex{} |
73 | 77 | | conn, err := server.Accept() |
74 | 78 | | if err == nil { |
75 | 79 | | log.Debugf(consts.SOCKS5_ACCEPT_START, conn.RemoteAddr()) |
| skipped 3 lines |
79 | 83 | | log.Errorf(consts.CLIENT_PROTOCOL_UNSUPPORT_ERROR, err) |
80 | 84 | | return |
81 | 85 | | } |
82 | | - | go Socks5Handler(&bufferedConn{conn, br}, proxyAddr) |
| 86 | + | go Socks5Handler(&bufferedConn{conn, br}, proxyAddr, lock) |
83 | 87 | | } else { |
84 | 88 | | if closeFlag { |
85 | 89 | | // except close |
| skipped 7 lines |
93 | 97 | | <-ctx.Done() |
94 | 98 | | } |
95 | 99 | | |
96 | | - | func Socks5Handler(conn net.Conn, raddr string) { |
| 100 | + | func Socks5Handler(conn net.Conn, raddr string, lock *sync.Mutex) { |
97 | 101 | | // select method |
98 | 102 | | _, err := utils.ReadMethods(conn) |
99 | 103 | | if err != nil { |
| skipped 19 lines |
119 | 123 | | } |
120 | 124 | | switch request.Cmd { |
121 | 125 | | case utils.CmdConnect: |
122 | | - | handleConnect(conn, request, raddr) |
| 126 | + | handleConnect(conn, request, raddr, lock) |
123 | 127 | | break |
124 | 128 | | case utils.CmdBind: |
125 | 129 | | log.Error("not support cmd bind") |
| skipped 6 lines |
132 | 136 | | } |
133 | 137 | | } |
134 | 138 | | |
135 | | - | func handleConnect(conn net.Conn, req *utils.Request, rAddr string) { |
| 139 | + | func handleConnect(conn net.Conn, req *utils.Request, rAddr string, lock *sync.Mutex) { |
136 | 140 | | |
137 | 141 | | log.Infof(consts.SOCKS5_CONNECT_SERVER, req.Addr, conn.RemoteAddr()) |
138 | 142 | | |
| skipped 8 lines |
147 | 151 | | return |
148 | 152 | | } |
149 | 153 | | |
150 | | - | newConn := server.NewWebsocketServer(wsConn) |
| 154 | + | newConn := server.NewWebsocketServer(wsConn, lock) |
151 | 155 | | |
152 | 156 | | defer newConn.Close() |
153 | 157 | | |
| skipped 14 lines |