diff --git a/sentry_sdk/tracing_utils.py b/sentry_sdk/tracing_utils.py index c3917fc31e..c2e34a795b 100644 --- a/sentry_sdk/tracing_utils.py +++ b/sentry_sdk/tracing_utils.py @@ -437,6 +437,14 @@ def extract_sentrytrace_data( if not header: return None + if "," in header: + # Multiple headers may have been combined into one comma-separated value (RFC 7230 3.2.2); use the first non-empty one. + parts = [part.strip() for part in header.split(",")] + header = next((part for part in parts if part), "") + + if not header: + return None + if header.startswith("00-") and header.endswith("-00"): header = header[3:-3] diff --git a/tests/tracing/test_http_headers.py b/tests/tracing/test_http_headers.py index 6a8467101e..1914347b2b 100644 --- a/tests/tracing/test_http_headers.py +++ b/tests/tracing/test_http_headers.py @@ -38,6 +38,27 @@ def test_sentrytrace_extraction(sampling_decision): } +def test_sentrytrace_extraction_multiple_headers(): + sentrytrace_header = ( + "12312012123120121231201212312012-0415201309082013-1," + "12312012123120121231201212312012-0000000000000000-0" + ) + assert extract_sentrytrace_data(sentrytrace_header) == { + "trace_id": "12312012123120121231201212312012", + "parent_span_id": "0415201309082013", + "parent_sampled": True, + } + + +def test_sentrytrace_extraction_leading_empty_fragment(): + sentrytrace_header = ",12312012123120121231201212312012-0415201309082013-1" + assert extract_sentrytrace_data(sentrytrace_header) == { + "trace_id": "12312012123120121231201212312012", + "parent_span_id": "0415201309082013", + "parent_sampled": True, + } + + def test_iter_headers(monkeypatch): monkeypatch.setattr( Transaction,