上一个commit修改了函数签名,不好,太笨,还是不改好

proxy.Server返回的 *bytes.Buffer只被用于Fallback,所以直接放到Fallback里就行
This commit is contained in:
hahahrfool
2022-03-16 08:19:09 +08:00
parent 861d5a74c5
commit fa1c5db1ef
7 changed files with 53 additions and 39 deletions

View File

@@ -54,10 +54,10 @@ func (s *Server) CanFallback() bool {
//中文: https://aber.sh/articles/Socks5/
// 参考 https://studygolang.com/articles/31404
func (s *Server) Handshake(underlay net.Conn) (io.ReadWriter, *bytes.Buffer, *proxy.Addr, error) {
func (s *Server) Handshake(underlay net.Conn) (io.ReadWriter, *proxy.Addr, error) {
// Set handshake timeout 4 seconds
if err := underlay.SetReadDeadline(time.Now().Add(time.Second * 4)); err != nil {
return nil, nil, nil, err
return nil, nil, err
}
defer underlay.SetReadDeadline(time.Time{})
@@ -68,24 +68,24 @@ func (s *Server) Handshake(underlay net.Conn) (io.ReadWriter, *bytes.Buffer, *pr
// 一般握手包发来的是 [5 1 0]
n, err := underlay.Read(buf)
if err != nil || n == 0 {
return nil, nil, nil, fmt.Errorf("failed to read hello: %w", err)
return nil, nil, fmt.Errorf("failed to read hello: %w", err)
}
version := buf[0]
if version != Version5 {
return nil, nil, nil, fmt.Errorf("unsupported socks version %v", version)
return nil, nil, fmt.Errorf("unsupported socks version %v", version)
}
// Write hello response [5 0]
// TODO: Support Auth
_, err = underlay.Write([]byte{Version5, AuthNone})
if err != nil {
return nil, nil, nil, fmt.Errorf("failed to write hello response: %w", err)
return nil, nil, fmt.Errorf("failed to write hello response: %w", err)
}
// Read command message
n, err = underlay.Read(buf)
if err != nil || n < 7 { // Shortest length is 7
return nil, nil, nil, fmt.Errorf("read socks5 failed, msgTooShort: %w", err)
return nil, nil, fmt.Errorf("read socks5 failed, msgTooShort: %w", err)
}
// 一般可以为 5 1 0 3 n3表示域名n是域名长度然后域名很可能是 119 119 119 46 开头,表示 www.
@@ -94,7 +94,7 @@ func (s *Server) Handshake(underlay net.Conn) (io.ReadWriter, *bytes.Buffer, *pr
cmd := buf[1]
switch cmd {
case CmdBind:
return nil, nil, nil, fmt.Errorf("unsuppoted command %v", cmd)
return nil, nil, fmt.Errorf("unsuppoted command %v", cmd)
case CmdUDPAssociate:
}
@@ -114,11 +114,11 @@ func (s *Server) Handshake(underlay net.Conn) (io.ReadWriter, *bytes.Buffer, *pr
l += int(buf[4])
off = 5
default:
return nil, nil, nil, fmt.Errorf("unknown address type %v", buf[3])
return nil, nil, fmt.Errorf("unknown address type %v", buf[3])
}
if len(buf[off:]) < l {
return nil, nil, nil, errors.New("short command request")
return nil, nil, errors.New("short command request")
}
var theName string
@@ -146,7 +146,7 @@ func (s *Server) Handshake(underlay net.Conn) (io.ReadWriter, *bytes.Buffer, *pr
serverAtyp, serverAddr, _, err := proxy.ParseStrToAddr(s.Addr)
if serverAtyp != proxy.AtypIP4 { //暂时先只支持ipv4为了简单起见
if err != nil {
return nil, nil, nil, errors.New("UDPAssociate: can't listen an domain, must be ip")
return nil, nil, errors.New("UDPAssociate: can't listen an domain, must be ip")
}
}
@@ -161,7 +161,7 @@ func (s *Server) Handshake(underlay net.Conn) (io.ReadWriter, *bytes.Buffer, *pr
udpRC, err := net.ListenUDP("udp", udpPreparedAddr)
if err != nil {
return nil, nil, nil, errors.New("UDPAssociate: unable to listen udp")
return nil, nil, errors.New("UDPAssociate: unable to listen udp")
}
//ver5, rep0表示成功, rsv0, atyp(1, 即ipv4), BND.ADDR(4字节的ipv4) , BND.PORT(2字节)
@@ -170,14 +170,14 @@ func (s *Server) Handshake(underlay net.Conn) (io.ReadWriter, *bytes.Buffer, *pr
// Write command response
_, err = underlay.Write(reply)
if err != nil {
return nil, nil, nil, fmt.Errorf("failed to write command response: %w", err)
return nil, nil, fmt.Errorf("failed to write command response: %w", err)
}
uc := &UDPConn{
clientSupposedAddr: clientFutureAddr,
UDPConn: udpRC,
}
return uc, nil, clientFutureAddr, nil
return uc, clientFutureAddr, nil
} else {
addr := &proxy.Addr{
@@ -194,10 +194,10 @@ func (s *Server) Handshake(underlay net.Conn) (io.ReadWriter, *bytes.Buffer, *pr
_, err = underlay.Write(reply)
if err != nil {
return nil, nil, nil, fmt.Errorf("failed to write command response: %w", err)
return nil, nil, fmt.Errorf("failed to write command response: %w", err)
}
return underlay, nil, addr, nil
return underlay, addr, nil
}
}