-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathsimple_client.py
More file actions
63 lines (48 loc) · 1.73 KB
/
simple_client.py
File metadata and controls
63 lines (48 loc) · 1.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
"""
Simple HTTP Client
A simple HTTP client that can perform basic HTTP GET and PUT requests.
"""
import socket
import argparse
# this client can receive this many bytes of data at a time
BUFFER_SIZE = 4096
# number of seconds before client socket times out
SOCKET_TIMEOUT = 5
# parse arguments from the command line
parser = argparse.ArgumentParser()
parser.add_argument("server", type=str, nargs='?')
parser.add_argument("port", type=int, nargs='?', default='80')
parser.add_argument("method", type=str, nargs='?')
parser.add_argument("filename", type=str, nargs='?')
args = parser.parse_args()
SERVER = args.server
PORT = args.port
METHOD = args.method
FILE = args.filename
try:
# create a client socket and connect it to the server socket
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect((SERVER, PORT))
# formulate http request from CLI args
request = (f"{METHOD} /{FILE} HTTP/1.1\r\nHost: {SERVER}:{PORT}\r\n"
f"User-Agent: simple_client\r\nAccept: */*\r\n\r\n")
# send request to server socket
clientsocket.send(request.encode())
# set a timeout for blocking socket operations to prevent hanging up
clientsocket.settimeout(SOCKET_TIMEOUT)
http_response = bytearray()
try:
# keep receiving bytes until a response from server is empty
while 1:
response = clientsocket.recv(BUFFER_SIZE)
if not response:
break
http_response += response
except socket.timeout:
print("socket timed out, printing response")
print(http_response.decode())
clientsocket.close()
# close gracefully on keyboard interrupt
except KeyboardInterrupt:
if clientsocket:
clientsocket.close()