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

View File

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

74
ws.go
View File

@ -1,69 +1,71 @@
package main
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 {
*websocket.Conn
*websocket.Conn
}
func NewWSConn(conn *websocket.Conn) *WSConn {
c := &WSConn{}
c.Conn = conn
c := &WSConn{}
c.Conn = conn
return c
return c
}
func (conn *WSConn) Read(b []byte) (n int, err error) {
_, b, err = conn.ReadMessage()
n = len(b)
return
_, r, err := conn.NextReader()
if err != nil {
return
}
return r.Read(b)
}
func (conn *WSConn) Write(b []byte) (n int, err error) {
n = len(b)
err = conn.WriteMessage(websocket.BinaryMessage, b)
return
w, err := conn.NextWriter(websocket.BinaryMessage)
if err != nil {
return
}
defer w.Close()
return w.Write(b)
}
func (conn *WSConn) SetDeadline(t time.Time) error {
if err := conn.SetReadDeadline(t); err != nil {
return err
}
return conn.SetWriteDeadline(t)
if err := conn.SetReadDeadline(t); err != nil {
return err
}
return conn.SetWriteDeadline(t)
}
type WSServer struct {
Addr string
Addr string
}
var upgrader = websocket.Upgrader{
ReadBufferSize: 8192,
WriteBufferSize: 8192,
CheckOrigin: func(r *http.Request) bool{ return true;},
ReadBufferSize: 8192,
WriteBufferSize: 8192,
CheckOrigin: func(r *http.Request) bool { return true },
}
func (s *WSServer) handle(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
defer conn.Close()
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
defer conn.Close()
c := NewWSConn(conn)
socks5Handle(gosocks5.ServerConn(c, serverConfig))
c := gosocks5.ServerConn(NewWSConn(conn), serverConfig)
socks5Handle(c)
}
func (s *WSServer) ListenAndServe() error {
http.HandleFunc("/", s.handle)
return http.ListenAndServe(s.Addr, nil)
http.HandleFunc("/", s.handle)
return http.ListenAndServe(s.Addr, nil)
}