Skip to content

Commit 48709b5

Browse files
authored
Merge pull request #6064 from getsentry/fix/data-collection-websocket-urls
fix(core): [Data Collection 23] Support WebSocket URL parsing
2 parents 4b95c7e + 4844227 commit 48709b5

3 files changed

Lines changed: 42 additions & 5 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## Unreleased
4+
5+
### Fixes
6+
7+
- Support `ws` and `wss` URL parsing for WebSocket instrumentation ([#6064](https://github.com/getsentry/sentry-java/pull/6064))
8+
39
## 8.55.0
410

511
### Features

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ public final class UrlUtils {
5555
}
5656

5757
private static boolean isValidAbsoluteUrl(final @NotNull URI uri) {
58+
final @Nullable String scheme = uri.getScheme();
59+
if ("ws".equalsIgnoreCase(scheme) || "wss".equalsIgnoreCase(scheme)) {
60+
return !uri.isOpaque() && uri.getRawAuthority() != null && !uri.getRawAuthority().isEmpty();
61+
}
62+
5863
try {
5964
uri.toURL();
6065
} catch (Exception e) {

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

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -357,10 +357,36 @@ class UrlUtilsTest {
357357
}
358358

359359
@Test
360-
fun `does not extract details from websockets uri`() {
361-
val urlDetails = UrlUtils.parse("wss://example.com/socket")
362-
assertNull(urlDetails.url)
363-
assertNull(urlDetails.query)
364-
assertNull(urlDetails.fragment)
360+
fun `extracts details from websocket uri`() {
361+
val urlDetails = UrlUtils.parse("ws://example.com/socket?channel=updates#top")
362+
363+
assertThat(urlDetails.url).isEqualTo("ws://example.com/socket")
364+
assertThat(urlDetails.query).isEqualTo("channel=updates")
365+
assertThat(urlDetails.fragment).isEqualTo("top")
366+
}
367+
368+
@Test
369+
fun `filters query parameters from secure websocket uri`() {
370+
val options = SentryOptions().also { it.dataCollection.setUserInfo(false) }
371+
val urlDetails =
372+
UrlUtils.parse(
373+
"wss://example.com/socket?channel=updates&token=secret",
374+
options.dataCollectionResolver,
375+
)
376+
377+
assertThat(urlDetails.url).isEqualTo("wss://example.com/socket")
378+
assertThat(urlDetails.query).isEqualTo("channel=updates&token=[Filtered]")
379+
assertThat(urlDetails.fragment).isNull()
380+
}
381+
382+
@Test
383+
fun `does not extract details from websocket uri without authority`() {
384+
listOf("ws:example.com/socket", "wss:///socket").forEach { url ->
385+
val urlDetails = UrlUtils.parse(url)
386+
387+
assertThat(urlDetails.url).isNull()
388+
assertThat(urlDetails.query).isNull()
389+
assertThat(urlDetails.fragment).isNull()
390+
}
365391
}
366392
}

0 commit comments

Comments
 (0)