Skip to content

Commit 5668e5d

Browse files
authored
Merge branch 'main' into fix/sentry-bom
2 parents b970e9e + 5fa24ec commit 5668e5d

File tree

22 files changed

+572
-45
lines changed

22 files changed

+572
-45
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
### Fixes
66

7+
- Remove authority from URLs sent to Sentry ([#2366](https://github.com/getsentry/sentry-java/pull/2366))
78
- Fix `sentry-bom` containing incorrect artifacts ([#2504](https://github.com/getsentry/sentry-java/pull/2504))
89

910
### Dependencies

sentry-android-okhttp/src/main/java/io/sentry/android/okhttp/SentryOkHttpInterceptor.kt

+7-16
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import io.sentry.exception.SentryHttpClientException
1616
import io.sentry.protocol.Mechanism
1717
import io.sentry.util.HttpUtils
1818
import io.sentry.util.PropagationTargetsUtils
19+
import io.sentry.util.UrlUtils
1920
import okhttp3.Headers
2021
import okhttp3.Interceptor
2122
import okhttp3.Request
@@ -53,11 +54,13 @@ class SentryOkHttpInterceptor(
5354
override fun intercept(chain: Interceptor.Chain): Response {
5455
var request = chain.request()
5556

56-
val url = request.url.toString()
57+
val urlDetails = UrlUtils.parse(request.url.toString())
58+
val url = urlDetails.urlOrFallback
5759
val method = request.method
5860

5961
// read transaction from the bound scope
6062
val span = hub.span?.startChild("http.client", "$method $url")
63+
urlDetails.applyToSpan(span)
6164

6265
var response: Response? = null
6366

@@ -149,20 +152,10 @@ class SentryOkHttpInterceptor(
149152
// url will be: https://api.github.com/users/getsentry/repos/
150153
// ideally we'd like a parameterized url: https://api.github.com/users/{user}/repos/
151154
// but that's not possible
152-
var requestUrl = request.url.toString()
153-
154-
val query = request.url.query
155-
if (!query.isNullOrEmpty()) {
156-
requestUrl = requestUrl.replace("?$query", "")
157-
}
158-
159-
val urlFragment = request.url.fragment
160-
if (!urlFragment.isNullOrEmpty()) {
161-
requestUrl = requestUrl.replace("#$urlFragment", "")
162-
}
155+
val urlDetails = UrlUtils.parse(request.url.toString())
163156

164157
// return if its not a target match
165-
if (!PropagationTargetsUtils.contain(failedRequestTargets, requestUrl)) {
158+
if (!PropagationTargetsUtils.contain(failedRequestTargets, request.url.toString())) {
166159
return
167160
}
168161

@@ -180,13 +173,11 @@ class SentryOkHttpInterceptor(
180173
hint.set(OKHTTP_RESPONSE, response)
181174

182175
val sentryRequest = io.sentry.protocol.Request().apply {
183-
url = requestUrl
176+
urlDetails.applyToRequest(this)
184177
// Cookie is only sent if isSendDefaultPii is enabled
185178
cookies = if (hub.options.isSendDefaultPii) request.headers["Cookie"] else null
186179
method = request.method
187-
queryString = query
188180
headers = getHeaders(request.headers)
189-
fragment = urlFragment
190181

191182
request.body?.contentLength().ifHasValidLength {
192183
bodySize = it

sentry-android-okhttp/src/test/java/io/sentry/android/okhttp/SentryOkHttpInterceptorTest.kt

+9-4
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,8 @@ class SentryOkHttpInterceptorTest {
263263
@SuppressWarnings("SwallowedException")
264264
@Test
265265
fun `adds breadcrumb when http calls results in exception`() {
266+
// to setup mocks
267+
fixture.getSut()
266268
val interceptor = SentryOkHttpInterceptor(fixture.hub)
267269
val chain = mock<Interceptor.Chain>()
268270
whenever(chain.proceed(any())).thenThrow(IOException())
@@ -408,7 +410,8 @@ class SentryOkHttpInterceptorTest {
408410
val sut = fixture.getSut(
409411
captureFailedRequests = true,
410412
httpStatusCode = statusCode,
411-
responseBody = "fail"
413+
responseBody = "fail",
414+
sendDefaultPii = true
412415
)
413416

414417
val request = getRequest(url = "/hello?myQuery=myValue#myFragment")
@@ -423,16 +426,16 @@ class SentryOkHttpInterceptorTest {
423426
assertEquals("GET", sentryRequest.method)
424427

425428
// because of isSendDefaultPii
426-
assertNull(sentryRequest.headers)
429+
assertNotNull(sentryRequest.headers)
427430
assertNull(sentryRequest.cookies)
428431

429432
val sentryResponse = it.contexts.response!!
430433
assertEquals(statusCode, sentryResponse.statusCode)
431434
assertEquals(response.body!!.contentLength(), sentryResponse.bodySize)
432435

433436
// because of isSendDefaultPii
434-
assertNull(sentryRequest.headers)
435-
assertNull(sentryRequest.cookies)
437+
assertNotNull(sentryResponse.headers)
438+
assertNull(sentryResponse.cookies)
436439

437440
assertTrue(it.throwable is SentryHttpClientException)
438441
},
@@ -489,6 +492,8 @@ class SentryOkHttpInterceptorTest {
489492
@SuppressWarnings("SwallowedException")
490493
@Test
491494
fun `does not capture an error even if it throws`() {
495+
// to setup mocks
496+
fixture.getSut()
492497
val interceptor = SentryOkHttpInterceptor(
493498
fixture.hub,
494499
captureFailedRequests = true

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

+6-4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import io.sentry.SentryLevel
1717
import io.sentry.SpanStatus
1818
import io.sentry.TypeCheckHint
1919
import io.sentry.util.PropagationTargetsUtils
20+
import io.sentry.util.UrlUtils
2021

2122
class SentryApollo3HttpInterceptor @JvmOverloads constructor(private val hub: IHub = HubAdapter.getInstance(), private val beforeSpan: BeforeSpanCallback? = null) :
2223
HttpInterceptor {
@@ -80,17 +81,19 @@ class SentryApollo3HttpInterceptor @JvmOverloads constructor(private val hub: IH
8081
}
8182

8283
private fun startChild(request: HttpRequest, activeSpan: ISpan): ISpan {
83-
val url = request.url
84+
val urlDetails = UrlUtils.parse(request.url)
8485
val method = request.method
8586

8687
val operationName = operationNameFromHeaders(request)
8788
val operation = operationName ?: "apollo.client"
8889
val operationType = request.valueForHeader(SENTRY_APOLLO_3_OPERATION_TYPE) ?: method
8990
val operationId = request.valueForHeader("X-APOLLO-OPERATION-ID")
9091
val variables = request.valueForHeader(SENTRY_APOLLO_3_VARIABLES)
91-
val description = "$operationType ${operationName ?: url}"
92+
val description = "$operationType ${operationName ?: urlDetails.urlOrFallback}"
9293

9394
return activeSpan.startChild(operation, description).apply {
95+
urlDetails.applyToSpan(this)
96+
9497
operationId?.let {
9598
setData("operationId", it)
9699
}
@@ -121,8 +124,7 @@ class SentryApollo3HttpInterceptor @JvmOverloads constructor(private val hub: IH
121124
}
122125
span.finish()
123126

124-
val breadcrumb =
125-
Breadcrumb.http(request.url, request.method.name, statusCode)
127+
val breadcrumb = Breadcrumb.http(request.url, request.method.name, statusCode)
126128

127129
request.body?.contentLength.ifHasValidLength { contentLength ->
128130
breadcrumb.setData("request_body_size", contentLength)

sentry-openfeign/src/main/java/io/sentry/openfeign/SentryFeignClient.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import io.sentry.SpanStatus;
1616
import io.sentry.util.Objects;
1717
import io.sentry.util.PropagationTargetsUtils;
18+
import io.sentry.util.UrlUtils;
1819
import java.io.IOException;
1920
import java.util.ArrayList;
2021
import java.util.Collection;
@@ -50,13 +51,15 @@ public Response execute(final @NotNull Request request, final @NotNull Request.O
5051
}
5152

5253
ISpan span = activeSpan.startChild("http.client");
53-
String url = request.url();
54-
span.setDescription(request.httpMethod().name() + " " + url);
54+
final @NotNull UrlUtils.UrlDetails urlDetails = UrlUtils.parse(request.url());
55+
span.setDescription(request.httpMethod().name() + " " + urlDetails.getUrlOrFallback());
56+
urlDetails.applyToSpan(span);
5557

5658
final RequestWrapper requestWrapper = new RequestWrapper(request);
5759

5860
if (!span.isNoOp()
59-
&& PropagationTargetsUtils.contain(hub.getOptions().getTracePropagationTargets(), url)) {
61+
&& PropagationTargetsUtils.contain(
62+
hub.getOptions().getTracePropagationTargets(), request.url())) {
6063
final SentryTraceHeader sentryTraceHeader = span.toSentryTrace();
6164
final @Nullable Collection<String> requestBaggageHeader =
6265
request.headers().get(BaggageHeader.BAGGAGE_HEADER);

sentry-servlet-jakarta/src/main/java/io/sentry/servlet/jakarta/SentryRequestHttpServletRequestProcessor.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.sentry.protocol.Request;
77
import io.sentry.util.HttpUtils;
88
import io.sentry.util.Objects;
9+
import io.sentry.util.UrlUtils;
910
import jakarta.servlet.http.HttpServletRequest;
1011
import java.util.Collections;
1112
import java.util.Enumeration;
@@ -30,8 +31,10 @@ public SentryRequestHttpServletRequestProcessor(@NotNull HttpServletRequest http
3031
public @NotNull SentryEvent process(@NotNull SentryEvent event, @NotNull Hint hint) {
3132
final Request sentryRequest = new Request();
3233
sentryRequest.setMethod(httpRequest.getMethod());
34+
final @NotNull UrlUtils.UrlDetails urlDetails =
35+
UrlUtils.parse(httpRequest.getRequestURL().toString());
36+
urlDetails.applyToRequest(sentryRequest);
3337
sentryRequest.setQueryString(httpRequest.getQueryString());
34-
sentryRequest.setUrl(httpRequest.getRequestURL().toString());
3538
sentryRequest.setHeaders(resolveHeadersMap(httpRequest));
3639

3740
event.setRequest(sentryRequest);

sentry-servlet/src/main/java/io/sentry/servlet/SentryRequestHttpServletRequestProcessor.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.sentry.protocol.Request;
77
import io.sentry.util.HttpUtils;
88
import io.sentry.util.Objects;
9+
import io.sentry.util.UrlUtils;
910
import java.util.Collections;
1011
import java.util.Enumeration;
1112
import java.util.HashMap;
@@ -30,8 +31,10 @@ public SentryRequestHttpServletRequestProcessor(@NotNull HttpServletRequest http
3031
public @NotNull SentryEvent process(@NotNull SentryEvent event, @NotNull Hint hint) {
3132
final Request sentryRequest = new Request();
3233
sentryRequest.setMethod(httpRequest.getMethod());
34+
final @NotNull UrlUtils.UrlDetails urlDetails =
35+
UrlUtils.parse(httpRequest.getRequestURL().toString());
36+
urlDetails.applyToRequest(sentryRequest);
3337
sentryRequest.setQueryString(httpRequest.getQueryString());
34-
sentryRequest.setUrl(httpRequest.getRequestURL().toString());
3538
sentryRequest.setHeaders(resolveHeadersMap(httpRequest));
3639

3740
event.setRequest(sentryRequest);

sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/SentryRequestResolver.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import java.util.Enumeration;
1010
import java.util.HashMap;
1111
import java.util.Map;
12+
13+
import io.sentry.util.UrlUtils;
1214
import jakarta.servlet.http.HttpServletRequest;
1315
import org.jetbrains.annotations.NotNull;
1416
import org.jetbrains.annotations.Nullable;
@@ -26,8 +28,9 @@ public SentryRequestResolver(final @NotNull IHub hub) {
2628
public @NotNull Request resolveSentryRequest(final @NotNull HttpServletRequest httpRequest) {
2729
final Request sentryRequest = new Request();
2830
sentryRequest.setMethod(httpRequest.getMethod());
31+
final @NotNull UrlUtils.UrlDetails urlDetails = UrlUtils.parse(httpRequest.getRequestURL().toString());
32+
urlDetails.applyToRequest(sentryRequest);
2933
sentryRequest.setQueryString(httpRequest.getQueryString());
30-
sentryRequest.setUrl(httpRequest.getRequestURL().toString());
3134
sentryRequest.setHeaders(resolveHeadersMap(httpRequest));
3235

3336
if (hub.getOptions().isSendDefaultPii()) {

sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/tracing/SentrySpanClientHttpRequestInterceptor.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import io.sentry.SpanStatus;
1515
import io.sentry.util.Objects;
1616
import io.sentry.util.PropagationTargetsUtils;
17+
import io.sentry.util.UrlUtils;
18+
1719
import java.io.IOException;
1820
import org.jetbrains.annotations.NotNull;
1921
import org.jetbrains.annotations.Nullable;
@@ -47,7 +49,9 @@ public SentrySpanClientHttpRequestInterceptor(final @NotNull IHub hub) {
4749
final ISpan span = activeSpan.startChild("http.client");
4850
final String methodName =
4951
request.getMethod() != null ? request.getMethod().name() : "unknown";
50-
span.setDescription(methodName + " " + request.getURI());
52+
final @NotNull UrlUtils.UrlDetails urlDetails = UrlUtils.parse(request.getURI().toString());
53+
span.setDescription(methodName + " " + urlDetails.getUrlOrFallback());
54+
urlDetails.applyToSpan(span);
5155

5256
if (!span.isNoOp() && PropagationTargetsUtils.contain(
5357
hub.getOptions().getTracePropagationTargets(), request.getURI())) {

sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/webflux/SentryRequestResolver.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
import io.sentry.protocol.Request;
66
import io.sentry.util.HttpUtils;
77
import io.sentry.util.Objects;
8+
import io.sentry.util.UrlUtils;
9+
10+
import java.net.URI;
811
import java.util.HashMap;
912
import java.util.List;
1013
import java.util.Map;
@@ -28,8 +31,9 @@ public SentryRequestResolver(final @NotNull IHub hub) {
2831
final String methodName =
2932
httpRequest.getMethod() != null ? httpRequest.getMethod().name() : "unknown";
3033
sentryRequest.setMethod(methodName);
31-
sentryRequest.setQueryString(httpRequest.getURI().getQuery());
32-
sentryRequest.setUrl(httpRequest.getURI().toString());
34+
final @NotNull URI uri = httpRequest.getURI();
35+
final @NotNull UrlUtils.UrlDetails urlDetails = UrlUtils.parse(uri.toString());
36+
urlDetails.applyToRequest(sentryRequest);
3337
sentryRequest.setHeaders(resolveHeadersMap(httpRequest.getHeaders()));
3438

3539
if (hub.getOptions().isSendDefaultPii()) {

sentry-spring-jakarta/src/test/kotlin/io/sentry/spring/jakarta/webflux/SentryWebfluxIntegrationTest.kt

+4-2
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import kotlin.test.BeforeTest
3838
import kotlin.test.Test
3939
import kotlin.test.assertEquals
4040
import kotlin.test.assertNotNull
41+
import kotlin.test.assertNull
4142

4243
@RunWith(SpringRunner::class)
4344
@SpringBootTest(
@@ -63,17 +64,18 @@ class SentryWebfluxIntegrationTest {
6364
@Test
6465
fun `attaches request information to SentryEvents`() {
6566
testClient.get()
66-
.uri("http://localhost:$port/hello?param=value")
67+
.uri("http://localhost:$port/hello?param=value#top")
6768
.exchange()
6869
.expectStatus()
6970
.isOk
7071

7172
verify(transport).send(
7273
checkEvent { event ->
7374
assertNotNull(event.request) {
74-
assertEquals("http://localhost:$port/hello?param=value", it.url)
75+
assertEquals("http://localhost:$port/hello", it.url)
7576
assertEquals("GET", it.method)
7677
assertEquals("param=value", it.queryString)
78+
assertNull(it.fragment)
7779
}
7880
},
7981
anyOrNull()

sentry-spring/src/main/java/io/sentry/spring/SentryRequestResolver.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import io.sentry.protocol.Request;
66
import io.sentry.util.HttpUtils;
77
import io.sentry.util.Objects;
8+
import io.sentry.util.UrlUtils;
89
import java.util.Collections;
910
import java.util.Enumeration;
1011
import java.util.HashMap;
@@ -26,8 +27,10 @@ public SentryRequestResolver(final @NotNull IHub hub) {
2627
public @NotNull Request resolveSentryRequest(final @NotNull HttpServletRequest httpRequest) {
2728
final Request sentryRequest = new Request();
2829
sentryRequest.setMethod(httpRequest.getMethod());
30+
final @NotNull UrlUtils.UrlDetails urlDetails =
31+
UrlUtils.parse(httpRequest.getRequestURL().toString());
32+
urlDetails.applyToRequest(sentryRequest);
2933
sentryRequest.setQueryString(httpRequest.getQueryString());
30-
sentryRequest.setUrl(httpRequest.getRequestURL().toString());
3134
sentryRequest.setHeaders(resolveHeadersMap(httpRequest));
3235

3336
if (hub.getOptions().isSendDefaultPii()) {

sentry-spring/src/main/java/io/sentry/spring/tracing/SentrySpanClientHttpRequestInterceptor.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import io.sentry.SpanStatus;
1515
import io.sentry.util.Objects;
1616
import io.sentry.util.PropagationTargetsUtils;
17+
import io.sentry.util.UrlUtils;
1718
import java.io.IOException;
1819
import org.jetbrains.annotations.NotNull;
1920
import org.jetbrains.annotations.Nullable;
@@ -47,7 +48,9 @@ public SentrySpanClientHttpRequestInterceptor(final @NotNull IHub hub) {
4748
final ISpan span = activeSpan.startChild("http.client");
4849
final String methodName =
4950
request.getMethod() != null ? request.getMethod().name() : "unknown";
50-
span.setDescription(methodName + " " + request.getURI());
51+
final @NotNull UrlUtils.UrlDetails urlDetails = UrlUtils.parse(request.getURI().toString());
52+
urlDetails.applyToSpan(span);
53+
span.setDescription(methodName + " " + urlDetails.getUrlOrFallback());
5154

5255
if (!span.isNoOp()
5356
&& PropagationTargetsUtils.contain(

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

+4-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import io.sentry.SpanStatus;
1414
import io.sentry.util.Objects;
1515
import io.sentry.util.PropagationTargetsUtils;
16+
import io.sentry.util.UrlUtils;
1617
import org.jetbrains.annotations.NotNull;
1718
import org.jetbrains.annotations.Nullable;
1819
import org.springframework.web.reactive.function.client.ClientRequest;
@@ -39,7 +40,9 @@ public SentrySpanClientWebRequestFilter(final @NotNull IHub hub) {
3940
}
4041

4142
final ISpan span = activeSpan.startChild("http.client");
42-
span.setDescription(request.method().name() + " " + request.url());
43+
final @NotNull UrlUtils.UrlDetails urlDetails = UrlUtils.parse(request.url().toString());
44+
span.setDescription(request.method().name() + " " + urlDetails.getUrlOrFallback());
45+
urlDetails.applyToSpan(span);
4346

4447
final ClientRequest.Builder requestBuilder = ClientRequest.from(request);
4548

sentry-spring/src/main/java/io/sentry/spring/webflux/SentryRequestResolver.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import io.sentry.protocol.Request;
66
import io.sentry.util.HttpUtils;
77
import io.sentry.util.Objects;
8+
import io.sentry.util.UrlUtils;
9+
import java.net.URI;
810
import java.util.HashMap;
911
import java.util.List;
1012
import java.util.Map;
@@ -28,8 +30,9 @@ public SentryRequestResolver(final @NotNull IHub hub) {
2830
final String methodName =
2931
httpRequest.getMethod() != null ? httpRequest.getMethod().name() : "unknown";
3032
sentryRequest.setMethod(methodName);
31-
sentryRequest.setQueryString(httpRequest.getURI().getQuery());
32-
sentryRequest.setUrl(httpRequest.getURI().toString());
33+
final @NotNull URI uri = httpRequest.getURI();
34+
final @NotNull UrlUtils.UrlDetails urlDetails = UrlUtils.parse(uri.toString());
35+
urlDetails.applyToRequest(sentryRequest);
3336
sentryRequest.setHeaders(resolveHeadersMap(httpRequest.getHeaders()));
3437

3538
if (hub.getOptions().isSendDefaultPii()) {

0 commit comments

Comments
 (0)