From c61a562fee363c8a415abea109f5f0fb5a591605 Mon Sep 17 00:00:00 2001 From: Jonney Date: Wed, 29 Jan 2025 20:13:24 +0800 Subject: [PATCH 1/3] Optimize print_server_started() to avoid throw an exception when using the QUIC protocol. --- pproxy/server.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/pproxy/server.py b/pproxy/server.py index f7c82be..32de194 100644 --- a/pproxy/server.py +++ b/pproxy/server.py @@ -883,14 +883,20 @@ async def test_url(url, rserver): print(f'============ success ============') def print_server_started(option, server, print_fn): - for s in server.sockets: + sockets=[] + if hasattr(server, 'sockets'): # asyncio.Server or uvloop.loop.Server + sockets.extend(server.sockets) + elif hasattr(server, '_transport'): # aioquic.asyncio.server.QuicServer + sockets.append(server._transport.get_extra_info('socket')) + for s in sockets: # https://github.com/MagicStack/uvloop/blob/master/uvloop/pseudosock.pyx - laddr = s.getsockname() # tuple size varies with protocol family - h = laddr[0] - p = laddr[1] - f = str(s.family) - ipversion = "ipv4" if f == "AddressFamily.AF_INET" else ("ipv6" if f == "AddressFamily.AF_INET6" else "ipv?") # TODO better - bind = ipversion+' '+h+':'+str(p) + host, port = s.getsockname() # tuple size varies with protocol family + ipversion = "ipv?" + if s.family == socket.AddressFamily.AF_INET: + ipversion = "ipv4" + elif s.family == socket.AddressFamily.AF_INET6: + ipversion = "ipv6" + bind = ipversion + ' ' + host + ':' + str(port) print_fn(option, bind) def main(args = None): From 5ba47825d7b867cbd64dee9cb37f37b3efdc50aa Mon Sep 17 00:00:00 2001 From: Jonney <603073+Jonney@users.noreply.github.com> Date: Thu, 30 Jan 2025 17:30:01 +0800 Subject: [PATCH 2/3] Add more judgments for print_server_started() Add judgment for asyncio.Transport or uvloop.loop.UDPTransport. Add judgment for not all of theme. --- pproxy/server.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pproxy/server.py b/pproxy/server.py index 32de194..7c3ba04 100644 --- a/pproxy/server.py +++ b/pproxy/server.py @@ -886,8 +886,13 @@ def print_server_started(option, server, print_fn): sockets=[] if hasattr(server, 'sockets'): # asyncio.Server or uvloop.loop.Server sockets.extend(server.sockets) + elif hasattr(server, 'get_extra_info'): # asyncio.Transport or uvloop.loop.UDPTransport + sockets.append(server.get_extra_info('socket')) elif hasattr(server, '_transport'): # aioquic.asyncio.server.QuicServer sockets.append(server._transport.get_extra_info('socket')) + else: + print_fn(option, None) + return for s in sockets: # https://github.com/MagicStack/uvloop/blob/master/uvloop/pseudosock.pyx host, port = s.getsockname() # tuple size varies with protocol family From bda5dddbbcdfe7071cdc6d69781067d4cdb9a7e7 Mon Sep 17 00:00:00 2001 From: Jonney <603073+Jonney@users.noreply.github.com> Date: Fri, 31 Jan 2025 14:14:50 +0800 Subject: [PATCH 3/3] s.getsockname() => s.getsockname()[:2] IPV6 s.getsockname() will return a tuple of length 4. --- pproxy/server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pproxy/server.py b/pproxy/server.py index 7c3ba04..8a3efc3 100644 --- a/pproxy/server.py +++ b/pproxy/server.py @@ -895,7 +895,7 @@ def print_server_started(option, server, print_fn): return for s in sockets: # https://github.com/MagicStack/uvloop/blob/master/uvloop/pseudosock.pyx - host, port = s.getsockname() # tuple size varies with protocol family + host, port = s.getsockname()[:2] # tuple size varies with protocol family ipversion = "ipv?" if s.family == socket.AddressFamily.AF_INET: ipversion = "ipv4"