@@ -445,7 +445,88 @@ func Test257CharacterDDTracestateLengh(t *testing.T) {
445445 ddTag := strings .SplitN (headers [tracestateHeader ], "," , 2 )[0 ]
446446 assert .Contains (ddTag , "s:2" )
447447 assert .Regexp (regexp .MustCompile (`dd=[\w:,]+` ), ddTag )
448- assert .LessOrEqual (len (ddTag ), 256 ) // one of the propagated tags will not be propagated
448+ assert .LessOrEqual (len (ddTag ), tracestateDDMaxSize ) // one of the propagated tags will not be propagated
449+ }
450+
451+ func TestExtractTracestateDropsOversizedDD (t * testing.T ) {
452+ t .Setenv (headerPropagationStyle , "tracecontext" )
453+ tracer , err := newTracer ()
454+ require .NoError (t , err )
455+ defer tracer .Stop ()
456+
457+ // Build a dd= entry that exceeds tracestateDDMaxSize.
458+ ddEntry := "dd=s:1;o:rum;p:0000000000000001;t.foo:" + strings .Repeat ("a" , tracestateDDMaxSize )
459+ require .Greater (t , len (ddEntry ), tracestateDDMaxSize )
460+ rawTracestate := ddEntry + ",vendor1=v1,vendor2=v2"
461+
462+ headers := TextMapCarrier (map [string ]string {
463+ traceparentHeader : "00-00000000000000000000000000000004-2222222222222222-01" ,
464+ tracestateHeader : rawTracestate ,
465+ })
466+ sctx , err := tracer .Extract (headers )
467+ require .NoError (t , err )
468+
469+ // Oversized dd entry must not appear in the stored propagating tag.
470+ stored := sctx .trace .propagatingTag (tracestateHeader )
471+ assert .NotContains (t , stored , "dd=" )
472+ assert .Contains (t , stored , "vendor1=v1" )
473+ assert .Contains (t , stored , "vendor2=v2" )
474+ // dd entry was not parsed, so its origin/reparentID were not extracted.
475+ assert .Empty (t , sctx .origin )
476+ assert .Empty (t , sctx .reparentID )
477+ // And no _dd.p.foo propagating tag was created from t.foo.
478+ assert .False (t , sctx .trace .hasPropagatingTag ("_dd.p.foo" ))
479+ }
480+
481+ func TestExtractTracestateKeepsDDAtBoundary (t * testing.T ) {
482+ t .Setenv (headerPropagationStyle , "tracecontext" )
483+ tracer , err := newTracer ()
484+ require .NoError (t , err )
485+ defer tracer .Stop ()
486+
487+ // dd= entry exactly at the limit should be kept and parsed.
488+ prefix := "dd=s:1;t.foo:"
489+ ddEntry := prefix + strings .Repeat ("a" , tracestateDDMaxSize - len (prefix ))
490+ require .Equal (t , tracestateDDMaxSize , len (ddEntry ))
491+
492+ headers := TextMapCarrier (map [string ]string {
493+ traceparentHeader : "00-00000000000000000000000000000004-2222222222222222-01" ,
494+ tracestateHeader : ddEntry + ",vendor1=v1" ,
495+ })
496+ sctx , err := tracer .Extract (headers )
497+ require .NoError (t , err )
498+
499+ stored := sctx .trace .propagatingTag (tracestateHeader )
500+ assert .Contains (t , stored , "dd=" )
501+ assert .Contains (t , stored , "vendor1=v1" )
502+ assert .True (t , sctx .trace .hasPropagatingTag ("_dd.p.foo" ))
503+ }
504+
505+ func TestExtractTracestateDropsOversizedDDWithWhitespace (t * testing.T ) {
506+ t .Setenv (headerPropagationStyle , "tracecontext" )
507+ tracer , err := newTracer ()
508+ require .NoError (t , err )
509+ defer tracer .Stop ()
510+
511+ // Same as the basic oversized-dd case but with leading OWS on the dd entry.
512+ // W3C list-member parsing allows surrounding whitespace, so the prefix and
513+ // length check must trim each entry before evaluating it.
514+ ddEntry := " dd=s:1;o:rum;p:0000000000000001;t.foo:" + strings .Repeat ("a" , tracestateDDMaxSize )
515+ rawTracestate := "vendor1=v1," + ddEntry + ",vendor2=v2"
516+
517+ headers := TextMapCarrier (map [string ]string {
518+ traceparentHeader : "00-00000000000000000000000000000004-2222222222222222-01" ,
519+ tracestateHeader : rawTracestate ,
520+ })
521+ sctx , err := tracer .Extract (headers )
522+ require .NoError (t , err )
523+
524+ stored := sctx .trace .propagatingTag (tracestateHeader )
525+ assert .NotContains (t , stored , "dd=" )
526+ assert .Contains (t , stored , "vendor1=v1" )
527+ assert .Contains (t , stored , "vendor2=v2" )
528+ assert .Empty (t , sctx .origin )
529+ assert .False (t , sctx .trace .hasPropagatingTag ("_dd.p.foo" ))
449530}
450531
451532func TestTextMapPropagator (t * testing.T ) {
0 commit comments