@@ -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