Skip to content

Commit a381c2e

Browse files
committed
Add latin-1 fallback decoding for asgi headers
1 parent 135280e commit a381c2e

File tree

1 file changed

+20
-14
lines changed
  • instrumentation/opentelemetry-instrumentation-asgi/src/opentelemetry/instrumentation/asgi

1 file changed

+20
-14
lines changed

Diff for: instrumentation/opentelemetry-instrumentation-asgi/src/opentelemetry/instrumentation/asgi/__init__.py

+20-14
Original file line numberDiff line numberDiff line change
@@ -251,17 +251,15 @@ def get(
251251
# ASGI header keys are in lower case
252252
key = key.lower()
253253
decoded = [
254-
_value.decode("utf8")
254+
_decode_header_item(_value)
255255
for (_key, _value) in headers
256-
if _key.decode("utf8").lower() == key
256+
if _decode_header_item(_key).lower() == key
257257
]
258-
if not decoded:
259-
return None
260-
return decoded
258+
return decoded or None
261259

262260
def keys(self, carrier: dict) -> typing.List[str]:
263261
headers = carrier.get("headers") or []
264-
return [_key.decode("utf8") for (_key, _value) in headers]
262+
return [_decode_header_item(_key) for (_key, _value) in headers]
265263

266264

267265
asgi_getter = ASGIGetter()
@@ -344,10 +342,7 @@ def collect_custom_request_headers_attributes(scope):
344342
)
345343

346344
# Decode headers before processing.
347-
headers = {
348-
_key.decode("utf8"): _value.decode("utf8")
349-
for (_key, _value) in scope.get("headers")
350-
}
345+
headers = _decode_headers(scope.get("headers"))
351346

352347
return sanitize.sanitize_header_values(
353348
headers,
@@ -370,10 +365,7 @@ def collect_custom_response_headers_attributes(message):
370365
)
371366

372367
# Decode headers before processing.
373-
headers = {
374-
_key.decode("utf8"): _value.decode("utf8")
375-
for (_key, _value) in message.get("headers")
376-
}
368+
headers = _decode_headers(message.get("headers"))
377369

378370
return sanitize.sanitize_header_values(
379371
headers,
@@ -657,3 +649,17 @@ async def otel_send(message):
657649
await send(message)
658650

659651
return otel_send
652+
653+
654+
def _decode_headers(headers):
655+
return {
656+
_decode_header_item(key): _decode_header_item(value)
657+
for key, value in headers
658+
}
659+
660+
661+
def _decode_header_item(value):
662+
try:
663+
return value.decode("utf-8")
664+
except ValueError:
665+
return value.decode("latin-1")

0 commit comments

Comments
 (0)