feat: send HSTS header
This commit is contained in:
+11
-3
@@ -29,6 +29,10 @@ class BaseHandler(abc.ABC, http.server.BaseHTTPRequestHandler):
|
|||||||
timeout = 10
|
timeout = 10
|
||||||
protocol_version = "HTTP/1.1"
|
protocol_version = "HTTP/1.1"
|
||||||
REQUEST_COUNT = 0
|
REQUEST_COUNT = 0
|
||||||
|
RESPONSE_HEADERS: typing.ClassVar = {
|
||||||
|
"Connection": "close",
|
||||||
|
"Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload",
|
||||||
|
}
|
||||||
|
|
||||||
@typing.override
|
@typing.override
|
||||||
def __init__(
|
def __init__(
|
||||||
@@ -151,7 +155,7 @@ class BaseHandler(abc.ABC, http.server.BaseHTTPRequestHandler):
|
|||||||
self.send_response(code, message)
|
self.send_response(code, message)
|
||||||
self.send_header("Content-Type", f"{content_type}; charset=UTF-8")
|
self.send_header("Content-Type", f"{content_type}; charset=UTF-8")
|
||||||
self.send_header("Content-Length", str(len(encoded)))
|
self.send_header("Content-Length", str(len(encoded)))
|
||||||
self.send_header("Connection", "close")
|
self._send_basic_headers()
|
||||||
self.end_headers()
|
self.end_headers()
|
||||||
if self.command != http.HTTPMethod.HEAD:
|
if self.command != http.HTTPMethod.HEAD:
|
||||||
self.wfile.write(encoded)
|
self.wfile.write(encoded)
|
||||||
@@ -167,7 +171,7 @@ class BaseHandler(abc.ABC, http.server.BaseHTTPRequestHandler):
|
|||||||
headers = {}
|
headers = {}
|
||||||
self.send_response(code, message)
|
self.send_response(code, message)
|
||||||
self.send_header("Content-Length", "0")
|
self.send_header("Content-Length", "0")
|
||||||
self.send_header("Connection", "close")
|
self._send_basic_headers()
|
||||||
for header, value in headers.items():
|
for header, value in headers.items():
|
||||||
self.send_header(header, value)
|
self.send_header(header, value)
|
||||||
self.end_headers()
|
self.end_headers()
|
||||||
@@ -221,7 +225,7 @@ class BaseHandler(abc.ABC, http.server.BaseHTTPRequestHandler):
|
|||||||
]:
|
]:
|
||||||
self.send_header(header, value.replace(target_host, self.host))
|
self.send_header(header, value.replace(target_host, self.host))
|
||||||
self.send_header("Content-Length", str(out_size := len(response.content)))
|
self.send_header("Content-Length", str(out_size := len(response.content)))
|
||||||
self.send_header("Connection", "close")
|
self._send_basic_headers()
|
||||||
self.end_headers()
|
self.end_headers()
|
||||||
if out_size > 0 and self.command != http.HTTPMethod.HEAD:
|
if out_size > 0 and self.command != http.HTTPMethod.HEAD:
|
||||||
self.wfile.write(response.content)
|
self.wfile.write(response.content)
|
||||||
@@ -269,6 +273,10 @@ class BaseHandler(abc.ABC, http.server.BaseHTTPRequestHandler):
|
|||||||
self.send_error(http.HTTPStatus.INTERNAL_SERVER_ERROR, str(e))
|
self.send_error(http.HTTPStatus.INTERNAL_SERVER_ERROR, str(e))
|
||||||
self.logger.exception("Internal Server Error")
|
self.logger.exception("Internal Server Error")
|
||||||
|
|
||||||
|
def _send_basic_headers(self) -> None:
|
||||||
|
for header, value in self.RESPONSE_HEADERS.items():
|
||||||
|
self.send_header(header, value)
|
||||||
|
|
||||||
|
|
||||||
class RequestHandler(http.server.SimpleHTTPRequestHandler, BaseHandler):
|
class RequestHandler(http.server.SimpleHTTPRequestHandler, BaseHandler):
|
||||||
protocol_version = "HTTP/1.1"
|
protocol_version = "HTTP/1.1"
|
||||||
|
|||||||
Reference in New Issue
Block a user