8000 Merge pull request #864 from jezekra1/fix-asgi-app-openmetrics-encodi… · prometheus/client_python@1dfc910 · GitHub
[go: up one dir, main page]

Skip to content

Commit 1dfc910

Browse files
authored
Merge pull request #864 from jezekra1/fix-asgi-app-openmetrics-encoding-content-type
Fix wrong encoder used with `application/openmetrics-text` accept header
2 parents 89552cd + bab1f3b commit 1dfc910

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

prometheus_client/asgi.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ async def prometheus_app(scope, receive, send):
1212
assert scope.get("type") == "http"
1313
# Prepare parameters
1414
params = parse_qs(scope.get('query_string', b''))
15-
accept_header = "Accept: " + ",".join([
15+
accept_header = ",".join([
1616
value.decode("utf8") for (name, value) in scope.get('headers')
1717
if name.decode("utf8").lower() == 'accept'
1818
])

tests/test_asgi.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,19 @@ def get_all_output(self):
7575
break
7676
return outputs
7777

78+
def get_all_response_headers(self):
79+
outputs = self.get_all_output()
80+
response_start = next(o for o in outputs if o["type"] == "http.response.start")
81+
return response_start["headers"]
82+
83+
def get_response_header_value(self, header_name):
84+
response_headers = self.get_all_response_headers()
85+
return next(
86+
value.decode("utf-8")
87+
for name, value in response_headers
88+
if name.decode("utf-8") == header_name
89+
)
90+
7891
def increment_metrics(self, metric_name, help_text, increments):
7992
c = Counter(metric_name, help_text, registry=self.registry)
8093
for _ in range(increments):
@@ -158,3 +171,22 @@ def test_gzip_disabled(self):
158171
# Assert outputs are not compressed.
159172
outputs = self.get_all_output()
160173
self.assert_outputs(outputs, metric_name, help_text, increments, compressed=False)
174+
175+
def test_openmetrics_encoding(self):
176+
"""Response content type is application/openmetrics-text when appropriate Accept header is in request"""
177+
app = make_asgi_app(self.registry)
178+
self.seed_app(app)
179+
self.scope["headers"] = [(b"Accept", b"application/openmetrics-text")]
180+
self.send_input({"type": "http.request", "body": b""})
181+
182+
content_type = self.get_response_header_value('Content-Type').split(";")[0]
183+
assert content_type == "application/openmetrics-text"
184+
185+
def test_plaintext_encoding(self):
186+
"""Response content type is text/plain when Accept header is missing in request"""
187+
app = make_asgi_app(self.registry)
188+
self.seed_app(app)
189+
self.send_input({"type": "http.request", "body": b""})
190+
191+
content_type = self.get_response_header_value('Content-Type').split(";")[0]
192+
assert content_type == "text/plain"

0 commit comments

Comments
 (0)
0