update client
This commit is contained in:
BIN
Assignment_Python_2021.pdf
Normal file
BIN
Assignment_Python_2021.pdf
Normal file
Binary file not shown.
37
client.py
37
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
|
||||
|
Reference in New Issue
Block a user