import json
import os
import sys
from urllib.parse import parse_qsl
import hashlib
import re
METHOD = "method"
QUERY = "query"
SCHEME = "scheme"
HOST = "host"
PATH = "path"
REQUEST = "request"
HEADER = "header"
HEADERS = "headers"
TEXT = "text"
NAME = "name"
FIRST_LINE = "firstLine"
RESPONSE = "response"
VALUE = "value"
BODY = "body"
STATUS = "status"
TIMES = "times"
START = "start"
DURATIONS = "durations"
TOTAL = "total"
DNS = "dns"
CONNECT = "connect"
SSL = "ssl"
LATENCY = "latency"
def value(data, *keys):
current = data
for k in keys:
if k in current:
current = current[k]
else:
return None
return current
class Request(object):
def __init__(self, request_data):
self.data = request_data
def method(self):
return self.data[METHOD]
def url(self):
scheme = self.data[SCHEME]
host = self.data[HOST] + self.data[PATH] if self.data[PATH] else self.data[HOST]
return f"{scheme}://{host}"
def full_url(self):
url = self.url()
params = self.params_as_text()
if params:
url = f"{url}?{params}"
return url
def headers(self):
header_data = value(self.data, REQUEST, HEADER, HEADERS)
headers = dict()
for header in header_data:
headers[header[NAME]] = header[VALUE]
return headers
def params(self):
query = self.data[QUERY]
if query:
return dict(parse_qsl(query))
return {}
def params_as_text(self):
return self.data[QUERY]
def body(self):
return value(self.data, BODY, TEXT)
def response_status(self):
return value(self.data, RESPONSE, STATUS)
def response_header_first_line(self):
return value(self.data, RESPONSE, HEADER, FIRST_LINE)
def response_body(self):
return value(self.data, BODY, TEXT)
def response_headers(self):
header_data = value(self.data, RESPONSE, HEADER, HEADERS)
headers = dict()
for header in headers:
headers[header[NAME]] = header[VALUE]
return headers