-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathproxy.py
110 lines (95 loc) · 2.98 KB
/
proxy.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import socket
import threading
from time import sleep
IN_ADDR = ('0.0.0.0', 3333)
OUT_ADDR = ('127.0.0.1', 6667)
BUFF_SIZE = 512
DELIM = "\r\n"
COLORS = [
'\033[91m',
'\033[92m',
'\033[93m',
'\033[94m',
'\033[95m',
'\033[96m',
]
ENDC = '\033[0m'
clients = []
class Client:
currentColor = 0
def __init__(self, sock: socket.socket, addr):
self.color = COLORS[Client.currentColor]
Client.currentColor = (Client.currentColor + 1) % len(COLORS)
self.inSock = sock
self.inAddr = addr
self.inThread = threading.Thread(target=self.inWorker)
self.outSock = socket.socket()
self.outSock.connect(OUT_ADDR)
self.outThread = threading.Thread(target=self.outWorker)
self.print("New client " + str(addr))
self.running = True
self.ended = False
self.inThread.start()
self.outThread.start()
def terminate(self):
sleep(0.5)
if self.ended:
return
self.ended = True
clients.remove(self)
try:
self.inSock.shutdown(socket.SHUT_RDWR)
self.inSock.close()
self.print("INSOCK CLOSED")
except Exception as e:
self.print("Exception close inSock: " + str(e))
try:
self.outSock.shutdown(socket.SHUT_RDWR)
self.outSock.close()
self.print("OUTSOCK CLOSED")
except Exception as e:
self.print("Exception close outSock: " + str(e))
def inWorker(self):
"""Forward message from client to server"""
try:
while self.running:
raw = self.inSock.recv(BUFF_SIZE)
if not raw:
self.running = False
break
msg = raw.decode().replace(DELIM, "\\r\\n\n ")
self.outSock.sendall(raw)
self.print(">>>> " + msg)
except Exception as e:
self.print("Exception inWorker: " + str(e))
self.terminate()
def outWorker(self):
"""Forward message from server to client"""
try:
while self.running:
raw = self.outSock.recv(BUFF_SIZE)
if not raw:
self.running = False
break
msg = raw.decode().replace(DELIM, "\\r\\n\n ")
self.inSock.sendall(raw)
self.print(" << " + msg)
except Exception as e:
self.print("Exception outWorker: " + str(e))
self.terminate()
def print(self, text: str):
"""Print to the screen"""
print(f"{self.color}{text}{ENDC}")
if __name__ == '__main__':
server = socket.socket()
server.bind(IN_ADDR)
server.listen(42)
print("Listening on", IN_ADDR)
try:
while True:
client, addr = server.accept()
clients.append(Client(client, addr))
except KeyboardInterrupt:
for c in clients:
c.terminate()
server.close()