Skip to content

Commit 44cb12f

Browse files
jkmasselclaude
andcommitted
Propagate request URL and method through Kotlin bindings
Pass requestUrl and requestMethod to all error catch blocks in executeRequestSafely and remove default parameter values to prevent future regressions. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent d5fa094 commit 44cb12f

File tree

5 files changed

+70
-13
lines changed

5 files changed

+70
-13
lines changed

native/kotlin/api/kotlin/src/integrationTest/kotlin/MockRequestExecutor.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import kotlinx.coroutines.delay
44
import okio.FileNotFoundException
55
import uniffi.wp_api.RequestContext
66
import uniffi.wp_api.RequestExecutor
7+
import uniffi.wp_api.RequestMethod
78
import uniffi.wp_api.WpMultipartFormRequest
89
import uniffi.wp_api.WpNetworkHeaderMap
910
import uniffi.wp_api.WpNetworkRequest
@@ -60,6 +61,7 @@ val WpNetworkResponse.Companion.empty: WpNetworkResponse
6061
200u,
6162
WpNetworkHeaderMap.empty,
6263
"",
64+
RequestMethod.GET,
6365
WpNetworkHeaderMap.empty
6466
)
6567

@@ -72,6 +74,7 @@ fun WpNetworkResponse.Companion.withApiRoot(url: String): WpNetworkResponse {
7274
200u,
7375
WpNetworkHeaderMap.fromMap(mapOf("Link" to "<$url>; rel=\"https://api.w.org/\"")),
7476
"",
77+
RequestMethod.GET,
7578
WpNetworkHeaderMap.empty
7679
)
7780
}
@@ -88,6 +91,7 @@ fun WpNetworkResponse.Companion.jsonResponse(name: String): WpNetworkResponse {
8891
200u,
8992
WpNetworkHeaderMap.fromMap(mapOf("Content-Type" to "application/json")),
9093
"",
94+
RequestMethod.GET,
9195
WpNetworkHeaderMap.empty
9296
)
9397
}
@@ -98,6 +102,7 @@ fun WpNetworkResponse.Companion.retryResponse(delay: ULong): WpNetworkResponse {
98102
429u,
99103
WpNetworkHeaderMap.fromMap(mapOf("Retry-After" to delay.toString())),
100104
"",
105+
RequestMethod.GET,
101106
WpNetworkHeaderMap.empty
102107
)
103108
}

native/kotlin/api/kotlin/src/main/kotlin/rs/wordpress/api/kotlin/ApiClientHelpers.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,16 @@ fun <T> mapWpApiExceptionToWpRequestResult(apiException: WpApiException): WpRequ
66
when (apiException) {
77
is WpApiException.InvalidHttpStatusCode -> WpRequestResult.InvalidHttpStatusCode<T>(
88
statusCode = apiException.statusCode,
9+
requestUrl = apiException.requestUrl,
10+
requestMethod = apiException.requestMethod,
911
)
1012

1113
is WpApiException.RequestExecutionFailed -> WpRequestResult.RequestExecutionFailed<T>(
1214
statusCode = apiException.statusCode,
1315
redirects = apiException.redirects,
14-
reason = apiException.reason
16+
reason = apiException.reason,
17+
requestUrl = apiException.requestUrl,
18+
requestMethod = apiException.requestMethod,
1519
)
1620

1721
is WpApiException.MediaFileNotFound -> WpRequestResult.MediaFileNotFound<T>(
@@ -21,6 +25,8 @@ fun <T> mapWpApiExceptionToWpRequestResult(apiException: WpApiException): WpRequ
2125
is WpApiException.ResponseParsingException -> WpRequestResult.ResponseParsingError<T>(
2226
reason = apiException.reason,
2327
response = apiException.response,
28+
requestUrl = apiException.requestUrl,
29+
requestMethod = apiException.requestMethod,
2430
)
2531

2632
is WpApiException.SiteUrlParsingException -> WpRequestResult.SiteUrlParsingError<T>(
@@ -30,12 +36,16 @@ fun <T> mapWpApiExceptionToWpRequestResult(apiException: WpApiException): WpRequ
3036
is WpApiException.UnknownException -> WpRequestResult.UnknownError<T>(
3137
statusCode = apiException.statusCode,
3238
response = apiException.response,
39+
requestUrl = apiException.requestUrl,
40+
requestMethod = apiException.requestMethod,
3341
)
3442

3543
is WpApiException.WpException -> WpRequestResult.WpError<T>(
3644
errorCode = apiException.errorCode,
3745
errorMessage = apiException.errorMessage,
3846
statusCode = apiException.statusCode,
3947
response = apiException.response,
48+
requestUrl = apiException.requestUrl,
49+
requestMethod = apiException.requestMethod,
4050
)
4151
}

native/kotlin/api/kotlin/src/main/kotlin/rs/wordpress/api/kotlin/WpRequestExecutor.kt

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class WpRequestExecutor @JvmOverloads constructor(
7676
addRequestHeaders(requestBuilder, request.headerMap())
7777
val urlRequest = requestBuilder.build()
7878

79-
executeRequestSafely(urlRequest, request.url(), request.headerMap())
79+
executeRequestSafely(urlRequest, request.url(), request.method(), request.headerMap())
8080
}
8181

8282
override suspend fun upload(request: WpMultipartFormRequest): WpNetworkResponse =
@@ -89,7 +89,13 @@ class WpRequestExecutor @JvmOverloads constructor(
8989
addRequestHeaders(requestBuilder, request.headerMap())
9090
val urlRequest = requestBuilder.build()
9191

92-
executeRequestSafely(urlRequest, request.url(), request.headerMap(), notifyUploadListener = true)
92+
executeRequestSafely(
93+
urlRequest,
94+
request.url(),
95+
request.method(),
96+
request.headerMap(),
97+
notifyUploadListener = true
98+
)
9399
}
94100

95101
private fun buildMultipartBody(request: WpMultipartFormRequest): MultipartBody {
@@ -157,6 +163,7 @@ class WpRequestExecutor @JvmOverloads constructor(
157163
private fun executeRequestSafely(
158164
urlRequest: Request,
159165
requestUrl: String,
166+
requestMethod: RequestMethod,
160167
requestHeaderMap: WpNetworkHeaderMap,
161168
notifyUploadListener: Boolean = false
162169
): WpNetworkResponse {
@@ -174,30 +181,49 @@ class WpRequestExecutor @JvmOverloads constructor(
174181
statusCode = response.code.toUShort(),
175182
responseHeaderMap = WpNetworkHeaderMap.fromMultiMap(response.headers.toMultimap()),
176183
requestUrl = requestUrl,
184+
requestMethod = requestMethod,
177185
requestHeaderMap = requestHeaderMap
178186
)
179187
}
180188
} catch (e: SSLPeerUnverifiedException) {
181189
throw requestExecutionFailedWith(
182-
RequestExecutionErrorReason.invalidSSLError(e, urlRequest.url)
190+
RequestExecutionErrorReason.invalidSSLError(e, urlRequest.url),
191+
requestUrl,
192+
requestMethod,
183193
)
184194
} catch (e: UnknownHostException) {
185-
throw requestExecutionFailedWith(RequestExecutionErrorReason.unknownHost(e))
195+
throw requestExecutionFailedWith(
196+
RequestExecutionErrorReason.unknownHost(e),
197+
requestUrl,
198+
requestMethod,
199+
)
186200
} catch (e: NoRouteToHostException) {
187-
throw requestExecutionFailedWith(RequestExecutionErrorReason.noRouteToHost(e))
201+
throw requestExecutionFailedWith(
202+
RequestExecutionErrorReason.noRouteToHost(e),
203+
requestUrl,
204+
requestMethod,
205+
)
188206
} catch (e: ConnectException) {
189207
throw requestExecutionFailedWith(
190208
RequestExecutionErrorReason.HttpError(
191209
reason = "Connection failed: ${e.localizedMessage}"
192-
)
210+
),
211+
requestUrl,
212+
requestMethod,
193213
)
194214
} catch (e: SocketTimeoutException) {
195-
throw requestExecutionFailedWith(RequestExecutionErrorReason.HttpTimeoutError)
215+
throw requestExecutionFailedWith(
216+
RequestExecutionErrorReason.HttpTimeoutError,
217+
requestUrl,
218+
requestMethod,
219+
)
196220
} catch (e: Exception) {
197221
throw requestExecutionFailedWith(
198222
RequestExecutionErrorReason.GenericError(
199223
errorMessage = e.localizedMessage ?: e.toString()
200-
)
224+
),
225+
requestUrl,
226+
requestMethod,
201227
)
202228
}
203229
}
@@ -309,9 +335,15 @@ private fun RequestExecutionErrorReason.Companion.invalidSSLError(
309335
}
310336
}
311337

312-
private fun requestExecutionFailedWith(reason: RequestExecutionErrorReason) =
338+
private fun requestExecutionFailedWith(
339+
reason: RequestExecutionErrorReason,
340+
requestUrl: String,
341+
requestMethod: RequestMethod,
342+
) =
313343
RequestExecutionException.RequestExecutionFailed(
314344
statusCode = null,
315345
redirects = null,
316-
reason = reason
346+
reason = reason,
347+
requestUrl = requestUrl,
348+
requestMethod = requestMethod,
317349
)

native/kotlin/api/kotlin/src/main/kotlin/rs/wordpress/api/kotlin/WpRequestResult.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package rs.wordpress.api.kotlin
22

33
import uniffi.wp_api.RequestExecutionErrorReason
4+
import uniffi.wp_api.RequestMethod
45
import uniffi.wp_api.WpErrorCode
56
import uniffi.wp_api.WpRedirect
67

@@ -11,16 +12,22 @@ sealed class WpRequestResult<T> {
1112
val errorMessage: String,
1213
val statusCode: UShort,
1314
val response: String,
15+
val requestUrl: String,
16+
val requestMethod: RequestMethod,
1417
) : WpRequestResult<T>()
1518

1619
data class InvalidHttpStatusCode<T>(
17-
val statusCode: UShort
20+
val statusCode: UShort,
21+
val requestUrl: String,
22+
val requestMethod: RequestMethod,
1823
) : WpRequestResult<T>()
1924

2025
data class RequestExecutionFailed<T>(
2126
val statusCode: UShort?,
2227
val redirects: List<WpRedirect>?,
2328
val reason: RequestExecutionErrorReason,
29+
val requestUrl: String,
30+
val requestMethod: RequestMethod,
2431
) : WpRequestResult<T>()
2532

2633
data class MediaFileNotFound<T>(
@@ -34,11 +41,15 @@ sealed class WpRequestResult<T> {
3441
data class ResponseParsingError<T>(
3542
val reason: String,
3643
val response: String,
44+
val requestUrl: String,
45+
val requestMethod: RequestMethod,
3746
) : WpRequestResult<T>()
3847

3948
data class UnknownError<T>(
4049
val statusCode: UShort,
4150
val response: String,
51+
val requestUrl: String,
52+
val requestMethod: RequestMethod,
4253
) : WpRequestResult<T>()
4354

4455
fun successfulResponse(): T? =

wp_api/src/login/url_discovery.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1154,6 +1154,5 @@ mod tests {
11541154
site_icon_url: None,
11551155
}
11561156
}
1157-
11581157
}
11591158
}

0 commit comments

Comments
 (0)