@@ -23,19 +23,24 @@ def __init__(
23
23
24
24
if raw_request is None : raise ValueError ("raw_request cannot be None" )
25
25
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
+
26
31
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
30
35
except Exception as error :
31
36
raise ValueError ("Unparseable raw_request: " , raw_request ) from error
32
37
33
38
34
39
@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 ] :
36
41
"""Parse HTTP Start line to method, path, query_params and http_version."""
37
42
38
- start_line = raw_request .decode ("utf8" ).splitlines ()[0 ]
43
+ start_line = header_bytes .decode ("utf8" ).splitlines ()[0 ]
39
44
40
45
method , path , http_version = start_line .split ()
41
46
@@ -48,20 +53,8 @@ def _parse_start_line(raw_request: bytes) -> Tuple(str, str, Dict[str, str], str
48
53
49
54
50
55
@staticmethod
51
- def _parse_headers (raw_request : bytes ) -> Dict [str , str ]:
56
+ def _parse_headers (header_bytes : bytes ) -> Dict [str , str ]:
52
57
"""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 :]
57
59
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