|
6 | 6 | UDP_LIMIT = 30 |
7 | 7 | DUMMY = lambda s: s |
8 | 8 |
|
9 | | -class ProxyReader(asyncio.StreamReader): |
10 | | - def __init__(self, o=None): |
11 | | - if o: |
12 | | - for n in dir(o): |
13 | | - if not n.startswith('__'): |
14 | | - setattr(self, n, getattr(o, n)) |
15 | | - else: |
16 | | - super(self).__init__() |
17 | | - def read_w(self, n): |
18 | | - return asyncio.wait_for(self.read(n), timeout=SOCKET_TIMEOUT) |
19 | | - def read_n(self, n): |
20 | | - return asyncio.wait_for(self.readexactly(n), timeout=SOCKET_TIMEOUT) |
21 | | - def read_until(self, s): |
22 | | - return asyncio.wait_for(self.readuntil(s), timeout=SOCKET_TIMEOUT) |
23 | | - def rollback(self, s): |
24 | | - self._buffer.__setitem__(slice(0, 0), s) |
| 9 | +def patch_StreamReader(c=asyncio.StreamReader): |
| 10 | + c.read_w = lambda self, n: asyncio.wait_for(self.read(n), timeout=SOCKET_TIMEOUT) |
| 11 | + c.read_n = lambda self, n: asyncio.wait_for(self.readexactly(n), timeout=SOCKET_TIMEOUT) |
| 12 | + c.read_until = lambda self, s: asyncio.wait_for(self.readuntil(s), timeout=SOCKET_TIMEOUT) |
| 13 | + c.rollback = lambda self, s: self._buffer.__setitem__(slice(0, 0), s) |
| 14 | +patch_StreamReader() |
25 | 15 |
|
26 | 16 | class AuthTable(object): |
27 | 17 | _auth = {} |
@@ -68,7 +58,7 @@ def schedule(rserver, salgorithm, host_name, port): |
68 | 58 |
|
69 | 59 | async def stream_handler(reader, writer, unix, lbind, protos, rserver, cipher, sslserver, debug=0, authtime=86400*30, block=None, salgorithm='fa', verbose=DUMMY, modstat=lambda u,r,h:lambda i:DUMMY, **kwargs): |
70 | 60 | try: |
71 | | - reader, writer = proto.sslwrap(ProxyReader(reader), writer, sslserver, True, None, verbose) |
| 61 | + reader, writer = proto.sslwrap(reader, writer, sslserver, True, None, verbose) |
72 | 62 | if unix: |
73 | 63 | remote_ip, server_ip, remote_text = 'local', None, 'unix_local' |
74 | 64 | else: |
@@ -231,7 +221,7 @@ async def open_connection(self, host, port, local_addr, lbind, timeout=SOCKET_TI |
231 | 221 | reader, writer = await asyncio.wait_for(wait, timeout=timeout) |
232 | 222 | except Exception as ex: |
233 | 223 | raise |
234 | | - return ProxyReader(reader), writer |
| 224 | + return reader, writer |
235 | 225 | async def prepare_connection(self, reader_remote, writer_remote, host, port): |
236 | 226 | return reader_remote, writer_remote |
237 | 227 | async def tcp_connect(self, host, port, local_addr=None, lbind=None): |
@@ -532,7 +522,7 @@ async def handler(reader, writer, **kw): |
532 | 522 | auth = b'\x01'+auth |
533 | 523 | if auth: |
534 | 524 | try: |
535 | | - assert auth == (await asyncio.wait_for(reader.readexactly(len(auth)), timeout=SOCKET_TIMEOUT)) |
| 525 | + assert auth == (await reader.read_n(len(auth))) |
536 | 526 | except Exception: |
537 | 527 | return |
538 | 528 | await self.conn.put((reader, writer)) |
|
0 commit comments