diff --git a/.gitignore b/.gitignore index 6c73723..dc6824d 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,5 @@ dist docs/_build/ htmlcov pip-wheel-metadata +.vscode +.venv \ No newline at end of file diff --git a/src/kubernetes_wsgi/__main__.py b/src/kubernetes_wsgi/__main__.py index edeb432..4d666f9 100644 --- a/src/kubernetes_wsgi/__main__.py +++ b/src/kubernetes_wsgi/__main__.py @@ -60,6 +60,11 @@ def parse_args(argv: Sequence[Text]) -> Dict[str, Any]: default=20, help="Maximum number of threads to run", ) + parser.add_argument( + "--hide-server", + action="store_true", + help="Hides server version in HTTP header" + ) args = parser.parse_args(argv) return { "application": args.application, @@ -68,6 +73,7 @@ def parse_args(argv: Sequence[Text]) -> Dict[str, Any]: "health_check_path": args.health_check_path, "min_threads": args.min_threads, "max_threads": args.max_threads, + "hide_server": args.hide_server, } diff --git a/src/kubernetes_wsgi/server.py b/src/kubernetes_wsgi/server.py index f586875..6e9299d 100644 --- a/src/kubernetes_wsgi/server.py +++ b/src/kubernetes_wsgi/server.py @@ -1,8 +1,8 @@ import logging + # This is a fake import, only used during type checking. from typing import TYPE_CHECKING, Callable - from prometheus_client import REGISTRY # type: ignore from prometheus_client.twisted import MetricsResource # type: ignore from twisted import logger # type: ignore @@ -17,7 +17,6 @@ from .metrics import TwistedThreadPoolCollector - if TYPE_CHECKING: from wsgiref.types import WSGIApplication @@ -28,7 +27,8 @@ class KubernetesWSGISite(Site): """Extension to Site to ignore heath checks for access logging.""" - def __init__(self, health_check_path: str, *args, **kwargs): + def __init__(self, health_check_path: str, hide_server: bool = False, *args, **kwargs): + self.hide_server = hide_server self.__health_check_path = health_check_path super().__init__(*args, **kwargs) @@ -36,6 +36,12 @@ def log(self, request): path = request.path.decode() if path != self.__health_check_path: return super().log(request) + + def getResourceFor(self, request): + if self.hide_server: + request.setHeader(b'server', b"") + + return super().getResourceFor(request) class MetricsSite(Site): @@ -53,6 +59,7 @@ def serve( health_check_path: str = "/healthz", min_threads: int = 5, max_threads: int = 20, + hide_server: bool = True, ): # Quiet the Twisted factory logging. Factory.noisy = False @@ -76,6 +83,7 @@ def serve( port, access_log_formatter, health_check_path, + hide_server, ) _listen_metrics(reactor, metrics_port) @@ -96,6 +104,7 @@ def _listen_wsgi( port: int, access_log_formatter: LogFormatter, health_check_path: str, + hide_server: bool, ) -> None: """Listen for the WSGI application.""" wsgi_resource = WSGIResource(reactor, pool, application)