in pyrit/prompt_target/http_target/http_target.py [0:0]
def parse_raw_http_request(self, http_request: str) -> tuple[dict[str, str], RequestBody, str, str, str]:
"""
Parses the HTTP request string into a dictionary of headers
Parameters:
http_request: the header parameters as a request str with
prompt already injected
Returns:
headers_dict (dict): dictionary of all http header values
body (str): string with body data
url (str): string with URL
http_method (str): method (ie GET vs POST)
http_version (str): HTTP version to use
"""
headers_dict = {}
if not http_request:
return {}, "", "", "", ""
body = ""
# Split the request into headers and body by finding the double newlines (\n\n)
request_parts = http_request.strip().split("\n\n", 1)
# Parse out the header components
header_lines = request_parts[0].strip().split("\n")
http_req_info_line = header_lines[0].split(" ") # get 1st line like POST /url_ending HTTP_VSN
header_lines = header_lines[1:] # rest of the raw request is the headers info
# Loop through each line and split into key-value pairs
for line in header_lines:
key, value = line.split(":", 1)
headers_dict[key.strip().lower()] = value.strip()
if "content-length" in headers_dict:
del headers_dict["content-length"]
if len(request_parts) > 1:
# Parse as JSON object if it can be parsed that way
try:
body = json.loads(request_parts[1], strict=False) # Check if valid json
body = json.dumps(body)
except json.JSONDecodeError:
body = request_parts[1]
if len(http_req_info_line) != 3:
raise ValueError("Invalid HTTP request line")
# Capture info from 1st line of raw request
http_method = http_req_info_line[0]
url_path = http_req_info_line[1]
full_url = self._infer_full_url_from_host(path=url_path, headers_dict=headers_dict)
http_version = http_req_info_line[2]
return headers_dict, body, full_url, http_method, http_version