@@ -612,7 +612,7 @@ describe('request utils', () => {
612612 } ) ;
613613 } ) ;
614614
615- describe ( 'PII filtering' , ( ) => {
615+ describe ( 'PII/Sensitive data filtering' , ( ) => {
616616 it ( 'filters sensitive headers case-insensitively' , ( ) => {
617617 const headers = {
618618 AUTHORIZATION : 'Bearer secret-token' ,
@@ -625,12 +625,95 @@ describe('request utils', () => {
625625
626626 expect ( result ) . toEqual ( {
627627 'http.request.header.content_type' : 'application/json' ,
628- 'http.request.header.cookie' : '[Filtered]' ,
628+ 'http.request.header.cookie.session ' : '[Filtered]' ,
629629 'http.request.header.x_api_key' : '[Filtered]' ,
630630 'http.request.header.authorization' : '[Filtered]' ,
631631 } ) ;
632632 } ) ;
633633
634+ it ( 'attaches and filters sensitive cookie headers' , ( ) => {
635+ const headers = {
636+ Cookie :
637+ 'session=abc123; tracking=enabled; cookie-authentication-key-without-value; theme=dark; lang=en; user_session=xyz789; pref=1' ,
638+ } ;
639+
640+ const result = httpHeadersToSpanAttributes ( headers ) ;
641+
642+ expect ( result ) . toEqual ( {
643+ 'http.request.header.cookie.session' : '[Filtered]' ,
644+ 'http.request.header.cookie.tracking' : 'enabled' ,
645+ 'http.request.header.cookie.theme' : 'dark' ,
646+ 'http.request.header.cookie.lang' : 'en' ,
647+ 'http.request.header.cookie.user_session' : '[Filtered]' ,
648+ 'http.request.header.cookie.cookie_authentication_key_without_value' : '[Filtered]' ,
649+ 'http.request.header.cookie.pref' : '1' ,
650+ } ) ;
651+ } ) ;
652+
653+ it ( 'adds a filtered cookie header when cookie header is present, but has no valid key=value pairs' , ( ) => {
654+ const headers1 = { Cookie : [ 'key' , 'val' ] } ;
655+ const result1 = httpHeadersToSpanAttributes ( headers1 ) ;
656+ expect ( result1 ) . toEqual ( { 'http.request.header.cookie' : '[Filtered]' } ) ;
657+
658+ const headers3 = { Cookie : '' } ;
659+ const result3 = httpHeadersToSpanAttributes ( headers3 ) ;
660+ expect ( result3 ) . toEqual ( { 'http.request.header.cookie' : '[Filtered]' } ) ;
661+ } ) ;
662+
663+ it ( 'attaches and filters sensitive a set-cookie header' , ( ) => {
664+ const headers1 = { 'Set-Cookie' : 'user_session=def456' } ;
665+ const result1 = httpHeadersToSpanAttributes ( headers1 ) ;
666+ expect ( result1 ) . toEqual ( { 'http.request.header.set_cookie.user_session' : '[Filtered]' } ) ;
667+
668+ const headers2 = { 'Set-Cookie' : 'preferred-color-mode=light' } ;
669+ const result2 = httpHeadersToSpanAttributes ( headers2 ) ;
670+ expect ( result2 ) . toEqual ( { 'http.request.header.set_cookie.preferred_color_mode' : 'light' } ) ;
671+
672+ const headers3 = { 'Set-Cookie' : 'lang=en' } ;
673+ const result3 = httpHeadersToSpanAttributes ( headers3 ) ;
674+ expect ( result3 ) . toEqual ( { 'http.request.header.set_cookie.lang' : 'en' } ) ;
675+
676+ const headers4 = { 'Set-Cookie' : 'timezone=UTC' } ;
677+ const result4 = httpHeadersToSpanAttributes ( headers4 ) ;
678+ expect ( result4 ) . toEqual ( { 'http.request.header.set_cookie.timezone' : 'UTC' } ) ;
679+ } ) ;
680+
681+ it . each ( [
682+ { sendDefaultPii : false , description : 'sendDefaultPii is false (default)' } ,
683+ { sendDefaultPii : true , description : 'sendDefaultPii is true' } ,
684+ ] ) ( 'does not include PII headers when $description' , ( { sendDefaultPii } ) => {
685+ const headers = {
686+ 'Content-Type' : 'application/json' ,
687+ 'User-Agent' : 'Mozilla/5.0' ,
688+ 'x-user' : 'my-personal-username' ,
689+ 'X-Forwarded-For' : '192.168.1.1' ,
690+ 'X-Forwarded-Host' : 'example.com' ,
691+ 'X-Forwarded-Proto' : 'https' ,
692+ } ;
693+
694+ const result = httpHeadersToSpanAttributes ( headers , sendDefaultPii ) ;
695+
696+ if ( sendDefaultPii ) {
697+ expect ( result ) . toEqual ( {
698+ 'http.request.header.content_type' : 'application/json' ,
699+ 'http.request.header.user_agent' : 'Mozilla/5.0' ,
700+ 'http.request.header.x_user' : 'my-personal-username' ,
701+ 'http.request.header.x_forwarded_for' : '192.168.1.1' ,
702+ 'http.request.header.x_forwarded_host' : 'example.com' ,
703+ 'http.request.header.x_forwarded_proto' : 'https' ,
704+ } ) ;
705+ } else {
706+ expect ( result ) . toEqual ( {
707+ 'http.request.header.content_type' : 'application/json' ,
708+ 'http.request.header.user_agent' : 'Mozilla/5.0' ,
709+ 'http.request.header.x_user' : '[Filtered]' ,
710+ 'http.request.header.x_forwarded_for' : '[Filtered]' ,
711+ 'http.request.header.x_forwarded_host' : '[Filtered]' ,
712+ 'http.request.header.x_forwarded_proto' : '[Filtered]' ,
713+ } ) ;
714+ }
715+ } ) ;
716+
634717 it ( 'always filters comprehensive list of sensitive headers' , ( ) => {
635718 const headers = {
636719 'Content-Type' : 'application/json' ,
@@ -671,8 +754,8 @@ describe('request utils', () => {
671754 'http.request.header.accept' : 'application/json' ,
672755 'http.request.header.host' : 'example.com' ,
673756 'http.request.header.authorization' : '[Filtered]' ,
674- 'http.request.header.cookie' : '[Filtered]' ,
675- 'http.request.header.set_cookie' : '[Filtered]' ,
757+ 'http.request.header.cookie.session ' : '[Filtered]' ,
758+ 'http.request.header.set_cookie.session ' : '[Filtered]' ,
676759 'http.request.header.x_api_key' : '[Filtered]' ,
677760 'http.request.header.x_auth_token' : '[Filtered]' ,
678761 'http.request.header.x_secret' : '[Filtered]' ,
0 commit comments