Skip to content

Commit af905db

Browse files
committed
test(httplib): Add tests for SigV4 signed headers
Refs: #7031 & PY-2667
1 parent e40e931 commit af905db

1 file changed

Lines changed: 59 additions & 5 deletions

File tree

tests/integrations/stdlib/test_httplib.py

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from sentry_sdk import capture_message, continue_trace, start_transaction
1717
from sentry_sdk.consts import MATCH_ALL, SPANDATA
1818
from sentry_sdk.integrations.stdlib import StdlibIntegration
19+
from sentry_sdk.utils import get_aws_sigv4_signed_headers
1920
from tests.conftest import ApproxDict, create_mock_http_server, get_free_port
2021

2122
PORT = create_mock_http_server()
@@ -99,9 +100,9 @@ def do_POST(self):
99100
thread.join()
100101

101102

102-
def _request(server, headers):
103+
def _request(server, headers, path="/"):
103104
connection = HTTPConnection("127.0.0.1", server.server_port)
104-
connection.putrequest("POST", "/")
105+
connection.putrequest("POST", path)
105106

106107
for key, value in headers:
107108
connection.putheader(key, value)
@@ -575,7 +576,7 @@ def test_outgoing_trace_headers_append_to_unsigned_baggage(
575576
)
576577
server, requests = local_http_server
577578

578-
with mock.patch("sentry_sdk.tracing_utils.Random.randrange", return_value=500000):
579+
with mock.patch("sentry_sdk.tracing_utils.Random.randrange", return_value=67):
579580
if span_streaming:
580581
with sentry_sdk.traces.start_span(name="test"): # type: ignore[attr-defined]
581582
_request(server, [("baggage", "vendor=value")])
@@ -585,13 +586,13 @@ def test_outgoing_trace_headers_append_to_unsigned_baggage(
585586

586587
headers = requests[0]
587588

589+
# preserve existing unsigned baggage
588590
baggage_headers = headers.get_all("baggage")
589591
assert baggage_headers is not None
590-
# preserve existing unsigned baggage
591592
assert len(baggage_headers) == 2
592593
assert baggage_headers[0] == "vendor=value"
593594
assert baggage_headers[1].count("sentry-trace_id=") == 1
594-
assert "sentry-sample_rand=0.500000" in baggage_headers[1]
595+
assert "sentry-sample_rand=0.000067" in baggage_headers[1]
595596
assert len(headers.get_all("sentry-trace")) == 1
596597

597598

@@ -642,6 +643,59 @@ def test_outgoing_trace_headers_skip_signed_baggage(
642643
assert headers.get_all("baggage") == ["vendor=value"]
643644
# preserves existing `sentry-trace` header.
644645
assert headers.get_all("sentry-trace") == ["existing-trace"]
646+
assert get_aws_sigv4_signed_headers(headers=headers) >= {
647+
"baggage",
648+
"host",
649+
"sentry-trace",
650+
}
651+
652+
653+
@pytest.mark.parametrize("span_streaming", [False, True])
654+
def test_outgoing_trace_headers_skip_query_signed_baggage(
655+
sentry_init, local_http_server, span_streaming
656+
):
657+
sentry_init(
658+
traces_sample_rate=1.0,
659+
trace_lifecycle="stream" if span_streaming else "static",
660+
default_integrations=False,
661+
integrations=[StdlibIntegration()],
662+
)
663+
server, requests = local_http_server
664+
path = (
665+
"/"
666+
"?X-Amz-Algorithm=AWS4-HMAC-SHA256"
667+
"&X-Amz-Credential="
668+
"test%2F20260804%2Feu-west-1%2Fs3%2Faws4_request"
669+
"&X-Amz-Date=20260804T120000Z"
670+
"&X-Amz-Expires=60"
671+
"&X-Amz-SignedHeaders=baggage%3Bhost"
672+
"&X-Amz-Signature=sixtyseven"
673+
)
674+
675+
if span_streaming:
676+
with sentry_sdk.traces.start_span(name="test"): # type: ignore[attr-defined]
677+
_request(
678+
server,
679+
[("baggage", "vendor=value")],
680+
path=path,
681+
)
682+
else:
683+
with sentry_sdk.start_transaction(name="test", sampled=True):
684+
_request(
685+
server,
686+
[("baggage", "vendor=value")],
687+
path=path,
688+
)
689+
690+
headers = requests[0]
691+
# `baggage` is part of X-Amz-SignedHeaders, so may not be modified.
692+
assert len(headers.get_all("baggage")) == 1
693+
assert headers["baggage"] == "vendor=value"
694+
# `sentry-trace` was not signed, so it can be propagated.
695+
assert len(headers.get_all("sentry-trace")) == 1
696+
assert get_aws_sigv4_signed_headers(
697+
headers=headers, url=f"http://127.0.0.1:{server.server_port}{path}"
698+
) >= {"baggage", "host"}
645699

646700

647701
@pytest.mark.parametrize(

0 commit comments

Comments
 (0)