From df98baade52d81bed5727db6bcc5a49b7abddeb9 Mon Sep 17 00:00:00 2001 From: "rui.zheng" Date: Tue, 12 May 2015 16:12:35 +0800 Subject: [PATCH] add log --- conn.go | 136 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 69 insertions(+), 67 deletions(-) diff --git a/conn.go b/conn.go index 0260592..a9ff14c 100644 --- a/conn.go +++ b/conn.go @@ -1,78 +1,78 @@ package gosocks5 import ( - //"log" - "net" "io" + "log" + "net" "sync" "time" ) type Config struct { - Methods []uint8 - SelectMethod func(methods ...uint8) uint8 + Methods []uint8 + SelectMethod func(methods ...uint8) uint8 MethodSelected func(method uint8, conn net.Conn) (net.Conn, error) } func defaultConfig() *Config { - return &Config{} + return &Config{} } type Conn struct { - c net.Conn - config *Config - method uint8 - isClient bool - handshaked bool - handshakeMutex sync.Mutex - handshakeErr error + c net.Conn + config *Config + method uint8 + isClient bool + handshaked bool + handshakeMutex sync.Mutex + handshakeErr error } func ClientConn(conn net.Conn, config *Config) *Conn { - return &Conn{ - c: conn, - config: config, - isClient: true, - } + return &Conn{ + c: conn, + config: config, + isClient: true, + } } func ServerConn(conn net.Conn, config *Config) *Conn { - return &Conn{ - c: conn, - config: config, - } + return &Conn{ + c: conn, + config: config, + } } func (conn *Conn) Handleshake() error { - conn.handshakeMutex.Lock() - defer conn.handshakeMutex.Unlock() - - if err := conn.handshakeErr; err != nil { - return err - } - if conn.handshaked { - return nil - } - - if conn.isClient { - conn.handshakeErr = conn.clientHandshake() - } else { - conn.handshakeErr = conn.serverHandshake() - } - - return conn.handshakeErr + conn.handshakeMutex.Lock() + defer conn.handshakeMutex.Unlock() + + if err := conn.handshakeErr; err != nil { + return err + } + if conn.handshaked { + return nil + } + + if conn.isClient { + conn.handshakeErr = conn.clientHandshake() + } else { + conn.handshakeErr = conn.serverHandshake() + } + + return conn.handshakeErr } func (conn *Conn) clientHandshake() error { - if conn.config == nil { - conn.config = defaultConfig() - } - - nm := len(conn.config.Methods) + if conn.config == nil { + conn.config = defaultConfig() + } + + nm := len(conn.config.Methods) if nm == 0 { nm = 1 } - + b := make([]byte, 2+nm) b[0] = Ver5 b[1] = uint8(nm) @@ -89,24 +89,25 @@ func (conn *Conn) clientHandshake() error { if b[0] != Ver5 { return ErrBadVersion } - + if conn.config.MethodSelected != nil { - c, err := conn.config.MethodSelected(b[1], conn.c) - if err != nil { + c, err := conn.config.MethodSelected(b[1], conn.c) + if err != nil { return err } conn.c = c } conn.method = b[1] - conn.handshaked = true + log.Println("method:", conn.method) + conn.handshaked = true return nil } func (conn *Conn) serverHandshake() error { - if conn.config == nil { - conn.config = defaultConfig() - } - + if conn.config == nil { + conn.config = defaultConfig() + } + methods, err := ReadMethods(conn.c) if err != nil { return err @@ -129,44 +130,45 @@ func (conn *Conn) serverHandshake() error { conn.c = c } conn.method = method + log.Println("method:", method) conn.handshaked = true return nil } func (conn *Conn) Read(b []byte) (n int, err error) { - if err = conn.Handleshake(); err != nil { - return - } - return conn.c.Read(b) + if err = conn.Handleshake(); err != nil { + return + } + return conn.c.Read(b) } func (conn *Conn) Write(b []byte) (n int, err error) { - if err = conn.Handleshake(); err != nil { - return - } - return conn.c.Write(b) + if err = conn.Handleshake(); err != nil { + return + } + return conn.c.Write(b) } func (conn *Conn) Close() error { - return conn.c.Close() + return conn.c.Close() } func (conn *Conn) LocalAddr() net.Addr { - return conn.c.LocalAddr() + return conn.c.LocalAddr() } func (conn *Conn) RemoteAddr() net.Addr { - return conn.c.RemoteAddr() + return conn.c.RemoteAddr() } func (conn *Conn) SetDeadline(t time.Time) error { - return conn.c.SetDeadline(t) + return conn.c.SetDeadline(t) } func (conn *Conn) SetReadDeadline(t time.Time) error { - return conn.c.SetReadDeadline(t) + return conn.c.SetReadDeadline(t) } func (conn *Conn) SetWriteDeadline(t time.Time) error { - return conn.c.SetWriteDeadline(t) -} \ No newline at end of file + return conn.c.SetWriteDeadline(t) +}