Skip to content

Commit 4ac207c

Browse files
authored
v1.9.7
1 parent f771f6c commit 4ac207c

3 files changed

Lines changed: 13 additions & 3 deletions

File tree

pproxy/__doc__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
__title__ = "pproxy"
2-
__version__ = "1.9.6"
2+
__version__ = "1.9.7"
33
__license__ = "MIT"
44
__description__ = "Proxy server that can tunnel among remote servers by regex rules."
55
__keywords__ = "proxy socks http shadowsocks shadowsocksr ssr redirect pf tunnel cipher ssl udp"

pproxy/server.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
SOCKET_TIMEOUT = 300
66
PACKET_SIZE = 65536
7+
UDP_LIMIT = 150
78
DUMMY = lambda s: s
89

910
asyncio.StreamReader.read_ = lambda self: self.read(PACKET_SIZE)
@@ -210,28 +211,35 @@ def __init__(prot, data):
210211
self.udpmap[addr] = prot
211212
prot.databuf = [data]
212213
prot.transport = None
214+
prot.update = 0
213215
def connection_made(prot, transport):
214216
prot.transport = transport
215217
for data in prot.databuf:
216218
transport.sendto(data)
217219
prot.databuf.clear()
220+
prot.update = time.time()
218221
def new_data_arrived(prot, data):
219222
if prot.transport:
220223
prot.transport.sendto(data)
221224
else:
222225
prot.databuf.append(data)
226+
prot.update = time.time()
223227
def datagram_received(prot, data, addr):
224228
data = self.cipher.datagram.decrypt(data) if self.cipher else data
225229
data = self.rproto.udp_client(data) if not self.direct else data
226230
reply(data)
231+
prot.update = time.time()
227232
def connection_lost(prot, exc):
228-
self.udpmap.pop(addr)
233+
self.udpmap.pop(addr, None)
229234
if addr in self.udpmap:
230235
self.udpmap[addr].new_data_arrived(data)
231236
else:
232237
if self.direct and host == 'tunnel':
233238
raise Exception('Unknown tunnel endpoint')
234239
self.connection_change(1)
240+
if len(self.udpmap) > UDP_LIMIT:
241+
min_addr = min(self.udpmap, key=lambda x: self.udpmap[x].update)
242+
self.udpmap.pop(min_addr).close()
235243
prot = Protocol(data)
236244
remote_addr = (host, port) if self.direct else (self.host_name, self.port)
237245
await asyncio.get_event_loop().create_datagram_endpoint(lambda: prot, remote_addr=remote_addr)

pproxy/verbose.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ def setup(loop, args):
4141
def verbose(s):
4242
if args.v >= 2:
4343
sys.stdout.write('\x1b[32m'+time.strftime('%Y-%m-%d %H:%M:%S')+'\x1b[m ')
44-
sys.stdout.write(s+'\x1b[0K\n')
44+
sys.stdout.write(s+'\x1b[0K\n')
45+
else:
46+
sys.stdout.write(s+'\n')
4547
sys.stdout.flush()
4648
args.verbose = verbose
4749
args.stats = {0: [0]*6}

0 commit comments

Comments
 (0)