Skip to content

Commit 4c27384

Browse files
Manabu-GTclaude
andauthored
fix: display query parameters in network overlay UI (#223)
Query params were captured and stored correctly by the OkHttp interceptor but UrlParts only extracted uri.path, silently dropping everything after '?'. Both the network list row and detail screen URL section now show query params. - Add `query` field and `pathWithQuery` computed property to UrlParts - Guard empty path and empty query string edge cases - Show full path?query in the network list row - Show query on a separate line in the detail screen UrlDisplay - Hoist UrlParts.from() in OverviewTab to avoid double-parsing the URL Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 98b6a25 commit 4c27384

3 files changed

Lines changed: 26 additions & 15 deletions

File tree

debugoverlay-core/src/main/kotlin/com/ms/square/debugoverlay/internal/data/UrlParts.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,18 @@ package com.ms.square.debugoverlay.internal.data
22

33
import androidx.core.net.toUri
44

5-
internal data class UrlParts(val scheme: String, val domain: String, val path: String) {
5+
internal data class UrlParts(val scheme: String, val domain: String, val path: String, val query: String?) {
6+
val pathWithQuery: String
7+
get() = if (query != null) "$path?$query" else path
8+
69
companion object {
710
fun from(url: String): UrlParts {
811
val uri = url.toUri()
912
return UrlParts(
1013
scheme = uri.scheme ?: "",
1114
domain = uri.host ?: "",
12-
path = uri.path ?: "/"
15+
path = uri.path?.ifEmpty { "/" } ?: "/",
16+
query = uri.query?.ifEmpty { null }
1317
)
1418
}
1519
}

debugoverlay-core/src/main/kotlin/com/ms/square/debugoverlay/internal/ui/NetworkRequestDetailScreen.kt

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ import com.ms.square.debugoverlay.model.NetworkRequest
6666
internal fun NetworkRequestDetailScreen(request: NetworkRequest, onBack: () -> Unit, modifier: Modifier = Modifier) {
6767
val clipboard = LocalClipboard.current
6868
val scope = rememberCoroutineScope()
69-
val domain = remember(request.url) { UrlParts.from(request.url).domain }
69+
val urlParts = remember(request.url) { UrlParts.from(request.url) }
7070

7171
Scaffold(
7272
modifier = modifier.fillMaxSize(),
@@ -82,7 +82,7 @@ internal fun NetworkRequestDetailScreen(request: NetworkRequest, onBack: () -> U
8282
StatusCodeBadge(statusCode = request.statusCode)
8383
}
8484
Text(
85-
text = domain,
85+
text = urlParts.domain,
8686
style = MaterialTheme.typography.bodySmall,
8787
color = MaterialTheme.colorScheme.onSurfaceVariant,
8888
maxLines = 1,
@@ -113,13 +113,14 @@ internal fun NetworkRequestDetailScreen(request: NetworkRequest, onBack: () -> U
113113
) { paddingValues ->
114114
NetworkRequestDetailContent(
115115
request = request,
116+
urlParts = urlParts,
116117
modifier = Modifier.padding(paddingValues)
117118
)
118119
}
119120
}
120121

121122
@Composable
122-
private fun NetworkRequestDetailContent(request: NetworkRequest, modifier: Modifier = Modifier) {
123+
private fun NetworkRequestDetailContent(request: NetworkRequest, urlParts: UrlParts, modifier: Modifier = Modifier) {
123124
var selectedTab by remember { mutableIntStateOf(0) }
124125

125126
Column(modifier = modifier.fillMaxSize()) {
@@ -148,7 +149,7 @@ private fun NetworkRequestDetailContent(request: NetworkRequest, modifier: Modif
148149
// Content
149150
SelectionContainer(modifier = Modifier.fillMaxSize()) {
150151
when (selectedTab) {
151-
0 -> OverviewTab(request = request)
152+
0 -> OverviewTab(request = request, urlParts = urlParts)
152153
1 -> HeadersTab(request = request)
153154
2 -> BodyTab(request = request)
154155
}
@@ -161,7 +162,7 @@ private fun NetworkRequestDetailContent(request: NetworkRequest, modifier: Modif
161162
*/
162163
@Suppress("LongMethod") // Complex UI with multiple sections
163164
@Composable
164-
private fun OverviewTab(request: NetworkRequest, modifier: Modifier = Modifier) {
165+
private fun OverviewTab(request: NetworkRequest, urlParts: UrlParts, modifier: Modifier = Modifier) {
165166
val clipboard = LocalClipboard.current
166167
val scope = rememberCoroutineScope()
167168

@@ -185,7 +186,7 @@ private fun OverviewTab(request: NetworkRequest, modifier: Modifier = Modifier)
185186
scope.copyToClipboard(clipboard, request.url)
186187
}
187188
) {
188-
UrlDisplay(url = request.url)
189+
UrlDisplay(parts = urlParts)
189190
}
190191
}
191192

@@ -510,14 +511,10 @@ private fun InfoRow(
510511
}
511512

512513
/**
513-
* URL display with scheme, domain, and path.
514+
* URL display with scheme, domain, path, and query parameters.
514515
*/
515516
@Composable
516-
private fun UrlDisplay(url: String, modifier: Modifier = Modifier) {
517-
val parts = remember(url) {
518-
UrlParts.from(url)
519-
}
520-
517+
private fun UrlDisplay(parts: UrlParts, modifier: Modifier = Modifier) {
521518
Surface(
522519
modifier = modifier.fillMaxWidth(),
523520
shape = MaterialTheme.shapes.medium,
@@ -547,6 +544,16 @@ private fun UrlDisplay(url: String, modifier: Modifier = Modifier) {
547544
color = MaterialTheme.colorScheme.tertiary,
548545
fontFamily = FontFamily.Monospace
549546
)
547+
548+
if (parts.query != null) {
549+
Text(
550+
text = "?${parts.query}",
551+
style = MaterialTheme.typography.bodySmall,
552+
color = MaterialTheme.colorScheme.onSurfaceVariant,
553+
fontFamily = FontFamily.Monospace,
554+
modifier = Modifier.padding(top = 2.dp)
555+
)
556+
}
550557
}
551558
}
552559
}

debugoverlay-core/src/main/kotlin/com/ms/square/debugoverlay/internal/ui/NetworkTabContent.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ private fun NetworkRequestItem(request: NetworkRequest, onClick: () -> Unit, mod
299299
MethodBadge(method = request.method)
300300

301301
Text(
302-
text = urlParts.path,
302+
text = urlParts.pathWithQuery,
303303
style = MaterialTheme.typography.bodyMedium,
304304
color = MaterialTheme.colorScheme.onSurface,
305305
fontFamily = FontFamily.Monospace,

0 commit comments

Comments
 (0)