1616from sentry_sdk import capture_message , continue_trace , start_transaction
1717from sentry_sdk .consts import MATCH_ALL , SPANDATA
1818from sentry_sdk .integrations .stdlib import StdlibIntegration
19+ from sentry_sdk .utils import get_aws_sigv4_signed_headers
1920from tests .conftest import ApproxDict , create_mock_http_server , get_free_port
2021
2122PORT = 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