-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclient.py
More file actions
73 lines (60 loc) · 1.88 KB
/
client.py
File metadata and controls
73 lines (60 loc) · 1.88 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
64
65
66
67
68
69
70
71
72
73
import argparse
import socket
from datetime import datetime
HOST = "127.0.0.1"
PORT = 8080
def send_request(
request_payload: bytes, host: str = HOST, port: int = PORT
) -> tuple[str, str]:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, port))
request_line = b"GET / HTTP/1.1\r\n"
headers = b"".join(
[
f"Host: {host}:{port}\r\n".encode("utf-8"),
b"User-Agent: CrappyClient/0.0.1\r\n",
b"Content-Type: text/plain\r\n",
f"Content-Length: {len(request_payload)}\r\n".encode("utf-8"),
]
)
blank_line = b"\r\n"
request = b"".join([request_line, headers, blank_line, request_payload])
s.sendall(request)
data = s.recv(1024)
print(f"\n[{datetime.now()}]")
print("Client_request:\n", request.decode("utf-8"))
print("\nClient_response:\n", data.decode("utf-8"))
return request.decode("utf-8"), data.decode("utf-8")
def main() -> None:
parser = argparse.ArgumentParser(
description="HTTP Client with configurable request"
)
parser.add_argument(
"-r",
"--request",
dest="request",
type=str,
default="Default client request payload",
help="Custom request payload in plaintest (default: 'Default client request payload')",
)
parser.add_argument(
"-s",
"--host",
dest="host",
type=str,
default=HOST,
help=f"Server host (default: {HOST})",
)
parser.add_argument(
"-p",
"--port",
dest="port",
type=int,
default=PORT,
help=f"Server port (default: {PORT})",
)
args = parser.parse_args()
request_payload = args.request.encode("utf-8")
send_request(request_payload, args.host, args.port)
if __name__ == "__main__":
main()