2525 get_hexadecimal_trace_id ,
2626)
2727
28- _TRACE_CONTEXT_HEADER_NAME = "X-Cloud-Trace-Context "
28+ _TRACE_CONTEXT_HEADER_NAME = "x-cloud-trace-context "
2929_TRACE_CONTEXT_HEADER_FORMAT = r"(?P<trace_id>[0-9a-f]{32})\/(?P<span_id>[\d]{1,20});o=(?P<trace_flags>\d+)"
3030_TRACE_CONTEXT_HEADER_RE = re .compile (_TRACE_CONTEXT_HEADER_FORMAT )
3131_FIELDS = {_TRACE_CONTEXT_HEADER_NAME }
@@ -37,18 +37,36 @@ class CloudTraceFormatPropagator(textmap.TextMapPropagator):
3737 Cloud format.
3838 """
3939
40+ @staticmethod
41+ def _get_header_value (
42+ getter : textmap .Getter [textmap .TextMapPropagatorT ],
43+ carrier : textmap .TextMapPropagatorT ,
44+ ) -> typing .Optional [str ]:
45+ # first try all lowercase header
46+ header = getter .get (carrier , _TRACE_CONTEXT_HEADER_NAME )
47+ if header :
48+ return header [0 ]
49+
50+ # otherwise try to find in keys for mixed case
51+ for key in getter .keys (carrier ):
52+ if key .lower () == _TRACE_CONTEXT_HEADER_NAME :
53+ header = getter .get (carrier , key )
54+ if header :
55+ return header [0 ]
56+ return None
57+
4058 def extract (
4159 self ,
4260 getter : textmap .Getter [textmap .TextMapPropagatorT ],
4361 carrier : textmap .TextMapPropagatorT ,
4462 context : typing .Optional [Context ] = None ,
4563 ) -> Context :
46- header = getter . get ( carrier , _TRACE_CONTEXT_HEADER_NAME )
64+ header = self . _get_header_value ( getter , carrier )
4765
4866 if not header :
4967 return trace .set_span_in_context (trace .INVALID_SPAN , context )
5068
51- match = re .fullmatch (_TRACE_CONTEXT_HEADER_RE , header [ 0 ] )
69+ match = re .fullmatch (_TRACE_CONTEXT_HEADER_RE , header )
5270 if match is None :
5371 return trace .set_span_in_context (trace .INVALID_SPAN , context )
5472
0 commit comments