Skip to content

Commit 6c5e201

Browse files
committed
Small refactor of HTTPRequest, added ability to process body bytes that are not utf-8 decodable
1 parent 4b3e4f9 commit 6c5e201

File tree

1 file changed

+13
-20
lines changed

1 file changed

+13
-20
lines changed

adafruit_httpserver/request.py

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,24 @@ def __init__(
2323

2424
if raw_request is None: raise ValueError("raw_request cannot be None")
2525

26+
empty_line_index = raw_request.find(b"\r\n\r\n")
27+
28+
header_bytes = raw_request[:empty_line_index]
29+
body_bytes = raw_request[empty_line_index + 4:]
30+
2631
try:
27-
self.method, self.path, self.query_params, self.http_version = self._parse_start_line(raw_request)
28-
self.headers = self._parse_headers(raw_request)
29-
self.body = self._parse_body(raw_request)
32+
self.method, self.path, self.query_params, self.http_version = self._parse_start_line(header_bytes)
33+
self.headers = self._parse_headers(header_bytes)
34+
self.body = body_bytes
3035
except Exception as error:
3136
raise ValueError("Unparseable raw_request: ", raw_request) from error
3237

3338

3439
@staticmethod
35-
def _parse_start_line(raw_request: bytes) -> Tuple(str, str, Dict[str, str], str):
40+
def _parse_start_line(header_bytes: bytes) -> Tuple[str, str, Dict[str, str], str]:
3641
"""Parse HTTP Start line to method, path, query_params and http_version."""
3742

38-
start_line = raw_request.decode("utf8").splitlines()[0]
43+
start_line = header_bytes.decode("utf8").splitlines()[0]
3944

4045
method, path, http_version = start_line.split()
4146

@@ -48,20 +53,8 @@ def _parse_start_line(raw_request: bytes) -> Tuple(str, str, Dict[str, str], str
4853

4954

5055
@staticmethod
51-
def _parse_headers(raw_request: bytes) -> Dict[str, str]:
56+
def _parse_headers(header_bytes: bytes) -> Dict[str, str]:
5257
"""Parse HTTP headers from raw request."""
53-
parsed_request_lines = raw_request.decode("utf8").splitlines()
54-
empty_line = parsed_request_lines.index("")
55-
56-
return dict([header.split(": ", 1) for header in parsed_request_lines[1:empty_line]])
58+
header_lines = header_bytes.decode("utf8").splitlines()[1:]
5759

58-
59-
@staticmethod
60-
def _parse_body(raw_request: bytes) -> Dict[str, str]:
61-
"""Parse HTTP body from raw request."""
62-
parsed_request_lines = raw_request.decode("utf8").splitlines()
63-
empty_line = parsed_request_lines.index("")
64-
65-
if empty_line == len(parsed_request_lines) - 1:
66-
return None
67-
return "\r\n".join(parsed_request_lines[empty_line+1:])
60+
return dict([header.split(": ", 1) for header in header_lines[1:]])

0 commit comments

Comments
 (0)