Skip to content

Commit 8b00c71

Browse files
committed
Refactor HTTP calls to use okhttp-coroutines
1 parent 80b87b3 commit 8b00c71

3 files changed

Lines changed: 23 additions & 61 deletions

File tree

gradle/libs.versions.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ activity-compose = "1.9.3"
3535
[libraries]
3636
# Library dependencies
3737
com-squareup-okhttp3 = { module = "com.squareup.okhttp3:okhttp", version.ref = "com-squareup-okhttp3" }
38+
com-squareup-okhttp3-coroutines = { module = "com.squareup.okhttp3:okhttp-coroutines", version.ref = "com-squareup-okhttp3" }
3839
org-robolectric = { module = "org.robolectric:robolectric", version.ref = "org-robolectric" }
3940
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
4041
kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" }

rssparser/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ kotlin {
112112

113113
get("jvmAndroidMain").dependencies {
114114
api(libs.com.squareup.okhttp3)
115+
implementation(libs.com.squareup.okhttp3.coroutines)
115116
}
116117

117118
get("webMain").dependencies {
Lines changed: 21 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
11
package com.prof18.rssparser.internal
22

33
import com.prof18.rssparser.exception.HttpException
4-
import kotlinx.coroutines.suspendCancellableCoroutine
54
import okhttp3.Call
6-
import okhttp3.Callback
75
import okhttp3.Request
8-
import okhttp3.Response
9-
import java.io.IOException
10-
import java.io.InputStream
11-
import kotlin.coroutines.resume
12-
import kotlin.coroutines.resumeWithException
6+
import okhttp3.coroutines.executeAsync
137

148
internal class JvmXmlFetcher(
159
private val callFactory: Call.Factory,
@@ -18,71 +12,37 @@ internal class JvmXmlFetcher(
1812
override suspend fun fetchXml(url: String): ParserInput {
1913
val request = createRequest(url)
2014
val baseUrl = request.url.scheme + "://" + request.url.host
15+
val response = callFactory.newCall(request).executeAsync()
16+
if (!response.isSuccessful) {
17+
val exception = HttpException(
18+
code = response.code,
19+
message = response.message,
20+
)
21+
response.close()
22+
throw exception
23+
}
2124
return ParserInput(
22-
inputStream = callFactory.newCall(request).awaitForInputStream(),
25+
inputStream = response.body.byteStream(),
2326
baseUrl = baseUrl,
2427
)
2528
}
2629

2730
override suspend fun fetchXmlAsString(url: String): String {
2831
val request = createRequest(url)
29-
return callFactory.newCall(request).awaitForString()
32+
val response = callFactory.newCall(request).executeAsync()
33+
if (!response.isSuccessful) {
34+
val exception = HttpException(
35+
code = response.code,
36+
message = response.message,
37+
)
38+
response.close()
39+
throw exception
40+
}
41+
return response.body.string()
3042
}
3143

3244
private fun createRequest(url: String): Request =
3345
Request.Builder()
3446
.url(url)
3547
.build()
36-
37-
private suspend fun Call.awaitForInputStream(): InputStream = suspendCancellableCoroutine { continuation ->
38-
continuation.invokeOnCancellation {
39-
cancel()
40-
}
41-
42-
enqueue(object : Callback {
43-
override fun onResponse(call: Call, response: Response) {
44-
if (response.isSuccessful) {
45-
val body = requireNotNull(response.body)
46-
continuation.resume(body.byteStream())
47-
} else {
48-
val exception = HttpException(
49-
code = response.code,
50-
message = response.message,
51-
)
52-
response.close()
53-
continuation.resumeWithException(exception)
54-
}
55-
}
56-
57-
override fun onFailure(call: Call, e: IOException) {
58-
continuation.resumeWithException(e)
59-
}
60-
})
61-
}
62-
63-
private suspend fun Call.awaitForString(): String = suspendCancellableCoroutine { continuation ->
64-
continuation.invokeOnCancellation {
65-
cancel()
66-
}
67-
68-
enqueue(object : Callback {
69-
override fun onResponse(call: Call, response: Response) {
70-
if (response.isSuccessful) {
71-
val body = requireNotNull(response.body)
72-
continuation.resume(body.string())
73-
} else {
74-
val exception = HttpException(
75-
code = response.code,
76-
message = response.message,
77-
)
78-
response.close()
79-
continuation.resumeWithException(exception)
80-
}
81-
}
82-
83-
override fun onFailure(call: Call, e: IOException) {
84-
continuation.resumeWithException(e)
85-
}
86-
})
87-
}
8848
}

0 commit comments

Comments
 (0)