func (r *relayHandler) ServeSocks(conn *gosocks.SocksConn) { conn.SetReadDeadline(time.Now().Add(conn.Timeout)) req, err := gosocks.ReadSocksRequest(conn) if err != nil { log.Printf("error in ReadSocksRequest: %s", err) return } switch req.Cmd { case gosocks.SocksCmdConnect: chain := r.lookup(req.DstHost, conn) if chain != nil { chain.TCP(req, conn) } else { r.basic.HandleCmdConnect(req, conn) } return case gosocks.SocksCmdUDPAssociate: r.handleUDPAssociate(req, conn) return case gosocks.SocksCmdBind: conn.Close() return default: return } }