88import sys
99from argparse import ArgumentParser , ArgumentDefaultsHelpFormatter
1010from asyncio import CancelledError , StreamReader , StreamWriter
11+ from contextlib import closing
1112from functools import partial
1213
1314from .. import ProxyProtocol
1415from ..sock import SocketInfo
15- from ..version import ProxyProtocolVersion
1616from . import Address
1717
1818__all__ = ['main' ]
2323def main () -> int :
2424 parser = ArgumentParser (description = __doc__ ,
2525 formatter_class = ArgumentDefaultsHelpFormatter )
26- parser .add_argument ('type' , default = 'detect' , nargs = '?' ,
27- choices = [v .name .lower () for v in ProxyProtocolVersion ],
28- help = 'the PROXY protocol version' )
2926 parser .add_argument ('address' , metavar = 'HOST:PORT' ,
3027 type = partial (Address , server = True ),
3128 nargs = '?' , default = ':10007' ,
@@ -36,13 +33,12 @@ def main() -> int:
3633 level = logging .INFO ,
3734 format = '%(asctime)-15s %(name)s %(message)s' )
3835
39- pp = ProxyProtocolVersion .get (args .type )
40- return asyncio .run (run (pp , args .address ))
36+ return asyncio .run (run (args .address ))
4137
4238
43- async def run (pp : ProxyProtocol , address : Address ) -> int :
39+ async def run (address : Address ) -> int :
4440 loop = asyncio .get_event_loop ()
45- callback = partial (run_conn , pp )
41+ callback = partial (run_conn , address . pp )
4642 server = await asyncio .start_server (
4743 callback , address .host , address .port or 0 , ssl = address .ssl )
4844 async with server :
@@ -58,20 +54,21 @@ async def run(pp: ProxyProtocol, address: Address) -> int:
5854
5955async def run_conn (pp : ProxyProtocol , reader : StreamReader ,
6056 writer : StreamWriter ) -> None :
61- result = await pp .read (reader )
62- sock_info = SocketInfo (writer , result )
63- _log .info ('[%s] Connection received: %s' ,
64- sock_info .unique_id .hex (), sock_info )
65- try :
66- while True :
67- line = await reader .readline ()
68- if not line :
69- break
70- writer .write (line )
71- except IOError :
72- pass
73- finally :
74- _log .info ('[%s] Connection lost' , sock_info .unique_id .hex ())
57+ with closing (writer ):
58+ result = await pp .read (reader )
59+ sock_info = SocketInfo (writer , result )
60+ _log .info ('[%s] Connection received: %s' ,
61+ sock_info .unique_id .hex (), sock_info )
62+ try :
63+ while True :
64+ line = await reader .readline ()
65+ if not line :
66+ break
67+ writer .write (line )
68+ except IOError :
69+ pass
70+ finally :
71+ _log .info ('[%s] Connection lost' , sock_info .unique_id .hex ())
7572
7673
7774if __name__ == '__main__' :
0 commit comments