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)
|
received_size = len(received)
|
||||||
logging.debug("Received size: %s", received_size)
|
logging.debug("Received size: %s", received_size)
|
||||||
logging.debug("Received: %r", received)
|
logging.debug("Received: %r", received)
|
||||||
|
|
||||||
|
|
||||||
def receive_bytes(client: socket.socket):
|
def receive_bytes(client: socket.socket):
|
||||||
buffering = True
|
buffering = True
|
||||||
buffer = b''
|
buffer = b''
|
||||||
@@ -93,6 +95,37 @@ def validate_status_line(status_line: str):
|
|||||||
return True
|
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):
|
def http_parser(client: socket.socket):
|
||||||
headers = {}
|
headers = {}
|
||||||
start_line = ""
|
start_line = ""
|
||||||
@@ -109,7 +142,6 @@ def http_parser(client: socket.socket):
|
|||||||
logging.debug("chunk: %r", chunk)
|
logging.debug("chunk: %r", chunk)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser(description='HTTP Client')
|
parser = argparse.ArgumentParser(description='HTTP Client')
|
||||||
parser.add_argument("--verbose", "-v", action='count', default=0, help="Increase verbosity level of logging")
|
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 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
client.connect((arguments.URI, arguments.port))
|
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)
|
client.sendall(message)
|
||||||
|
|
||||||
|
response_parser(client)
|
||||||
http_parser(client)
|
http_parser(client)
|
||||||
# tmp = b''
|
# tmp = b''
|
||||||
# keep = False
|
# keep = False
|
||||||
|
Reference in New Issue
Block a user