diff --git a/trabalho5/proxy.py b/trabalho5/proxy.py new file mode 100644 index 0000000..540a314 --- /dev/null +++ b/trabalho5/proxy.py @@ -0,0 +1,165 @@ +import socket +import select +from threading import Thread +import time +import logging +import logging.handlers + +LOGGER_HOST = "localhost" +LOGGER_PORT = 514 + +CURRENT_THREADS = 0 +MAX_THREADS = 10 +BACKLOG = 50 + +class Logger: + _instance = None + def __init__(self): + self.logger = logging.getLogger('PythonProxy') + self.logger.setLevel(logging.DEBUG) + + handler = logging.handlers.SysLogHandler(address = (LOGGER_HOST, LOGGER_PORT)) + + self.logger.addHandler(handler) + + self.logger.debug('Initiating Proxy logger!') + + def log(self, message:str): + self.logger.debug(message) + print('INFO:', message) + + def critical(self, message:str): + self.logger.critical(message) + print('CRITICAL:', message) + + def __del__(self): + self.logger.close() + + @classmethod + def instance(self): + if self._instance is None: + self._instance = self() + return self._instance + + +class Server: + def __init__(self, host:str, port:int): + self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.sock.bind((host, port)) + self.sock.listen(BACKLOG) + print(f"Listening at: http://{host}:{port}") + + def thread_check(self): + global CURRENT_THREADS, MAX_THREADS + while True: + if CURRENT_THREADS >= MAX_THREADS: + time.sleep(1) + else: + return + + def start(self): + global CURRENT_THREADS + while True: + conn, client_addr = self.sock.accept() + self.thread_check() + + CURRENT_THREADS += 1 + thread = Thread(target = connectionHandle, args = (conn, client_addr, )) + CURRENT_THREADS -= 1 + thread.start() + + def __del__(self): + self.sock.close() + +def connectionHandle(client_socket, client_address): + # print(f"Connection received from {client_address[0]}:{client_address[1]}") + + request = client_socket.recv(16 * 1024) + logger = Logger.instance() + + if len(request) == 0: + client_socket.close() + return + + try: + raw_request = request.decode() + except UnicodeDecodeError: + print("UnicodeDecodeError") + client_socket.close() + return + + if "CONNECT" in raw_request: + client_socket.sendall(b"HTTP/1.1 200 Connection Established\r\n\r\n") + request = client_socket.recv(16 * 1024) + + request_url = raw_request.split(' ')[1] + request_host = "" + request_port = 443 if 'https' in request_url else 80 + + if request_url.startswith('http'): + request_host = request_url.split('/')[2] + else: + request_host = request_url.split('/')[0] + + if request_host.startswith('www'): + request_host = request_host[4:] + + if ':' in request_host: + request_port = int(request_host.split(':')[1]) + request_host = request_host.split(':')[0] + + # print(f"REQUEST [{client_address[0]}:{client_address[1]}] {raw_request}") + + if "monitorando" in request_url: + body = "