Skip to content
Draft
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ private void configureScope(

private @NotNull HttpServletRequest resolveHttpServletRequest(
final @NotNull IScopes scopes, final @NotNull HttpServletRequest request) {
if (scopes.getOptions().isSendDefaultPii()
if (scopes.getOptions().getDataCollectionResolver().isIncomingRequestBody()
&& qualifiesForCaching(request, scopes.getOptions().getMaxRequestBodySize())) {
return new ContentCachingRequestWrapper(request, 0);
}
Expand Down Expand Up @@ -155,7 +155,7 @@ public RequestBodyExtractingEventProcessor(
@Override
public @NotNull SentryEvent process(@NotNull SentryEvent event, @NotNull Hint hint) {
if (event.getRequest() != null
&& options.isSendDefaultPii()
&& options.getDataCollectionResolver().isIncomingRequestBody()
&& qualifiesForCaching(request, options.getMaxRequestBodySize())) {
event.getRequest().setData(requestPayloadExtractor.extract(request, options));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package io.sentry.spring7

import io.sentry.Breadcrumb
import io.sentry.HttpBodyType
import io.sentry.IScope
import io.sentry.IScopes
import io.sentry.ISentryLifecycleToken
Expand Down Expand Up @@ -318,6 +319,52 @@ class SentrySpringFilterTest {
}
}

@Test
fun `data collection can enable request body when sendDefaultPii is false`() {
val options =
SentryOptions().apply {
isSendDefaultPii = false
maxRequestBodySize = SMALL
dataCollection.httpBodies = setOf(HttpBodyType.INCOMING_REQUEST)
}
val listener =
fixture.getSut(
request =
MockMvcRequestBuilders.post(URI.create("http://example.com"))
.content("xxx")
.contentType("application/json")
.buildRequest(MockServletContext()),
options = options,
)

listener.doFilter(fixture.request, fixture.response, fixture.chain)

verify(fixture.chain).doFilter(check { assertTrue(it is ContentCachingRequestWrapper) }, any())
}

@Test
fun `data collection can disable request body when sendDefaultPii is true`() {
val options =
SentryOptions().apply {
isSendDefaultPii = true
maxRequestBodySize = SMALL
dataCollection.httpBodies = emptySet()
}
val listener =
fixture.getSut(
request =
MockMvcRequestBuilders.post(URI.create("http://example.com"))
.content("xxx")
.contentType("application/json")
.buildRequest(MockServletContext()),
options = options,
)

listener.doFilter(fixture.request, fixture.response, fixture.chain)

verify(fixture.chain).doFilter(check { assertFalse(it is ContentCachingRequestWrapper) }, any())
}

private fun servletContextWithCustomCookieName(name: String): ServletContext =
MockServletContext().also { it.sessionCookieConfig.name = name }
}
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ private void configureScope(

private @NotNull HttpServletRequest resolveHttpServletRequest(
final @NotNull IScopes scopes, final @NotNull HttpServletRequest request) {
if (scopes.getOptions().isSendDefaultPii()
if (scopes.getOptions().getDataCollectionResolver().isIncomingRequestBody()
&& qualifiesForCaching(request, scopes.getOptions().getMaxRequestBodySize())) {
return new ContentCachingRequestWrapper(request);
}
Expand Down Expand Up @@ -155,7 +155,7 @@ public RequestBodyExtractingEventProcessor(
@Override
public @NotNull SentryEvent process(@NotNull SentryEvent event, @NotNull Hint hint) {
if (event.getRequest() != null
&& options.isSendDefaultPii()
&& options.getDataCollectionResolver().isIncomingRequestBody()
&& qualifiesForCaching(request, options.getMaxRequestBodySize())) {
event.getRequest().setData(requestPayloadExtractor.extract(request, options));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package io.sentry.spring.jakarta

import io.sentry.Breadcrumb
import io.sentry.HttpBodyType
import io.sentry.IScope
import io.sentry.IScopes
import io.sentry.ISentryLifecycleToken
Expand Down Expand Up @@ -318,6 +319,52 @@ class SentrySpringFilterTest {
}
}

@Test
fun `data collection can enable request body when sendDefaultPii is false`() {
val options =
SentryOptions().apply {
isSendDefaultPii = false
maxRequestBodySize = SMALL
dataCollection.httpBodies = setOf(HttpBodyType.INCOMING_REQUEST)
}
val listener =
fixture.getSut(
request =
MockMvcRequestBuilders.post(URI.create("http://example.com"))
.content("xxx")
.contentType("application/json")
.buildRequest(MockServletContext()),
options = options,
)

listener.doFilter(fixture.request, fixture.response, fixture.chain)

verify(fixture.chain).doFilter(check { assertTrue(it is ContentCachingRequestWrapper) }, any())
}

@Test
fun `data collection can disable request body when sendDefaultPii is true`() {
val options =
SentryOptions().apply {
isSendDefaultPii = true
maxRequestBodySize = SMALL
dataCollection.httpBodies = emptySet()
}
val listener =
fixture.getSut(
request =
MockMvcRequestBuilders.post(URI.create("http://example.com"))
.content("xxx")
.contentType("application/json")
.buildRequest(MockServletContext()),
options = options,
)

listener.doFilter(fixture.request, fixture.response, fixture.chain)

verify(fixture.chain).doFilter(check { assertFalse(it is ContentCachingRequestWrapper) }, any())
}

private fun servletContextWithCustomCookieName(name: String): ServletContext =
MockServletContext().also { it.sessionCookieConfig.name = name }
}
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ private void configureScope(

private @NotNull HttpServletRequest resolveHttpServletRequest(
final @NotNull IScopes scopes, final @NotNull HttpServletRequest request) {
if (scopes.getOptions().isSendDefaultPii()
if (scopes.getOptions().getDataCollectionResolver().isIncomingRequestBody()
&& qualifiesForCaching(request, scopes.getOptions().getMaxRequestBodySize())) {
return new ContentCachingRequestWrapper(request);
}
Expand Down Expand Up @@ -155,7 +155,7 @@ public RequestBodyExtractingEventProcessor(
@Override
public @NotNull SentryEvent process(@NotNull SentryEvent event, @NotNull Hint hint) {
if (event.getRequest() != null
&& options.isSendDefaultPii()
&& options.getDataCollectionResolver().isIncomingRequestBody()
&& qualifiesForCaching(request, options.getMaxRequestBodySize())) {
event.getRequest().setData(requestPayloadExtractor.extract(request, options));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package io.sentry.spring

import io.sentry.Breadcrumb
import io.sentry.HttpBodyType
import io.sentry.IScope
import io.sentry.IScopes
import io.sentry.ISentryLifecycleToken
Expand Down Expand Up @@ -318,6 +319,52 @@ class SentrySpringFilterTest {
}
}

@Test
fun `data collection can enable request body when sendDefaultPii is false`() {
val options =
SentryOptions().apply {
isSendDefaultPii = false
maxRequestBodySize = SMALL
dataCollection.httpBodies = setOf(HttpBodyType.INCOMING_REQUEST)
}
val listener =
fixture.getSut(
request =
MockMvcRequestBuilders.post(URI.create("http://example.com"))
.content("xxx")
.contentType("application/json")
.buildRequest(MockServletContext()),
options = options,
)

listener.doFilter(fixture.request, fixture.response, fixture.chain)

verify(fixture.chain).doFilter(check { assertTrue(it is ContentCachingRequestWrapper) }, any())
}

@Test
fun `data collection can disable request body when sendDefaultPii is true`() {
val options =
SentryOptions().apply {
isSendDefaultPii = true
maxRequestBodySize = SMALL
dataCollection.httpBodies = emptySet()
}
val listener =
fixture.getSut(
request =
MockMvcRequestBuilders.post(URI.create("http://example.com"))
.content("xxx")
.contentType("application/json")
.buildRequest(MockServletContext()),
options = options,
)

listener.doFilter(fixture.request, fixture.response, fixture.chain)

verify(fixture.chain).doFilter(check { assertFalse(it is ContentCachingRequestWrapper) }, any())
}

private fun servletContextWithCustomCookieName(name: String): ServletContext =
MockServletContext().also { it.sessionCookieConfig.name = name }
}
Loading