Skip to content

Commit d7da105

Browse files
committed
fix: Fix error body conversion in NetworkResponse call
Fixes #4
1 parent 4c367b2 commit d7da105

File tree

2 files changed

+36
-4
lines changed

2 files changed

+36
-4
lines changed

src/main/kotlin/com/haroldadmin/cnradapter/NetworkResponseCall.kt

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,20 @@ internal class NetworkResponseCall<S : Any, E : Any>(
1616
backingCall.enqueue(object : Callback<S> {
1717
override fun onResponse(call: Call<S>, response: Response<S>) {
1818
val body = response.body()
19-
if (body != null) {
20-
callback.onResponse(this@NetworkResponseCall, Response.success(NetworkResponse.Success(body, response.headers())))
19+
val headers = response.headers()
20+
val code = response.code()
21+
val errorBody = response.errorBody()
22+
23+
if (response.isSuccessful) {
24+
if (body != null) {
25+
callback.onResponse(this@NetworkResponseCall, Response.success(NetworkResponse.Success(body, headers)))
26+
} else {
27+
// Response is successful but the body is null, so there's probably a server error here
28+
callback.onResponse(this@NetworkResponseCall, Response.success(NetworkResponse.ServerError(null, code, headers)))
29+
}
2130
} else {
22-
callback.onResponse(this@NetworkResponseCall, Response.success(NetworkResponse.ServerError(null, response.code(), response.headers())))
31+
val convertedErrorBody = try { errorConverter.convert(errorBody) } catch (ex: Exception) { null }
32+
callback.onResponse(this@NetworkResponseCall, Response.success(NetworkResponse.ServerError(convertedErrorBody, code, headers)))
2333
}
2434
}
2535

src/test/kotlin/com/haroldadmin/cnradapter/NetworkResponseCallTest.kt

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import retrofit2.*
1313
import java.io.IOException
1414

1515
internal class NetworkResponseCallTest {
16-
private val errorConverter = Converter<ResponseBody, String> { it.toString() }
16+
private val errorConverter = Converter<ResponseBody, String> { it.string() }
1717
private val backingCall = CompletableCall<String>()
1818
private val networkResponseCall = NetworkResponseCall<String, String>(backingCall, errorConverter)
1919

@@ -75,6 +75,28 @@ internal class NetworkResponseCallTest {
7575
backingCall.completeWithException(HttpException(Response.error<String>(404, "Server Error".toResponseBody())))
7676
}
7777

78+
@Test
79+
fun `should parse error body correctly when ServerError occurs`() {
80+
81+
val errorBody = "An error occurred"
82+
val responseCode = 404
83+
84+
networkResponseCall.enqueue(object: Callback<NetworkResponse<String, String>> {
85+
override fun onResponse(call: Call<NetworkResponse<String, String>>, response: Response<NetworkResponse<String, String>>) {
86+
with(response.body()) {
87+
this as NetworkResponse.ServerError<String>
88+
body shouldBe errorBody
89+
code shouldBe responseCode
90+
}
91+
}
92+
93+
override fun onFailure(call: Call<NetworkResponse<String, String>>, t: Throwable) {
94+
throw IllegalStateException()
95+
}
96+
})
97+
backingCall.complete(Response.error(responseCode, errorBody.toResponseBody()))
98+
}
99+
78100
@Test
79101
fun `should parse unsuccessful call with IOException as NetworkResponse NetworkError`() {
80102
networkResponseCall.enqueue(object: Callback<NetworkResponse<String, String>> {

0 commit comments

Comments
 (0)