Coverage for requests_tracker/headers/header_collector.py: 100%
26 statements
« prev ^ index » next coverage.py v7.4.4, created at 2024-04-18 22:19 +0000
« prev ^ index » next coverage.py v7.4.4, created at 2024-04-18 22:19 +0000
1from itertools import chain
2from typing import Dict
4from django.http import HttpRequest, HttpResponse
6from requests_tracker.base_collector import Collector
9class HeaderCollector(Collector):
10 """
11 Collects the request's HTTP headers.
12 """
14 request_headers: Dict[str, str]
15 response_headers: Dict[str, str]
16 environ: Dict[str, str]
18 # List of environment variables we want to display
19 ENVIRON_FILTER = {
20 "CONTENT_LENGTH",
21 "CONTENT_TYPE",
22 "DJANGO_SETTINGS_MODULE",
23 "GATEWAY_INTERFACE",
24 "QUERY_STRING",
25 "PATH_INFO",
26 "PYTHONPATH",
27 "REMOTE_ADDR",
28 "REMOTE_HOST",
29 "REQUEST_METHOD",
30 "SCRIPT_NAME",
31 "SERVER_NAME",
32 "SERVER_PORT",
33 "SERVER_PROTOCOL",
34 "SERVER_SOFTWARE",
35 "TZ",
36 }
38 def __init__(self) -> None:
39 self.request_headers = {}
40 self.response_headers = {}
41 self.environ = {}
43 def process_request(self, request: HttpRequest, response: HttpResponse) -> None:
44 request_env = sorted(request.META.items())
45 self.request_headers = {
46 unmangle(key): value for (key, value) in request_env if is_http_header(key)
47 }
48 self.response_headers = dict(response.items())
49 self.environ = {
50 key: value for (key, value) in request_env if key in self.ENVIRON_FILTER
51 }
53 def matches_search_filter(self, search: str) -> bool:
54 search = search.lower()
55 return next(
56 (
57 True
58 for header_value in chain(
59 self.request_headers.values(),
60 self.response_headers.values(),
61 self.environ.values(),
62 )
63 if search in header_value.lower()
64 ),
65 False,
66 )
68 def generate_statistics(self) -> None: ...
71def is_http_header(key: str) -> bool:
72 # The WSGI spec says that keys should be str objects in the environ dict,
73 # but this isn't true in practice. See issues #449 and #482.
74 return isinstance(key, str) and key.startswith("HTTP_")
77def unmangle(key: str) -> str:
78 return key[5:].replace("_", "-").title()