-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathHttpModule.kt
More file actions
79 lines (72 loc) · 2.28 KB
/
HttpModule.kt
File metadata and controls
79 lines (72 loc) · 2.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package to.bitkit.di
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import io.ktor.client.HttpClient
import io.ktor.client.plugins.HttpTimeout
import io.ktor.client.plugins.HttpTimeoutConfig
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
import io.ktor.client.plugins.defaultRequest
import io.ktor.client.plugins.logging.LogLevel
import io.ktor.client.plugins.logging.Logging
import io.ktor.client.plugins.logging.LoggingConfig
import io.ktor.client.request.head
import io.ktor.http.ContentType
import io.ktor.http.contentType
import io.ktor.http.isSuccess
import io.ktor.serialization.kotlinx.json.json
import kotlinx.serialization.json.Json
import to.bitkit.utils.AppError
import to.bitkit.utils.Logger
import to.bitkit.utils.UrlValidator
import javax.inject.Singleton
import io.ktor.client.plugins.logging.Logger as KtorLogger
@Module
@InstallIn(SingletonComponent::class)
object HttpModule {
@Provides
@Singleton
fun provideHttpClient(json: Json): HttpClient {
return HttpClient {
install(HttpTimeout) {
this@install.defaultTimeoutConfig()
}
install(Logging) {
this@install.defaultLoggingConfig()
}
install(ContentNegotiation) {
json(json = json)
}
defaultRequest {
contentType(ContentType.Application.Json)
}
}
}
@Provides
@Singleton
fun provideUrlValidator(httpClient: HttpClient) = UrlValidator { url ->
runCatching {
val response = httpClient.head(url)
if (!response.status.isSuccess()) {
throw AppError("Server returned '${response.status}'")
}
}
}
@Suppress("MagicNumber")
private fun HttpTimeoutConfig.defaultTimeoutConfig() {
requestTimeoutMillis = 60_000
connectTimeoutMillis = 60_000
socketTimeoutMillis = 60_000
}
private fun LoggingConfig.defaultLoggingConfig() {
logger = KtorLogger.APP
level = LogLevel.NONE
}
}
private val KtorLogger.Companion.APP
get() = object : KtorLogger {
override fun log(message: String) {
Logger.debug(message)
}
}