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

1from itertools import chain 

2from typing import Dict 

3 

4from django.http import HttpRequest, HttpResponse 

5 

6from requests_tracker.base_collector import Collector 

7 

8 

9class HeaderCollector(Collector): 

10 """ 

11 Collects the request's HTTP headers. 

12 """ 

13 

14 request_headers: Dict[str, str] 

15 response_headers: Dict[str, str] 

16 environ: Dict[str, str] 

17 

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 } 

37 

38 def __init__(self) -> None: 

39 self.request_headers = {} 

40 self.response_headers = {} 

41 self.environ = {} 

42 

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 } 

52 

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 ) 

67 

68 def generate_statistics(self) -> None: ... 

69 

70 

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_") 

75 

76 

77def unmangle(key: str) -> str: 

78 return key[5:].replace("_", "-").title()