1+ import type { Client } from '../client' ;
12import { getIsolationScope } from '../currentScopes' ;
23import { defineIntegration } from '../integration' ;
34import { SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS } from '../semanticAttributes' ;
5+ import type { ResolvedDataCollection } from '../types/datacollection' ;
46import type { Event } from '../types/event' ;
57import type { IntegrationFn } from '../types/integration' ;
68import type { QueryParams , RequestEventData } from '../types/request' ;
@@ -26,36 +28,52 @@ type RequestDataIntegrationOptions = {
2628 include ?: RequestDataIncludeOptions ;
2729} ;
2830
29- // TODO(v11): Change defaults based on `sendDefaultPii`
30- const DEFAULT_INCLUDE : RequestDataIncludeOptions = {
31- cookies : true ,
32- data : true ,
33- headers : true ,
34- query_string : true ,
35- url : true ,
36- } ;
37-
3831const INTEGRATION_NAME = 'RequestData' ;
3932
4033const _requestDataIntegration = ( ( options : RequestDataIntegrationOptions = { } ) => {
41- const include = {
42- ...DEFAULT_INCLUDE ,
43- ...options . include ,
44- } ;
34+ // Per spec, integration-level options override global dataCollection.
35+ // When include overrides a category back on that dataCollection turned off,
36+ // we flip the dataCollection behavior to true (default denylist filtering).
37+ function resolveIncludeAndDataCollection ( client : Client ) : {
38+ include : RequestDataIncludeOptions ;
39+ dataCollection : ResolvedDataCollection ;
40+ } {
41+ const dc = client . getDataCollectionOptions ( ) ;
42+ const dataCollection : ResolvedDataCollection = {
43+ ...dc ,
44+ ...( options . include ?. cookies === true && dc . cookies === false && { cookies : true as const } ) ,
45+ ...( options . include ?. headers === true &&
46+ dc . httpHeaders . request === false && {
47+ httpHeaders : { ...dc . httpHeaders , request : true as const } ,
48+ } ) ,
49+ } ;
50+
51+ return {
52+ dataCollection,
53+ include : {
54+ cookies : dataCollection . cookies !== false ,
55+ // Always attach body data that's already on the scope — dataCollection.httpBodies gates write-time, not read-time
56+ data : true ,
57+ headers : dataCollection . httpHeaders . request !== false ,
58+ ip : dataCollection . userInfo ,
59+ query_string : dataCollection . queryParams !== false ,
60+ // No dataCollection equivalent — URL is always included
61+ url : true ,
62+ ...options . include ,
63+ } ,
64+ } ;
65+ }
4566
4667 return {
4768 name : INTEGRATION_NAME ,
4869 processEvent ( event , _hint , client ) {
4970 const { sdkProcessingMetadata = { } } = event ;
5071 const { normalizedRequest, ipAddress } = sdkProcessingMetadata ;
5172
52- const includeWithDefaultPiiApplied : RequestDataIncludeOptions = {
53- ...include ,
54- ip : include . ip ?? client . getOptions ( ) . sendDefaultPii ,
55- } ;
73+ const { include } = resolveIncludeAndDataCollection ( client ) ;
5674
5775 if ( normalizedRequest ) {
58- addNormalizedRequestDataToEvent ( event , normalizedRequest , { ipAddress } , includeWithDefaultPiiApplied ) ;
76+ addNormalizedRequestDataToEvent ( event , normalizedRequest , { ipAddress } , include ) ;
5977 }
6078
6179 return event ;
@@ -68,13 +86,9 @@ const _requestDataIntegration = ((options: RequestDataIntegrationOptions = {}) =
6886 return ;
6987 }
7088
71- const { sendDefaultPii } = client . getOptions ( ) ;
72- const includeWithDefaultPiiApplied : RequestDataIncludeOptions = {
73- ...include ,
74- ip : include . ip ?? sendDefaultPii ,
75- } ;
89+ const { include, dataCollection } = resolveIncludeAndDataCollection ( client ) ;
7690
77- addNormalizedRequestDataToSpan ( span , normalizedRequest , ipAddress , includeWithDefaultPiiApplied , sendDefaultPii ) ;
91+ addNormalizedRequestDataToSpan ( span , normalizedRequest , ipAddress , include , dataCollection ) ;
7892 } ,
7993 } ;
8094} ) satisfies IntegrationFn ;
@@ -117,7 +131,7 @@ function addNormalizedRequestDataToSpan(
117131 normalizedRequest : RequestEventData ,
118132 ipAddress : string | undefined ,
119133 include : RequestDataIncludeOptions ,
120- sendDefaultPii : boolean | undefined ,
134+ dataCollection : ResolvedDataCollection ,
121135) : void {
122136 const requestData = extractNormalizedRequestData ( normalizedRequest , include ) ;
123137 const attributes : Record < string , unknown > = { } ;
@@ -142,12 +156,12 @@ function addNormalizedRequestDataToSpan(
142156 const cookieString = Object . entries ( requestData . cookies )
143157 . map ( ( [ name , value ] ) => `${ name } =${ value } ` )
144158 . join ( '; ' ) ;
145- const cookieAttributes = httpHeadersToSpanAttributes ( { cookie : cookieString } , sendDefaultPii ?? false , 'request' ) ;
159+ const cookieAttributes = httpHeadersToSpanAttributes ( { cookie : cookieString } , dataCollection , 'request' ) ;
146160 safeSetSpanJSONAttributes ( span , cookieAttributes ) ;
147161 }
148162
149163 if ( requestData . headers ) {
150- const headerAttributes = httpHeadersToSpanAttributes ( requestData . headers , sendDefaultPii ?? false , 'request' ) ;
164+ const headerAttributes = httpHeadersToSpanAttributes ( requestData . headers , dataCollection , 'request' ) ;
151165 safeSetSpanJSONAttributes ( span , headerAttributes ) ;
152166 }
153167
0 commit comments