Skip to content

Commit 4844227

Browse files
adinauerclaude
andcommitted
chore: Merge Data Collection stack updates
Bring the latest base branch fixes into this stacked branch. Co-Authored-By: Claude <noreply@anthropic.com>
2 parents 1a94384 + 0b2763d commit 4844227

9 files changed

Lines changed: 74 additions & 108 deletions

File tree

‎sentry-apollo-3/src/main/java/io/sentry/apollo3/SentryApollo3HttpInterceptor.kt‎

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -271,28 +271,6 @@ constructor(
271271
private fun getHeader(key: String, headers: List<HttpHeader>): String? =
272272
headers.firstOrNull { it.name.equals(key, true) }?.value
273273

274-
private fun getRequestCookies(headers: List<HttpHeader>): String? {
275-
val cookies = getHeader("Cookie", headers)
276-
return if (scopes.options.dataCollectionResolver.isDataCollectionConfigured) {
277-
CookieUtils.filterCookies(cookies, scopes.options.dataCollectionResolver.cookies, null)
278-
} else if (scopes.options.isSendDefaultPii) {
279-
cookies
280-
} else {
281-
null
282-
}
283-
}
284-
285-
private fun getResponseCookies(headers: List<HttpHeader>): String? {
286-
val cookies = getHeader("Set-Cookie", headers)
287-
return if (scopes.options.dataCollectionResolver.isDataCollectionConfigured) {
288-
CookieUtils.filterSetCookie(cookies, scopes.options.dataCollectionResolver.cookies)
289-
} else if (scopes.options.isSendDefaultPii) {
290-
cookies
291-
} else {
292-
null
293-
}
294-
}
295-
296274
private fun getRequestHeaders(headers: List<HttpHeader>): MutableMap<String, String>? {
297275
if (scopes.options.dataCollectionResolver.isDataCollectionConfigured) {
298276
val requestHeaders = mutableMapOf<String, String>()
@@ -414,7 +392,7 @@ constructor(
414392
val sentryRequest =
415393
Request().apply {
416394
urlDetails.applyToRequest(this)
417-
cookies = getRequestCookies(request.headers)
395+
cookies = CookieUtils.filterCookies(getHeader("Cookie", request.headers), scopes.options)
418396
method = request.method.name
419397
headers = getRequestHeaders(request.headers)
420398
apiTarget = "graphql"
@@ -440,7 +418,8 @@ constructor(
440418

441419
val sentryResponse =
442420
Response().apply {
443-
cookies = getResponseCookies(response.headers)
421+
cookies =
422+
CookieUtils.filterSetCookie(getHeader("Set-Cookie", response.headers), scopes.options)
444423
headers = getResponseHeaders(response.headers)
445424
statusCode = response.statusCode
446425

‎sentry-apollo-4/src/main/java/io/sentry/apollo4/SentryApollo4HttpInterceptor.kt‎

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -270,28 +270,6 @@ constructor(
270270
private fun getHeader(key: String, headers: List<HttpHeader>): String? =
271271
headers.firstOrNull { it.name.equals(key, true) }?.value
272272

273-
private fun getRequestCookies(headers: List<HttpHeader>): String? {
274-
val cookies = getHeader("Cookie", headers)
275-
return if (scopes.options.dataCollectionResolver.isDataCollectionConfigured) {
276-
CookieUtils.filterCookies(cookies, scopes.options.dataCollectionResolver.cookies, null)
277-
} else if (scopes.options.isSendDefaultPii) {
278-
cookies
279-
} else {
280-
null
281-
}
282-
}
283-
284-
private fun getResponseCookies(headers: List<HttpHeader>): String? {
285-
val cookies = getHeader("Set-Cookie", headers)
286-
return if (scopes.options.dataCollectionResolver.isDataCollectionConfigured) {
287-
CookieUtils.filterSetCookie(cookies, scopes.options.dataCollectionResolver.cookies)
288-
} else if (scopes.options.isSendDefaultPii) {
289-
cookies
290-
} else {
291-
null
292-
}
293-
}
294-
295273
private fun getRequestHeaders(headers: List<HttpHeader>): MutableMap<String, String>? {
296274
if (scopes.options.dataCollectionResolver.isDataCollectionConfigured) {
297275
val requestHeaders = mutableMapOf<String, String>()
@@ -413,7 +391,7 @@ constructor(
413391
val sentryRequest =
414392
Request().apply {
415393
urlDetails.applyToRequest(this)
416-
cookies = getRequestCookies(request.headers)
394+
cookies = CookieUtils.filterCookies(getHeader("Cookie", request.headers), scopes.options)
417395
method = request.method.name
418396
headers = getRequestHeaders(request.headers)
419397
apiTarget = "graphql"
@@ -439,7 +417,8 @@ constructor(
439417

440418
val sentryResponse =
441419
Response().apply {
442-
cookies = getResponseCookies(response.headers)
420+
cookies =
421+
CookieUtils.filterSetCookie(getHeader("Set-Cookie", response.headers), scopes.options)
443422
headers = getResponseHeaders(response.headers)
444423
statusCode = response.statusCode
445424

‎sentry-ktor-client/src/main/java/io/sentry/ktorClient/SentryKtorClientUtils.kt‎

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,15 @@ internal object SentryKtorClientUtils {
3838
val sentryRequest =
3939
io.sentry.protocol.Request().apply {
4040
urlDetails.applyToRequest(this)
41-
cookies = getRequestCookies(scopes, request.headers["Cookie"])
41+
cookies = CookieUtils.filterCookies(request.headers["Cookie"], scopes.options)
4242
method = request.method.value
4343
headers = getRequestHeaders(scopes, request.headers)
4444
bodySize = request.content.contentLength
4545
}
4646

4747
val sentryResponse =
4848
io.sentry.protocol.Response().apply {
49-
cookies = getResponseCookies(scopes, response.headers["Set-Cookie"])
49+
cookies = CookieUtils.filterSetCookie(response.headers["Set-Cookie"], scopes.options)
5050
headers = getResponseHeaders(scopes, response.headers)
5151
statusCode = response.status.value
5252
try {
@@ -66,28 +66,6 @@ internal object SentryKtorClientUtils {
6666
scopes.captureEvent(event, hint)
6767
}
6868

69-
private fun getRequestCookies(scopes: IScopes, cookies: String?): String? =
70-
if (scopes.options.dataCollectionResolver.isDataCollectionConfigured) {
71-
CookieUtils.filterCookies(
72-
cookies,
73-
scopes.options.dataCollectionResolver.cookies,
74-
null,
75-
)
76-
} else if (scopes.options.isSendDefaultPii) {
77-
cookies
78-
} else {
79-
null
80-
}
81-
82-
private fun getResponseCookies(scopes: IScopes, cookies: String?): String? =
83-
if (scopes.options.dataCollectionResolver.isDataCollectionConfigured) {
84-
CookieUtils.filterSetCookie(cookies, scopes.options.dataCollectionResolver.cookies)
85-
} else if (scopes.options.isSendDefaultPii) {
86-
cookies
87-
} else {
88-
null
89-
}
90-
9169
private fun getRequestHeaders(scopes: IScopes, headers: Headers): MutableMap<String, String>? {
9270
if (scopes.options.dataCollectionResolver.isDataCollectionConfigured) {
9371
val requestHeaders =

‎sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpUtils.kt‎

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ internal object SentryOkHttpUtils {
3838
val sentryRequest =
3939
io.sentry.protocol.Request().apply {
4040
urlDetails.applyToRequest(this)
41-
cookies = getRequestCookies(scopes, request.headers["Cookie"])
41+
cookies = CookieUtils.filterCookies(request.headers["Cookie"], scopes.options)
4242
method = request.method
4343
headers = getRequestHeaders(scopes, request.headers)
4444

@@ -47,7 +47,7 @@ internal object SentryOkHttpUtils {
4747

4848
val sentryResponse =
4949
io.sentry.protocol.Response().apply {
50-
cookies = getResponseCookies(scopes, response.headers["Set-Cookie"])
50+
cookies = CookieUtils.filterSetCookie(response.headers["Set-Cookie"], scopes.options)
5151
headers = getResponseHeaders(scopes, response.headers)
5252
statusCode = response.code
5353

@@ -66,28 +66,6 @@ internal object SentryOkHttpUtils {
6666
}
6767
}
6868

69-
private fun getRequestCookies(scopes: IScopes, cookies: String?): String? =
70-
if (scopes.options.dataCollectionResolver.isDataCollectionConfigured) {
71-
CookieUtils.filterCookies(
72-
cookies,
73-
scopes.options.dataCollectionResolver.cookies,
74-
null,
75-
)
76-
} else if (scopes.options.isSendDefaultPii) {
77-
cookies
78-
} else {
79-
null
80-
}
81-
82-
private fun getResponseCookies(scopes: IScopes, cookies: String?): String? =
83-
if (scopes.options.dataCollectionResolver.isDataCollectionConfigured) {
84-
CookieUtils.filterSetCookie(cookies, scopes.options.dataCollectionResolver.cookies)
85-
} else if (scopes.options.isSendDefaultPii) {
86-
cookies
87-
} else {
88-
null
89-
}
90-
9169
private fun getRequestHeaders(
9270
scopes: IScopes,
9371
requestHeaders: Headers,

‎sentry-spring-7/src/main/java/io/sentry/spring7/tracing/SentrySpanClientWebRequestFilter.java‎

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,7 @@ public SentrySpanClientWebRequestFilter(final @NotNull IScopes scopes) {
4949
final @NotNull UrlUtils.UrlDetails urlDetails =
5050
UrlUtils.parse(request.url().toString(), scopes.getOptions().getDataCollectionResolver());
5151
final @NotNull String method = request.method().name();
52-
span.setDescription(
53-
method
54-
+ " "
55-
+ (scopes.getOptions().getDataCollectionResolver().isDataCollectionConfigured()
56-
? urlDetails.getUrlOrFallback()
57-
: request.url()));
52+
span.setDescription(method + " " + urlDetails.getUrlOrFallback());
5853
span.setData(SpanDataConvention.HTTP_METHOD_KEY, method.toUpperCase(Locale.ROOT));
5954
if (scopes.getOptions().getDataCollectionResolver().isDataCollectionConfigured()) {
6055
urlDetails.applyToSpan(span);

‎sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/tracing/SentrySpanClientWebRequestFilter.java‎

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,7 @@ public SentrySpanClientWebRequestFilter(final @NotNull IScopes scopes) {
4949
final @NotNull UrlUtils.UrlDetails urlDetails =
5050
UrlUtils.parse(request.url().toString(), scopes.getOptions().getDataCollectionResolver());
5151
final @NotNull String method = request.method().name();
52-
span.setDescription(
53-
method
54-
+ " "
55-
+ (scopes.getOptions().getDataCollectionResolver().isDataCollectionConfigured()
56-
? urlDetails.getUrlOrFallback()
57-
: request.url()));
52+
span.setDescription(method + " " + urlDetails.getUrlOrFallback());
5853
span.setData(SpanDataConvention.HTTP_METHOD_KEY, method.toUpperCase(Locale.ROOT));
5954
if (scopes.getOptions().getDataCollectionResolver().isDataCollectionConfigured()) {
6055
urlDetails.applyToSpan(span);

‎sentry/api/sentry.api‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7832,12 +7832,14 @@ public final class io/sentry/util/CookieUtils {
78327832
public static final field COOKIE_HEADER_NAME Ljava/lang/String;
78337833
public fun <init> ()V
78347834
public static fun filterCookies (Ljava/lang/String;Lio/sentry/KeyValueCollectionBehavior;Ljava/util/List;)Ljava/lang/String;
7835+
public static fun filterCookies (Ljava/lang/String;Lio/sentry/SentryOptions;)Ljava/lang/String;
78357836
public static fun filterCookiesFromHeader (Ljava/util/Enumeration;Lio/sentry/KeyValueCollectionBehavior;Ljava/util/List;)Ljava/util/List;
78367837
public static fun filterCookiesFromHeader (Ljava/util/List;Lio/sentry/KeyValueCollectionBehavior;Ljava/util/List;)Ljava/util/List;
78377838
public static fun filterOutSecurityCookies (Ljava/lang/String;Ljava/util/List;)Ljava/lang/String;
78387839
public static fun filterOutSecurityCookiesFromHeader (Ljava/util/Enumeration;Ljava/lang/String;Ljava/util/List;)Ljava/util/List;
78397840
public static fun filterOutSecurityCookiesFromHeader (Ljava/util/List;Ljava/lang/String;Ljava/util/List;)Ljava/util/List;
78407841
public static fun filterSetCookie (Ljava/lang/String;Lio/sentry/KeyValueCollectionBehavior;)Ljava/lang/String;
7842+
public static fun filterSetCookie (Ljava/lang/String;Lio/sentry/SentryOptions;)Ljava/lang/String;
78417843
public static fun isSecurityCookie (Ljava/lang/String;Ljava/util/List;)Z
78427844
}
78437845

‎sentry/src/main/java/io/sentry/util/CookieUtils.java‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static io.sentry.util.UrlUtils.SENSITIVE_DATA_SUBSTITUTE;
44

55
import io.sentry.KeyValueCollectionBehavior;
6+
import io.sentry.SentryOptions;
67
import java.util.ArrayList;
78
import java.util.Arrays;
89
import java.util.Collections;
@@ -57,6 +58,14 @@ public final class CookieUtils {
5758
return filteredHeaders;
5859
}
5960

61+
public static @Nullable String filterCookies(
62+
final @Nullable String cookies, final @NotNull SentryOptions options) {
63+
if (!options.getDataCollectionResolver().isDataCollectionConfigured()) {
64+
return options.isSendDefaultPii() ? cookies : null;
65+
}
66+
return filterCookies(cookies, options.getDataCollectionResolver().getCookies(), null);
67+
}
68+
6069
public static @Nullable String filterCookies(
6170
final @Nullable String cookies,
6271
final @NotNull KeyValueCollectionBehavior behavior,
@@ -77,6 +86,14 @@ public final class CookieUtils {
7786
return filteredCookies.toString();
7887
}
7988

89+
public static @Nullable String filterSetCookie(
90+
final @Nullable String cookie, final @NotNull SentryOptions options) {
91+
if (!options.getDataCollectionResolver().isDataCollectionConfigured()) {
92+
return options.isSendDefaultPii() ? cookie : null;
93+
}
94+
return filterSetCookie(cookie, options.getDataCollectionResolver().getCookies());
95+
}
96+
8097
public static @Nullable String filterSetCookie(
8198
final @Nullable String cookie, final @NotNull KeyValueCollectionBehavior behavior) {
8299
if (cookie == null || behavior.getMode() == KeyValueCollectionBehavior.Mode.OFF) {

‎sentry/src/test/java/io/sentry/util/CookieUtilsTest.kt‎

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package io.sentry.util
22

33
import com.google.common.truth.Truth.assertThat
44
import io.sentry.KeyValueCollectionBehavior
5+
import io.sentry.SentryOptions
56
import java.util.Enumeration
67
import java.util.StringTokenizer
78
import kotlin.test.Test
@@ -10,6 +11,48 @@ import kotlin.test.assertNotNull
1011
import kotlin.test.assertNull
1112

1213
class CookieUtilsTest {
14+
@Test
15+
fun `options cookie filters omit cookies in legacy mode without default pii`() {
16+
val options = SentryOptions()
17+
18+
assertThat(CookieUtils.filterCookies("sessionId=secret", options)).isNull()
19+
assertThat(CookieUtils.filterSetCookie("sessionId=secret; Path=/", options)).isNull()
20+
}
21+
22+
@Test
23+
fun `options cookie filters preserve cookies in legacy mode with default pii`() {
24+
val options = SentryOptions().apply { isSendDefaultPii = true }
25+
26+
assertThat(CookieUtils.filterCookies("sessionId=secret", options)).isEqualTo("sessionId=secret")
27+
assertThat(CookieUtils.filterSetCookie("sessionId=secret; Path=/", options))
28+
.isEqualTo("sessionId=secret; Path=/")
29+
}
30+
31+
@Test
32+
fun `options cookie filters apply configured policy`() {
33+
val options =
34+
SentryOptions().apply {
35+
dataCollection.cookies = KeyValueCollectionBehavior.denyList("customer")
36+
}
37+
38+
assertThat(CookieUtils.filterCookies("theme=dark; customerId=123", options))
39+
.isEqualTo("theme=dark; customerId=[Filtered]")
40+
assertThat(CookieUtils.filterSetCookie("customerId=123; Path=/", options))
41+
.isEqualTo("customerId=[Filtered]; Path=/")
42+
}
43+
44+
@Test
45+
fun `options cookie filters honor explicitly disabled collection`() {
46+
val options =
47+
SentryOptions().apply {
48+
isSendDefaultPii = true
49+
dataCollection.cookies = KeyValueCollectionBehavior.off()
50+
}
51+
52+
assertThat(CookieUtils.filterCookies("theme=dark", options)).isNull()
53+
assertThat(CookieUtils.filterSetCookie("theme=dark; Path=/", options)).isNull()
54+
}
55+
1356
@Test
1457
fun `cookie filter disables collection in off mode`() {
1558
assertThat(

0 commit comments

Comments
 (0)