diff --git a/trabalho5/proxy.py b/trabalho5/proxy.py index cb9c374..877afc2 100644 --- a/trabalho5/proxy.py +++ b/trabalho5/proxy.py @@ -9,7 +9,7 @@ from logging import config BUFFER_SIZE = 32 * 1024 CURRENT_THREADS = 0 -MAX_THREADS = 10 +MAX_THREADS = 50 BACKLOG = 50 LOGGING = { 'version': 1, @@ -86,100 +86,99 @@ class Server: self.thread_check() CURRENT_THREADS += 1 - thread = Thread(target = connectionHandle, args = (conn, client_addr, )) + thread = Thread(target = self.handle_connection, args = (conn, client_addr, )) CURRENT_THREADS -= 1 thread.start() def __del__(self): self.sock.close() -def is_valid_status_code(status_code:str): + def handle_connection(self, client_socket, client_address): + request = client_socket.recv(BUFFER_SIZE) + logger = Logger.instance() + + if len(request) == 0: + client_socket.close() + return + + try: + raw_request = request.decode() + except 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(BUFFER_SIZE) + + 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] + + if "monitorando" in request_url.lower(): + body = open('forbidden.html', 'r').read() + client_socket.sendall(b"HTTP/1.1 403 Forbidden\r\n\r\n") + client_socket.sendall(body.encode()) + client_socket.close() + logger.info(f"REQUEST [{client_address[0]}:{client_address[1]}] to [{request_host}:{request_port}] - 'Monitorando' - 403 Forbidden") + return + + server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + server_socket.connect((request_host, request_port)) + server_socket.send(request) + + while True: + triple = select.select([client_socket, server_socket], [], [], 10)[0] + if not len(triple): + break + try: + if server_socket in triple: + data = server_socket.recv(BUFFER_SIZE) + if not data: + break + + try: + status_code = data.decode().split('\r\n')[0].split(' ')[1:] + status_code = ' '.join(status_code) + if is_valid_status_code(status_code): + logger.info(f"REQUEST [{client_address[0]}:{client_address[1]}] to [{request_host}:{request_port}] - {status_code}") + except UnicodeDecodeError: + logger.info(f"REQUEST [{client_address[0]}:{client_address[1]}] to [{request_host}:{request_port}]") + pass + + client_socket.send(data) + if client_socket in triple: + data = client_socket.recv(BUFFER_SIZE) + if not data: + break + + server_socket.send(data) + except ConnectionAbortedError: + break + + server_socket.close() + client_socket.close() + +def is_valid_status_code(status_code: str): valid_starts = [str(i) for i in range(5)] if status_code.startswith(tuple(valid_starts)): return True return False -def connectionHandle(client_socket, client_address): - request = client_socket.recv(BUFFER_SIZE) - logger = Logger.instance() - - if len(request) == 0: - client_socket.close() - return - - try: - raw_request = request.decode() - except 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(BUFFER_SIZE) - - 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] - - if "monitorando" in request_url.lower(): - body = open('forbidden.html', 'r').read() - client_socket.sendall(b"HTTP/1.1 403 Forbidden\r\n\r\n") - client_socket.sendall(body.encode()) - client_socket.close() - logger.info(f"REQUEST [{client_address[0]}:{client_address[1]}] to [{request_host}:{request_port}] - 'Monitorando' - 403 Forbidden") - return - - server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - server_socket.connect((request_host, request_port)) - server_socket.send(request) - - while True: - triple = select.select([client_socket, server_socket], [], [], 10)[0] - if not len(triple): - break - try: - if server_socket in triple: - data = server_socket.recv(BUFFER_SIZE) - if not data: - break - - try: - status_code = data.decode().split('\r\n')[0].split(' ')[1:] - status_code = ' '.join(status_code) - if is_valid_status_code(status_code): - logger.info(f"REQUEST [{client_address[0]}:{client_address[1]}] to [{request_host}:{request_port}] - {status_code}") - except UnicodeDecodeError: - logger.info(f"REQUEST [{client_address[0]}:{client_address[1]}] to [{request_host}:{request_port}]") - pass - - client_socket.send(data) - if client_socket in triple: - data = client_socket.recv(BUFFER_SIZE) - if not data: - break - - server_socket.send(data) - except ConnectionAbortedError: - break - - server_socket.close() - client_socket.close() - -def verify_code_integrity(): +def check_code(): import hashlib - import sys content = None shas256_hash = None @@ -199,7 +198,7 @@ def verify_code_integrity(): print('Arquivo do proxy verificado!') if __name__ == '__main__': - verify_code_integrity() + check_code() try: ser = Server(host="0.0.0.0", port=8080) diff --git a/trabalho5/proxy.sha256sum b/trabalho5/proxy.sha256sum index 24a8354..330e9d8 100644 --- a/trabalho5/proxy.sha256sum +++ b/trabalho5/proxy.sha256sum @@ -1 +1 @@ -dd8f33d81858978c4fec0eb3c2f0acb768028a10d80428417aae91bf86b343d3 \ No newline at end of file +02c9fe27bfc80f2a71e6a7b618c379fcd60b18c4e8cc646d081b1eebb7682bba \ No newline at end of file