Set a default Server header for HTTP responses (#396)

Co-authored-by: Carlton Gibson <carlton.gibson@noumenal.es>
This commit is contained in:
baseplate-admin 2022-05-24 16:40:02 +06:00 committed by GitHub
parent 87bc5a7975
commit 54745d0f83
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 37 additions and 9 deletions

View File

@ -11,7 +11,14 @@ Unreleased
range of versions does not represent a good use of maintainer time. Going range of versions does not represent a good use of maintainer time. Going
forward the latest Twisted version will be required. forward the latest Twisted version will be required.
* Added `log-fmt` CLI argument. * Set ``daphne`` as default ``Server`` header.
This can be configured with the ``--server-name`` CLI argument.
Added the new ``--no-server-name`` CLI argument to disable the ``Server``
header, which is equivalent to ``--server-name=` (an empty name).
* Added ``--log-fmt`` CLI argument.
3.0.2 (2021-04-07) 3.0.2 (2021-04-07)
------------------ ------------------

View File

@ -93,7 +93,7 @@ class CommandLineInterface:
self.parser.add_argument( self.parser.add_argument(
"--log-fmt", "--log-fmt",
help="Log format to use", help="Log format to use",
default="%(asctime)-15s %(levelname)-8s %(message)s" default="%(asctime)-15s %(levelname)-8s %(message)s",
) )
self.parser.add_argument( self.parser.add_argument(
"--ping-interval", "--ping-interval",
@ -162,7 +162,10 @@ class CommandLineInterface:
"--server-name", "--server-name",
dest="server_name", dest="server_name",
help="specify which value should be passed to response header Server attribute", help="specify which value should be passed to response header Server attribute",
default="Daphne", default="daphne",
)
self.parser.add_argument(
"--no-server-name", dest="server_name", action="store_const", const=""
) )
self.server = None self.server = None

View File

@ -249,8 +249,8 @@ class WebRequest(http.Request):
# Write headers # Write headers
for header, value in message.get("headers", {}): for header, value in message.get("headers", {}):
self.responseHeaders.addRawHeader(header, value) self.responseHeaders.addRawHeader(header, value)
if self.server.server_name and self.server.server_name.lower() != "daphne": if self.server.server_name and not self.responseHeaders.hasHeader("server"):
self.setHeader(b"server", self.server.server_name.encode("utf-8")) self.setHeader(b"server", self.server.server_name.encode())
logger.debug( logger.debug(
"HTTP %s response started for %s", message["status"], self.client_addr "HTTP %s response started for %s", message["status"], self.client_addr
) )

View File

@ -56,7 +56,7 @@ class Server:
websocket_handshake_timeout=5, websocket_handshake_timeout=5,
application_close_timeout=10, application_close_timeout=10,
ready_callable=None, ready_callable=None,
server_name="Daphne", server_name="daphne",
# Deprecated and does not work, remove in version 2.2 # Deprecated and does not work, remove in version 2.2
ws_protocols=None, ws_protocols=None,
): ):

View File

@ -240,3 +240,18 @@ class TestCLIInterface(TestCase):
exc.exception.message, exc.exception.message,
"--proxy-headers has to be passed for this parameter.", "--proxy-headers has to be passed for this parameter.",
) )
def test_custom_servername(self):
"""
Passing `--server-name` will set the default server header
from 'daphne' to the passed one.
"""
self.assertCLI([], {"server_name": "daphne"})
self.assertCLI(["--server-name", ""], {"server_name": ""})
self.assertCLI(["--server-name", "python"], {"server_name": "python"})
def test_no_servername(self):
"""
Passing `--no-server-name` will set server name to '' (empty string)
"""
self.assertCLI(["--no-server-name"], {"server_name": ""})

View File

@ -13,9 +13,12 @@ class TestHTTPResponse(DaphneTestCase):
Lowercases and sorts headers, and strips transfer-encoding ones. Lowercases and sorts headers, and strips transfer-encoding ones.
""" """
return sorted( return sorted(
[(b"server", b"daphne")]
+ [
(name.lower(), value.strip()) (name.lower(), value.strip())
for name, value in headers for name, value in headers
if name.lower() != b"transfer-encoding" if name.lower() not in (b"server", b"transfer-encoding")
]
) )
def encode_headers(self, headers): def encode_headers(self, headers):