This commit is contained in:
rui.zheng 2015-05-12 13:33:45 +08:00
parent 9ef10b90a9
commit a39bb9ecf8
3 changed files with 63 additions and 78 deletions

View File

@ -11,10 +11,10 @@ import (
"github.com/shadowsocks/shadowsocks-go/shadowsocks" "github.com/shadowsocks/shadowsocks-go/shadowsocks"
"io" "io"
"io/ioutil" "io/ioutil"
"net/url"
"log" "log"
"net" "net"
"net/http" "net/http"
"net/url"
"strconv" "strconv"
"strings" "strings"
//"sync/atomic" //"sync/atomic"
@ -65,8 +65,6 @@ func clientMethodSelected(method uint8, conn net.Conn) (net.Conn, error) {
cipher, _ := shadowsocks.NewCipher(Methods[method], Password) cipher, _ := shadowsocks.NewCipher(Methods[method], Password)
conn = shadowsocks.NewConn(conn, cipher) conn = shadowsocks.NewConn(conn, cipher)
case gosocks5.MethodNoAcceptable: case gosocks5.MethodNoAcceptable:
fallthrough
default:
return nil, gosocks5.ErrBadMethod return nil, gosocks5.ErrBadMethod
} }
@ -81,31 +79,9 @@ func cliHandle(conn net.Conn) {
fmt.Println("session end", atomic.AddInt64(&sessionCount, -1)) fmt.Println("session end", atomic.AddInt64(&sessionCount, -1))
}() }()
*/ */
addr := Saddr
if strings.HasPrefix(addr, "http://") { //log.Println("connect:", Saddr)
u, err := url.Parse(addr) c, err := Connect(Saddr, Proxy)
if err != nil {
log.Println(err)
return
}
addr = u.Host
if !strings.Contains(addr, ":") {
addr += ":80"
}
}
if strings.HasPrefix(addr, "https://") {
u, err := url.Parse(addr)
if err != nil {
log.Println(err)
return
}
addr = u.Host
if !strings.Contains(addr, ":") {
addr += ":443"
}
}
log.Println("connect:", addr)
c, err := Connect(addr, Proxy)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
return return
@ -113,12 +89,10 @@ func cliHandle(conn net.Conn) {
defer c.Close() defer c.Close()
if Websocket { if Websocket {
u, err := url.Parse(addr) url := &url.URL{
if err != nil { Host: Saddr,
log.Println(err)
return
} }
ws, resp, err := websocket.NewClient(c, u, nil, 8192, 8192) ws, resp, err := websocket.NewClient(c, url, nil, 8192, 8192)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
return return
@ -128,7 +102,12 @@ func cliHandle(conn net.Conn) {
c = NewWSConn(ws) c = NewWSConn(ws)
} }
c = gosocks5.ClientConn(c, clientConfig) sc := gosocks5.ClientConn(c, clientConfig)
if err := sc.Handleshake(); err != nil {
log.Println(err)
return
}
c = sc
if Shadows { if Shadows {
cipher, _ := shadowsocks.NewCipher(SMethod, SPassword) cipher, _ := shadowsocks.NewCipher(SMethod, SPassword)
@ -186,7 +165,7 @@ func handleSocks5(conn net.Conn, sconn net.Conn) {
if err != nil { if err != nil {
return return
} }
//log.Println(req) log.Println(req)
switch req.Cmd { switch req.Cmd {
case gosocks5.CmdConnect, gosocks5.CmdBind: case gosocks5.CmdConnect, gosocks5.CmdBind:

View File

@ -11,6 +11,7 @@ import (
"net/http" "net/http"
"net/url" "net/url"
"strconv" "strconv"
"strings"
) )
const ( const (
@ -51,6 +52,9 @@ func ToSocksAddr(addr net.Addr) *gosocks5.Addr {
} }
func Connect(addr, proxy string) (net.Conn, error) { func Connect(addr, proxy string) (net.Conn, error) {
if !strings.Contains(addr, ":") {
addr += ":80"
}
if len(proxy) == 0 { if len(proxy) == 0 {
taddr, err := net.ResolveTCPAddr("tcp", addr) taddr, err := net.ResolveTCPAddr("tcp", addr)
if err != nil { if err != nil {

30
ws.go
View File

@ -1,11 +1,11 @@
package main package main
import ( import (
"github.com/gorilla/websocket"
"net/http"
"log"
"time"
"github.com/ginuerzh/gosocks5" "github.com/ginuerzh/gosocks5"
"github.com/gorilla/websocket"
"log"
"net/http"
"time"
) )
type WSConn struct { type WSConn struct {
@ -20,16 +20,20 @@ func NewWSConn(conn *websocket.Conn) *WSConn {
} }
func (conn *WSConn) Read(b []byte) (n int, err error) { func (conn *WSConn) Read(b []byte) (n int, err error) {
_, b, err = conn.ReadMessage() _, r, err := conn.NextReader()
n = len(b) if err != nil {
return return
}
return r.Read(b)
} }
func (conn *WSConn) Write(b []byte) (n int, err error) { func (conn *WSConn) Write(b []byte) (n int, err error) {
n = len(b) w, err := conn.NextWriter(websocket.BinaryMessage)
err = conn.WriteMessage(websocket.BinaryMessage, b) if err != nil {
return return
}
defer w.Close()
return w.Write(b)
} }
func (conn *WSConn) SetDeadline(t time.Time) error { func (conn *WSConn) SetDeadline(t time.Time) error {
@ -46,10 +50,9 @@ type WSServer struct {
var upgrader = websocket.Upgrader{ var upgrader = websocket.Upgrader{
ReadBufferSize: 8192, ReadBufferSize: 8192,
WriteBufferSize: 8192, WriteBufferSize: 8192,
CheckOrigin: func(r *http.Request) bool{ return true;}, CheckOrigin: func(r *http.Request) bool { return true },
} }
func (s *WSServer) handle(w http.ResponseWriter, r *http.Request) { func (s *WSServer) handle(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil) conn, err := upgrader.Upgrade(w, r, nil)
if err != nil { if err != nil {
@ -58,9 +61,8 @@ func (s *WSServer) handle(w http.ResponseWriter, r *http.Request) {
} }
defer conn.Close() defer conn.Close()
c := NewWSConn(conn) c := gosocks5.ServerConn(NewWSConn(conn), serverConfig)
socks5Handle(c)
socks5Handle(gosocks5.ServerConn(c, serverConfig))
} }
func (s *WSServer) ListenAndServe() error { func (s *WSServer) ListenAndServe() error {