Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

avoid losing repeated HTTP headers #2266

Merged
Merged
Prev Previous commit
Next Next commit
fix fof wsgi, test in falcon
  • Loading branch information
samuelcolvin authored and ocelotl committed Mar 14, 2024
commit 2f6a9980634c19e8371e2b792058659ae5d24eff
Original file line number Diff line number Diff line change
@@ -490,6 +490,26 @@ def test_custom_request_header_added_in_server_span(self):
for key, _ in not_expected.items():
self.assertNotIn(key, span.attributes)

def test_repeated_request_header_added_in_server_span(self):
headers = [
("Custom-Test-Header-1", "Test Value 1"),
("Custom-Test-Header-1", "Test Value 2"),
]
self.client().simulate_request(
method="GET", path="/hello", headers=headers
)
span = self.memory_exporter.get_finished_spans()[0]
assert span.status.is_ok

expected = {
"http.request.header.custom_test_header_1": (
"Test Value 1,Test Value 2",
),
}

self.assertEqual(span.kind, trace.SpanKind.SERVER)
self.assertSpanHasAttributes(span, expected)

def test_custom_request_header_not_added_in_internal_span(self):
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("test", kind=trace.SpanKind.SERVER):
Original file line number Diff line number Diff line change
@@ -358,12 +358,15 @@ def collect_custom_request_headers_attributes(environ):
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SANITIZE_FIELDS
)
)
headers = {}

headers = {
key[_CARRIER_KEY_PREFIX_LEN:].replace("_", "-"): val
for key, val in environ.items()
if key.startswith(_CARRIER_KEY_PREFIX)
}
for key, val in environ.items():
if key.startswith(_CARRIER_KEY_PREFIX):
header_key = key[_CARRIER_KEY_PREFIX_LEN:].replace("_", "-").lower()
if header_key in headers:
headers[header_key] += "," + val
else:
headers[header_key] = val

return sanitize.sanitize_header_values(
headers,
@@ -387,7 +390,12 @@ def collect_custom_response_headers_attributes(response_headers):
)
response_headers_dict = {}
if response_headers:
response_headers_dict = dict(response_headers)
for key, val in response_headers:
key = key.lower()
if key in response_headers_dict:
response_headers_dict[key] += "," + val
else:
response_headers_dict[key] = val

return sanitize.sanitize_header_values(
response_headers_dict,