mirror of
https://github.com/cmz0228/hysteria-dev.git
synced 2025-06-10 14:29:54 +00:00
fix: socks5 udp domain handling bug & add test case for it
This commit is contained in:
parent
fefabaf739
commit
b27628607a
@ -254,7 +254,12 @@ func (s *Server) udpServer(udpConn *net.UDPConn, hyUDP client.HyUDPConn) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
addr = addr[1:] // Remove the leading length byte
|
if atyp == socks5.ATYPDomain {
|
||||||
|
// socks5.ParseAddress adds a leading byte for domains,
|
||||||
|
// but socks5.NewDatagram will add it again as it expects a raw domain.
|
||||||
|
// So we must remove it here.
|
||||||
|
addr = addr[1:]
|
||||||
|
}
|
||||||
d := socks5.NewDatagram(atyp, addr, port, bs)
|
d := socks5.NewDatagram(atyp, addr, port, bs)
|
||||||
_, _ = udpConn.WriteToUDP(d.Bytes(), clientAddr)
|
_, _ = udpConn.WriteToUDP(d.Bytes(), clientAddr)
|
||||||
}
|
}
|
||||||
|
@ -6,33 +6,51 @@ ADDR = "127.0.0.1"
|
|||||||
PORT = 11080
|
PORT = 11080
|
||||||
|
|
||||||
|
|
||||||
def test_tcp(size, count, it):
|
def test_tcp(size, count, it, domain=False):
|
||||||
for i in range(it):
|
for i in range(it):
|
||||||
s = socks.socksocket(socket.AF_INET, socket.SOCK_STREAM)
|
s = socks.socksocket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
s.set_proxy(socks.SOCKS5, ADDR, PORT)
|
s.set_proxy(socks.SOCKS5, ADDR, PORT)
|
||||||
|
|
||||||
s.connect(("test_tcp", 12345))
|
if domain:
|
||||||
|
s.connect(("test.tcp.com", 12345))
|
||||||
|
else:
|
||||||
|
s.connect(("1.2.3.4", 12345))
|
||||||
|
|
||||||
for j in range(count):
|
for j in range(count):
|
||||||
payload = os.urandom(size)
|
payload = os.urandom(size)
|
||||||
s.send(payload)
|
s.send(payload)
|
||||||
rsp = s.recv(size)
|
rsp = s.recv(size)
|
||||||
assert rsp == payload
|
assert rsp == payload
|
||||||
|
|
||||||
s.close()
|
s.close()
|
||||||
|
|
||||||
|
|
||||||
def test_udp(size, count, it):
|
def test_udp(size, count, it, domain=False):
|
||||||
for i in range(it):
|
for i in range(it):
|
||||||
s = socks.socksocket(socket.AF_INET, socket.SOCK_DGRAM)
|
s = socks.socksocket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
s.set_proxy(socks.SOCKS5, ADDR, PORT)
|
s.set_proxy(socks.SOCKS5, ADDR, PORT)
|
||||||
|
|
||||||
for j in range(count):
|
for j in range(count):
|
||||||
payload = os.urandom(size)
|
payload = os.urandom(size)
|
||||||
s.sendto(payload, ("test_udp", 12345))
|
|
||||||
|
if domain:
|
||||||
|
s.sendto(payload, ("test.udp.com", 12345))
|
||||||
|
else:
|
||||||
|
s.sendto(payload, ("1.2.3.4", 12345))
|
||||||
|
|
||||||
rsp, addr = s.recvfrom(size)
|
rsp, addr = s.recvfrom(size)
|
||||||
assert rsp == payload and addr == (b"test_udp", 12345)
|
assert rsp == payload
|
||||||
|
|
||||||
|
if domain:
|
||||||
|
assert addr == (b"test.udp.com", 12345)
|
||||||
|
else:
|
||||||
|
assert addr == ("1.2.3.4", 12345)
|
||||||
|
|
||||||
s.close()
|
s.close()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
test_tcp(1024, 1024, 10)
|
test_tcp(1024, 1024, 10, domain=False)
|
||||||
test_udp(1024, 1024, 10)
|
test_tcp(1024, 1024, 10, domain=True)
|
||||||
|
test_udp(1024, 1024, 10, domain=False)
|
||||||
|
test_udp(1024, 1024, 10, domain=True)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user