61 lines
1.8 KiB
Python
61 lines
1.8 KiB
Python
from django.utils.translation import gettext_lazy as _
|
|
|
|
from debug_toolbar.panels import Panel
|
|
|
|
|
|
class HeadersPanel(Panel):
|
|
"""
|
|
A panel to display HTTP headers.
|
|
"""
|
|
|
|
# List of environment variables we want to display
|
|
ENVIRON_FILTER = {
|
|
"CONTENT_LENGTH",
|
|
"CONTENT_TYPE",
|
|
"DJANGO_SETTINGS_MODULE",
|
|
"GATEWAY_INTERFACE",
|
|
"QUERY_STRING",
|
|
"PATH_INFO",
|
|
"PYTHONPATH",
|
|
"REMOTE_ADDR",
|
|
"REMOTE_HOST",
|
|
"REQUEST_METHOD",
|
|
"SCRIPT_NAME",
|
|
"SERVER_NAME",
|
|
"SERVER_PORT",
|
|
"SERVER_PROTOCOL",
|
|
"SERVER_SOFTWARE",
|
|
"TZ",
|
|
}
|
|
|
|
title = _("Headers")
|
|
|
|
template = "debug_toolbar/panels/headers.html"
|
|
|
|
def process_request(self, request):
|
|
wsgi_env = list(sorted(request.META.items()))
|
|
self.request_headers = {
|
|
unmangle(k): v for (k, v) in wsgi_env if is_http_header(k)
|
|
}
|
|
if "Cookie" in self.request_headers:
|
|
self.request_headers["Cookie"] = "=> see Request panel"
|
|
self.environ = {k: v for (k, v) in wsgi_env if k in self.ENVIRON_FILTER}
|
|
self.record_stats(
|
|
{"request_headers": self.request_headers, "environ": self.environ}
|
|
)
|
|
return super().process_request(request)
|
|
|
|
def generate_stats(self, request, response):
|
|
self.response_headers = dict(sorted(response.items()))
|
|
self.record_stats({"response_headers": self.response_headers})
|
|
|
|
|
|
def is_http_header(wsgi_key):
|
|
# The WSGI spec says that keys should be str objects in the environ dict,
|
|
# but this isn't true in practice. See issues #449 and #482.
|
|
return isinstance(wsgi_key, str) and wsgi_key.startswith("HTTP_")
|
|
|
|
|
|
def unmangle(wsgi_key):
|
|
return wsgi_key[5:].replace("_", "-").title()
|