diff --git a/website/tests/test_version_endpoint.py b/website/tests/test_version_endpoint.py index 2fa39080..1020d0f2 100644 --- a/website/tests/test_version_endpoint.py +++ b/website/tests/test_version_endpoint.py @@ -56,6 +56,17 @@ def test_payload_from_settings_and_no_store_header(self): # Always present, even without a build-info file. self.assertIn("git_sha", data) self.assertIn("built_at", data) + # The live WSGI server's self-reported SERVER_SOFTWARE (#1034); always + # present so we can confirm gunicorn vs. the dev runserver in deploys. + self.assertIn("server", data) + + def test_server_reflects_wsgi_server_software(self): + # The view reports request.META["SERVER_SOFTWARE"] verbatim; on the real + # servers that's "gunicorn/" after #1034. Simulate it here. + data = json.loads( + self.client.get("/version/", SERVER_SOFTWARE="gunicorn/23.0.0").content + ) + self.assertEqual(data["server"], "gunicorn/23.0.0") def test_build_info_missing_falls_back_to_unknown(self): with override_settings(): diff --git a/website/views/version.py b/website/views/version.py index 895e3aaa..3f0a9de6 100644 --- a/website/views/version.py +++ b/website/views/version.py @@ -25,8 +25,14 @@ "description": "Fix the project listing page ...", "environment": "PROD", "git_sha": "02909b0", - "built_at": "2026-06-21T18:30:00-07:00" + "built_at": "2026-06-21T18:30:00-07:00", + "server": "gunicorn/23.0.0" } + +The ``server`` field is the WSGI server's self-reported ``SERVER_SOFTWARE`` +(``gunicorn/`` vs. Django's ``WSGIServer/ CPython/``), read off +the live request -- it's the ground-truth answer to *"is this actually running +Gunicorn?"* after the #1034 swap, not an inference from env vars or git_sha. """ import json @@ -83,6 +89,9 @@ def version(request, format=None): "environment": settings.DJANGO_ENV or "unknown", "git_sha": build_info["git_sha"], "built_at": build_info["built_at"], + # WSGI server handling this request: "gunicorn/" under #1034, + # "WSGIServer/ CPython/" if the dev runserver is somehow live. + "server": request.META.get("SERVER_SOFTWARE", "unknown"), } response = JsonResponse(payload) response["Cache-Control"] = "no-store"