Skip to content

Commit 450ee79

Browse files
committed
Refactor of _HTTPRequest
Changed name and added new attributes to HTTPRequest like method, path, query_params, http_version, headers and body
1 parent 4101db8 commit 450ee79

File tree

2 files changed

+62
-24
lines changed

2 files changed

+62
-24
lines changed

adafruit_httpserver/request.py

Lines changed: 60 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,64 @@
1+
from typing import Dict, Tuple
2+
3+
4+
class HTTPRequest:
5+
6+
method: str
7+
path: str
8+
query_params: Dict[str, str] = {}
9+
http_version: str
10+
11+
headers: Dict[str, str] = {}
12+
body: bytes | None
13+
14+
raw_request: bytes
115

2-
class _HTTPRequest:
316
def __init__(
4-
self, path: str = "", method: str = "", raw_request: bytes = None
17+
self, raw_request: bytes = None
518
) -> None:
619
self.raw_request = raw_request
7-
if raw_request is None:
8-
self.path = path
9-
self.method = method
10-
else:
11-
# Parse request data from raw request
12-
request_text = raw_request.decode("utf8")
13-
first_line = request_text[: request_text.find("\n")]
14-
try:
15-
(self.method, self.path, _httpversion) = first_line.split()
16-
except ValueError as exc:
17-
raise ValueError("Unparseable raw_request: ", raw_request) from exc
18-
19-
def __hash__(self) -> int:
20-
return hash(self.method) ^ hash(self.path)
21-
22-
def __eq__(self, other: "_HTTPRequest") -> bool:
23-
return self.method == other.method and self.path == other.path
24-
25-
def __repr__(self) -> str:
26-
return f"_HTTPRequest(path={repr(self.path)}, method={repr(self.method)})"
20+
21+
if raw_request is None: raise ValueError("raw_request cannot be None")
22+
23+
try:
24+
self.method, self.path, self.query_params, self.http_version = self.parse_start_line(raw_request)
25+
self.headers = self.parse_headers(raw_request)
26+
self.body = self.parse_body(raw_request)
27+
except Exception as error:
28+
raise ValueError("Unparseable raw_request: ", raw_request) from error
29+
30+
31+
@staticmethod
32+
def parse_start_line(raw_request: bytes) -> Tuple(str, str, Dict[str, str], str):
33+
"""Parse HTTP Start line to method, path, query_params and http_version."""
34+
35+
start_line = raw_request.decode("utf8").splitlines()[0]
36+
37+
method, path, http_version = start_line.split()
38+
39+
if "?" not in path: path += "?"
40+
41+
path, query_string = path.split("?", 1)
42+
query_params = dict([param.split("=", 1) for param in query_string.split("&")]) if query_string else {}
43+
44+
return method, path, query_params, http_version
45+
46+
47+
@staticmethod
48+
def parse_headers(raw_request: bytes) -> Dict[str, str]:
49+
"""Parse HTTP headers from raw request."""
50+
parsed_request_lines = raw_request.decode("utf8").splitlines()
51+
empty_line = parsed_request_lines.index("")
52+
53+
return dict([header.split(": ", 1) for header in parsed_request_lines[1:empty_line]])
54+
55+
56+
@staticmethod
57+
def parse_body(raw_request: bytes) -> Dict[str, str]:
58+
"""Parse HTTP body from raw request."""
59+
parsed_request_lines = raw_request.decode("utf8").splitlines()
60+
empty_line = parsed_request_lines.index("")
61+
62+
if empty_line == len(parsed_request_lines) - 1:
63+
return None
64+
return "\r\n".join(parsed_request_lines[empty_line+1:])

adafruit_httpserver/server.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from errno import EAGAIN, ECONNRESET
77

88
from .methods import HTTPMethod
9-
from .request import _HTTPRequest
9+
from .request import HTTPRequest
1010
from .response import HTTPResponse
1111
from .status import HTTPStatus
1212

@@ -94,7 +94,7 @@ def poll(self):
9494
conn.setblocking(True)
9595
length, _ = conn.recvfrom_into(self._buffer)
9696

97-
request = _HTTPRequest(raw_request=self._buffer[:length])
97+
request = HTTPRequest(raw_request=self._buffer[:length])
9898

9999
# If a route exists for this request, call it. Otherwise try to serve a file.
100100
route = self.routes.get(request, None)

0 commit comments

Comments
 (0)