diff --git a/Assignment_Python_2021.pdf b/Assignment_Python_2021.pdf new file mode 100644 index 0000000..6df25b0 Binary files /dev/null and b/Assignment_Python_2021.pdf differ diff --git a/client.py b/client.py index a9fc350..2b188bf 100644 --- a/client.py +++ b/client.py @@ -17,6 +17,8 @@ def receive_bytes_chunk(client: socket.socket): received_size = len(received) logging.debug("Received size: %s", received_size) logging.debug("Received: %r", received) + + def receive_bytes(client: socket.socket): buffering = True buffer = b'' @@ -93,6 +95,37 @@ def validate_status_line(status_line: str): return True +def get_chunk(buffer: bytes): + lf_pos = buffer.find(b"\n\n") + crlf_pos = buffer.find(b"\r\n\r\n") + if lf_pos != -1 and lf_pos < crlf_pos: + split_start = lf_pos + split_end = lf_pos + 2 + else: + split_start = crlf_pos + split_end = crlf_pos + 4 + + return buffer[:split_start], buffer[split_end:] + + +def response_parser(client: socket.socket): + client.settimeout(3.0) + + try: + buffer = client.recv(BUFSIZE) + except TimeoutError as err: + # TODO handler error appropriately + logging.debug("[ERR] Socket timeout: %r", exc_info=err) + return + + (header_chunk, buffer) = get_chunk(buffer) + (status_line, headers) = parse_header(header_chunk) + if not validate_status_line(status_line): + raise Exception("Invalid status-line") + logging.debug("valid status-line: %r", status_line) + + + def http_parser(client: socket.socket): headers = {} start_line = "" @@ -109,7 +142,6 @@ def http_parser(client: socket.socket): logging.debug("chunk: %r", chunk) - def main(): parser = argparse.ArgumentParser(description='HTTP Client') parser.add_argument("--verbose", "-v", action='count', default=0, help="Increase verbosity level of logging") @@ -125,9 +157,10 @@ def main(): client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((arguments.URI, arguments.port)) - message = "GET / HTTP/1.1\r\nHost: www.google.com:80\r\n\r\n".encode(FORMAT) + message = "GET /Protocols/HTTP/Performance/microscape/ HTTP/1.1\r\nHost: www.w3.org:80\r\n\r\n".encode(FORMAT) client.sendall(message) + response_parser(client) http_parser(client) # tmp = b'' # keep = False