Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
G
gost
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nanahira
gost
Commits
4309ea67
Commit
4309ea67
authored
Oct 11, 2015
by
ginuerzh
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
forward now works
parent
e19ff132
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
61 additions
and
56 deletions
+61
-56
conn.go
conn.go
+38
-47
http.go
http.go
+1
-2
socks.go
socks.go
+22
-7
No files found.
conn.go
View file @
4309ea67
...
@@ -92,7 +92,8 @@ func handleConn(conn net.Conn, arg Args) {
...
@@ -92,7 +92,8 @@ func handleConn(conn net.Conn, arg Args) {
selector
:=
&
serverSelector
{
selector
:=
&
serverSelector
{
methods
:
[]
uint8
{
methods
:
[]
uint8
{
gosocks5
.
MethodNoAuth
,
gosocks5
.
MethodUserPass
,
gosocks5
.
MethodNoAuth
,
gosocks5
.
MethodUserPass
,
},
},
arg
:
arg
,
arg
:
arg
,
}
}
...
@@ -215,32 +216,40 @@ func connect(connType, addr string) (conn net.Conn, err error) {
...
@@ -215,32 +216,40 @@ func connect(connType, addr string) (conn net.Conn, err error) {
addr
+=
":80"
addr
+=
":80"
}
}
if
len
(
proxyArgs
)
>
0
&&
len
(
forwardArgs
)
>
0
{
return
connectProxyForward
(
connType
,
addr
,
proxyArgs
[
0
],
forwardArgs
[
0
])
}
if
len
(
forwardArgs
)
>
0
{
if
len
(
forwardArgs
)
>
0
{
// TODO: multi-foward
// TODO: multi-foward
forward
:=
forwardArgs
[
0
]
forward
:=
forwardArgs
[
0
]
return
connectForward
(
addr
,
forward
)
return
connectForward
(
connType
,
addr
,
forward
)
}
}
if
len
(
proxyArgs
)
>
0
{
if
len
(
proxyArgs
)
>
0
{
proxy
:=
proxyArgs
[
0
]
proxy
:=
proxyArgs
[
0
]
return
connect
Proxy
(
connType
,
addr
,
proxy
)
return
connect
Forward
(
connType
,
addr
,
proxy
)
}
}
return
net
.
Dial
(
"tcp"
,
addr
)
return
net
.
Dial
(
"tcp"
,
addr
)
}
}
func
connectProxy
(
connType
,
addr
string
,
proxy
Args
)
(
conn
net
.
Conn
,
err
error
)
{
func
connectProxyForward
(
connType
,
addr
string
,
proxy
,
forward
Args
)
(
conn
net
.
Conn
,
err
error
)
{
return
nil
,
errors
.
New
(
"Not implemented"
)
}
func
connectForward
(
connType
,
addr
string
,
forward
Args
)
(
conn
net
.
Conn
,
err
error
)
{
if
glog
.
V
(
LINFO
)
{
if
glog
.
V
(
LINFO
)
{
glog
.
Infoln
(
"connect proxy:"
,
proxy
.
Addr
)
glog
.
Infoln
(
forward
.
Protocol
,
"forward:"
,
forward
.
Addr
)
}
}
conn
,
err
=
net
.
Dial
(
"tcp"
,
proxy
.
Addr
)
conn
,
err
=
net
.
Dial
(
"tcp"
,
forward
.
Addr
)
if
err
!=
nil
{
if
err
!=
nil
{
return
return
}
}
switch
proxy
.
Transport
{
switch
forward
.
Transport
{
case
"ws"
:
// websocket connection
case
"ws"
:
// websocket connection
c
,
err
:=
wsClient
(
conn
,
proxy
.
Addr
)
c
,
err
:=
wsClient
(
conn
,
forward
.
Addr
)
if
err
!=
nil
{
if
err
!=
nil
{
conn
.
Close
()
conn
.
Close
()
return
nil
,
err
return
nil
,
err
...
@@ -253,16 +262,16 @@ func connectProxy(connType, addr string, proxy Args) (conn net.Conn, err error)
...
@@ -253,16 +262,16 @@ func connectProxy(connType, addr string, proxy Args) (conn net.Conn, err error)
default
:
default
:
}
}
switch
proxy
.
Protocol
{
switch
forward
.
Protocol
{
case
"ss"
:
// shadowsocks
case
"ss"
:
// shadowsocks
conn
.
Close
()
conn
.
Close
()
return
nil
,
errors
.
New
(
"Not implemented"
)
return
nil
,
errors
.
New
(
"Not implemented"
)
case
"socks"
,
"socks5"
:
case
"socks"
,
"socks5"
:
selector
:=
&
clientSelector
{
selector
:=
&
clientSelector
{
methods
:
[]
uint8
{
gosocks5
.
MethodNoAuth
,
gosocks5
.
MethodUserPass
},
methods
:
[]
uint8
{
gosocks5
.
MethodNoAuth
,
gosocks5
.
MethodUserPass
},
arg
:
proxy
,
arg
:
forward
,
}
}
if
proxy
.
EncMeth
==
"tls"
{
if
forward
.
EncMeth
==
"tls"
{
selector
.
methods
=
[]
uint8
{
MethodTLS
,
MethodTLSAuth
}
selector
.
methods
=
[]
uint8
{
MethodTLS
,
MethodTLSAuth
}
}
}
c
:=
gosocks5
.
ClientConn
(
conn
,
selector
)
c
:=
gosocks5
.
ClientConn
(
conn
,
selector
)
...
@@ -272,40 +281,26 @@ func connectProxy(connType, addr string, proxy Args) (conn net.Conn, err error)
...
@@ -272,40 +281,26 @@ func connectProxy(connType, addr string, proxy Args) (conn net.Conn, err error)
}
}
conn
=
c
conn
=
c
if
connType
==
ConnHttp
||
connType
==
ConnHttpConnect
{
host
,
port
,
_
:=
net
.
SplitHostPort
(
addr
)
host
,
port
,
_
:=
net
.
SplitHostPort
(
addr
)
p
,
_
:=
strconv
.
ParseUint
(
port
,
10
,
16
)
p
,
_
:=
strconv
.
ParseUint
(
port
,
10
,
16
)
r
:=
gosocks5
.
NewRequest
(
gosocks5
.
CmdConnect
,
&
gosocks5
.
Addr
{
r
:=
gosocks5
.
NewRequest
(
gosocks5
.
CmdConnect
,
&
gosocks5
.
Addr
{
Type
:
gosocks5
.
AddrDomain
,
Type
:
gosocks5
.
AddrDomain
,
Host
:
host
,
Host
:
host
,
Port
:
uint16
(
p
),
Port
:
uint16
(
p
),
})
})
rep
,
err
:=
requestSocks5
(
conn
,
r
)
if
glog
.
V
(
LDEBUG
)
{
if
err
!=
nil
{
glog
.
Infoln
(
r
.
String
())
conn
.
Close
()
}
return
nil
,
err
if
err
:=
r
.
Write
(
conn
);
err
!=
nil
{
}
conn
.
Close
()
if
rep
.
Rep
!=
gosocks5
.
Succeeded
{
return
nil
,
err
conn
.
Close
()
}
return
nil
,
errors
.
New
(
"Service unavailable"
)
rep
,
err
:=
gosocks5
.
ReadReply
(
conn
)
if
err
!=
nil
{
conn
.
Close
()
return
nil
,
err
}
if
glog
.
V
(
LDEBUG
)
{
glog
.
Infoln
(
rep
.
String
())
}
if
rep
.
Rep
!=
gosocks5
.
Succeeded
{
conn
.
Close
()
return
nil
,
errors
.
New
(
"Service unavailable"
)
}
}
}
case
"http"
:
case
"http"
:
fallthrough
fallthrough
default
:
default
:
if
connType
==
ConnHttpConnect
{
if
connType
==
ConnHttpConnect
||
connType
==
ConnSocks5
{
req
:=
&
http
.
Request
{
req
:=
&
http
.
Request
{
Method
:
"CONNECT"
,
Method
:
"CONNECT"
,
URL
:
&
url
.
URL
{
Host
:
addr
},
URL
:
&
url
.
URL
{
Host
:
addr
},
...
@@ -315,9 +310,9 @@ func connectProxy(connType, addr string, proxy Args) (conn net.Conn, err error)
...
@@ -315,9 +310,9 @@ func connectProxy(connType, addr string, proxy Args) (conn net.Conn, err error)
Header
:
make
(
http
.
Header
),
Header
:
make
(
http
.
Header
),
}
}
req
.
Header
.
Set
(
"Proxy-Connection"
,
"keep-alive"
)
req
.
Header
.
Set
(
"Proxy-Connection"
,
"keep-alive"
)
if
proxy
.
User
!=
nil
{
if
forward
.
User
!=
nil
{
req
.
Header
.
Set
(
"Proxy-Authorization"
,
req
.
Header
.
Set
(
"Proxy-Authorization"
,
"Basic "
+
base64
.
StdEncoding
.
EncodeToString
([]
byte
(
proxy
.
User
.
String
())))
"Basic "
+
base64
.
StdEncoding
.
EncodeToString
([]
byte
(
forward
.
User
.
String
())))
}
}
if
err
=
req
.
Write
(
conn
);
err
!=
nil
{
if
err
=
req
.
Write
(
conn
);
err
!=
nil
{
conn
.
Close
()
conn
.
Close
()
...
@@ -347,7 +342,3 @@ func connectProxy(connType, addr string, proxy Args) (conn net.Conn, err error)
...
@@ -347,7 +342,3 @@ func connectProxy(connType, addr string, proxy Args) (conn net.Conn, err error)
return
return
}
}
func
connectForward
(
addr
string
,
forward
Args
)
(
net
.
Conn
,
error
)
{
return
nil
,
errors
.
New
(
"Not implemented"
)
}
http.go
View file @
4309ea67
...
@@ -80,7 +80,7 @@ func handleHttpRequest(req *http.Request, conn net.Conn, arg Args) {
...
@@ -80,7 +80,7 @@ func handleHttpRequest(req *http.Request, conn net.Conn, arg Args) {
return
return
}
}
}
else
{
}
else
{
if
len
(
proxyArgs
)
>
0
{
if
len
(
proxyArgs
)
>
0
||
len
(
forwardArgs
)
>
0
{
err
=
req
.
WriteProxy
(
c
)
err
=
req
.
WriteProxy
(
c
)
}
else
{
}
else
{
err
=
req
.
Write
(
c
)
err
=
req
.
Write
(
c
)
...
@@ -92,7 +92,6 @@ func handleHttpRequest(req *http.Request, conn net.Conn, arg Args) {
...
@@ -92,7 +92,6 @@ func handleHttpRequest(req *http.Request, conn net.Conn, arg Args) {
return
return
}
}
}
}
Transport
(
conn
,
c
)
Transport
(
conn
,
c
)
}
}
...
...
socks.go
View file @
4309ea67
...
@@ -85,7 +85,7 @@ func (selector *serverSelector) Methods() []uint8 {
...
@@ -85,7 +85,7 @@ func (selector *serverSelector) Methods() []uint8 {
func
(
selector
*
serverSelector
)
Select
(
methods
...
uint8
)
(
method
uint8
)
{
func
(
selector
*
serverSelector
)
Select
(
methods
...
uint8
)
(
method
uint8
)
{
if
glog
.
V
(
LDEBUG
)
{
if
glog
.
V
(
LDEBUG
)
{
glog
.
Infof
(
"%
x %x % x
"
,
gosocks5
.
Ver5
,
len
(
methods
),
methods
)
glog
.
Infof
(
"%
d %d % d
"
,
gosocks5
.
Ver5
,
len
(
methods
),
methods
)
}
}
method
=
gosocks5
.
MethodNoAcceptable
method
=
gosocks5
.
MethodNoAcceptable
...
@@ -94,11 +94,12 @@ func (selector *serverSelector) Select(methods ...uint8) (method uint8) {
...
@@ -94,11 +94,12 @@ func (selector *serverSelector) Select(methods ...uint8) (method uint8) {
for
_
,
mm
:=
range
selector
.
methods
{
for
_
,
mm
:=
range
selector
.
methods
{
if
m
==
mm
{
if
m
==
mm
{
method
=
m
method
=
m
break
goto
out
}
}
}
}
}
}
out
:
if
method
==
gosocks5
.
MethodNoAcceptable
{
if
method
==
gosocks5
.
MethodNoAcceptable
{
return
return
}
}
...
@@ -117,7 +118,7 @@ func (selector *serverSelector) Select(methods ...uint8) (method uint8) {
...
@@ -117,7 +118,7 @@ func (selector *serverSelector) Select(methods ...uint8) (method uint8) {
func
(
selector
*
serverSelector
)
OnSelected
(
method
uint8
,
conn
net
.
Conn
)
(
net
.
Conn
,
error
)
{
func
(
selector
*
serverSelector
)
OnSelected
(
method
uint8
,
conn
net
.
Conn
)
(
net
.
Conn
,
error
)
{
if
glog
.
V
(
LDEBUG
)
{
if
glog
.
V
(
LDEBUG
)
{
glog
.
Infof
(
"%
x %x
"
,
gosocks5
.
Ver5
,
method
)
glog
.
Infof
(
"%
d %d
"
,
gosocks5
.
Ver5
,
method
)
}
}
switch
method
{
switch
method
{
...
@@ -178,6 +179,23 @@ func (selector *serverSelector) OnSelected(method uint8, conn net.Conn) (net.Con
...
@@ -178,6 +179,23 @@ func (selector *serverSelector) OnSelected(method uint8, conn net.Conn) (net.Con
return
conn
,
nil
return
conn
,
nil
}
}
func
requestSocks5
(
conn
net
.
Conn
,
req
*
gosocks5
.
Request
)
(
*
gosocks5
.
Reply
,
error
)
{
if
err
:=
req
.
Write
(
conn
);
err
!=
nil
{
return
nil
,
err
}
if
glog
.
V
(
LDEBUG
)
{
glog
.
Infoln
(
req
.
String
())
}
rep
,
err
:=
gosocks5
.
ReadReply
(
conn
)
if
err
!=
nil
{
return
nil
,
err
}
if
glog
.
V
(
LDEBUG
)
{
glog
.
Infoln
(
rep
.
String
())
}
return
rep
,
nil
}
func
handleSocks5Request
(
req
*
gosocks5
.
Request
,
conn
net
.
Conn
,
arg
Args
)
{
func
handleSocks5Request
(
req
*
gosocks5
.
Request
,
conn
net
.
Conn
,
arg
Args
)
{
if
glog
.
V
(
LDEBUG
)
{
if
glog
.
V
(
LDEBUG
)
{
glog
.
Infoln
(
req
)
glog
.
Infoln
(
req
)
...
@@ -218,10 +236,7 @@ func handleSocks5Request(req *gosocks5.Request, conn net.Conn, arg Args) {
...
@@ -218,10 +236,7 @@ func handleSocks5Request(req *gosocks5.Request, conn net.Conn, arg Args) {
glog
.
Infoln
(
rep
)
glog
.
Infoln
(
rep
)
}
}
}
}
Transport
(
conn
,
tconn
)
if
err
:=
Transport
(
conn
,
tconn
);
err
!=
nil
{
//log.Println(err)
}
case
gosocks5
.
CmdBind
:
case
gosocks5
.
CmdBind
:
l
,
err
:=
net
.
ListenTCP
(
"tcp"
,
nil
)
l
,
err
:=
net
.
ListenTCP
(
"tcp"
,
nil
)
if
err
!=
nil
{
if
err
!=
nil
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment