-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhttp_request.py
More file actions
77 lines (58 loc) · 2.49 KB
/
Copy pathhttp_request.py
File metadata and controls
77 lines (58 loc) · 2.49 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
74
75
76
77
from urllib.parse import urlparse, parse_qs
import base64
class HTTPRequest:
def __init__(self, url, version, method, headers, cookies, queries, data, authorization):
parsed_url = urlparse(url)
self.host = parsed_url.netloc
self.path = parsed_url.path
self.queries = parse_qs(parsed_url.query)
self.add_queries(queries)
self.version = version
self.method = method
self.headers = {}
self.add_headers(headers)
if 'host' in self.headers:
self.host = self.headers.pop('host')
self.cookies = {}
if 'cookie' in self.headers:
self.add_cookies([cookie.strip() for cookie in self.headers.pop('cookie').split(';')])
self.add_cookies(cookies)
if authorization is not None:
self.headers['authorization'] = f'Basic {base64.b64encode(authorization.encode()).decode()}'
self.data = data
def add_queries(self, queries):
for query in queries:
key, value = [q.strip() for q in query.split('=', 1)]
if key not in self.queries:
self.queries[key] = []
self.queries[key].append(value)
def add_headers(self, headers):
for header in headers:
key, value = [h.strip() for h in header.split(':', 1)]
key = key.lower()
self.headers[key] = value
def add_cookies(self, cookies):
for cookie in cookies:
key, value = [c.strip() for c in cookie.split('=', 1)]
key = key.lower()
self.cookies[key] = value
def set_url(self, url):
parsed_url = urlparse(url)
if parsed_url.netloc != '' and parsed_url.netloc is not None:
self.host = parsed_url.netloc
self.path = parsed_url.path
def __str__(self):
queries = '&'.join([f'{query}={value}' for query, values in self.queries.items() for value in values])
if queries != '':
queries = f'?{queries}'
request = [f'{self.method} {self.path}{queries} {self.version}', f'host: {self.host}']
headers = [f'{header}: {value}' for header, value in self.headers.items()]
request.extend(headers)
cookies = '; '.join([f'{cookie}={value}' for cookie, value in self.cookies.items()])
if cookies != '':
request.append(f'cookie: {cookies}')
request.append("")
data = '&'.join(self.data)
request.append(data)
request = '\r\n'.join(request)
return request