Skip to content

Commit af06467

Browse files
committed
Fix handling network errors when reading body of response with unsuccessful HTTP status code
1 parent 21056ca commit af06467

File tree

2 files changed

+33
-17
lines changed

2 files changed

+33
-17
lines changed

rpc/src/main/kotlin/org/equeim/tremotesf/rpc/OkHttpCallback.kt

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -48,24 +48,24 @@ internal class OkHttpCallback<ResponseArguments : Any>(
4848
if (response.isSuccessful) Log.DEBUG else Log.ERROR,
4949
"Received response headers for RPC request with $context: status is ${response.status}"
5050
)
51-
if (!response.isSuccessful) {
52-
resumeWithException(
53-
when (response.code) {
54-
HttpURLConnection.HTTP_UNAUTHORIZED -> RpcRequestError.AuthenticationError(
55-
response,
56-
requestHeaders
57-
)
58-
59-
else -> RpcRequestError.UnsuccessfulHttpStatusCode(
60-
response = response,
61-
responseBody = body?.string(),
62-
requestHeaders = requestHeaders
63-
)
64-
}
65-
)
66-
return
67-
}
6851
try {
52+
if (!response.isSuccessful) {
53+
resumeWithException(
54+
when (response.code) {
55+
HttpURLConnection.HTTP_UNAUTHORIZED -> RpcRequestError.AuthenticationError(
56+
response,
57+
requestHeaders
58+
)
59+
60+
else -> RpcRequestError.UnsuccessfulHttpStatusCode(
61+
response = response,
62+
responseBody = body.string(),
63+
requestHeaders = requestHeaders
64+
)
65+
}
66+
)
67+
return
68+
}
6969
if (body.contentLength() == 0L) {
7070
throw SerializationException("Response does not have a body")
7171
}

rpc/src/test/kotlin/org/equeim/tremotesf/rpc/RpcClientTest.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,22 @@ class RpcClientTest {
184184
assertThrows<RpcRequestError.NetworkError> { client.getSessionStats() }
185185
}
186186

187+
@ParameterizedTest
188+
@ValueSource(booleans = [true, false])
189+
fun `Check connection error when reading response body on http status code error`(errorDuringValidation: Boolean) =
190+
runTest {
191+
if (!errorDuringValidation) {
192+
enqueueSuccessfulValidation()
193+
}
194+
server.enqueue(
195+
MockResponse.Builder()
196+
.code(HttpURLConnection.HTTP_INTERNAL_ERROR)
197+
.body("lol")
198+
.onResponseBody(SocketEffect.ShutdownConnection).build()
199+
)
200+
assertThrows<RpcRequestError.NetworkError> { client.getSessionStats() }
201+
}
202+
187203
@ParameterizedTest
188204
@ValueSource(booleans = [true, false])
189205
fun `Check http status code error`(errorDuringValidation: Boolean) = runTest {

0 commit comments

Comments
 (0)