BooruGrabberTelegramBot/src/main/kotlin/models/HttpClientConfig.kt

96 lines
3.4 KiB
Kotlin

package models
import dev.inmo.tgbotapi.types.MilliSeconds
import io.ktor.client.HttpClientConfig
import io.ktor.client.engine.okhttp.*
import io.ktor.client.plugins.*
import io.ktor.client.request.*
import io.ktor.http.*
import kotlinx.serialization.Serializable
import okhttp3.OkHttpClient
import java.net.*
import java.util.*
import java.util.concurrent.TimeUnit
@Serializable
data class HttpClientConfig(
val connectionTimeoutMillis: MilliSeconds? = null,
val requestTimeoutMillis: MilliSeconds? = null,
val responseTimeoutMillis: MilliSeconds? = null,
val proxy: ProxyConfig? = null
) {
@Serializable
data class ProxyConfig(
val hostname: String,
val type: ProxyType = ProxyType.socks,
val port: Int = type.defaultPort,
val username: String? = null,
val password: String? = null
) {
@Serializable
enum class ProxyType(val defaultPort: Int, val proxyType: Proxy.Type) {
socks(1080, Proxy.Type.SOCKS),
http(3128, Proxy.Type.HTTP),
}
val socketAddress
get() = InetSocketAddress(hostname, port)
}
fun OkHttpClient.Builder.setupConfig() {
// setting up connection timeout millis
connectionTimeoutMillis ?.let { connectTimeout(it, TimeUnit.MILLISECONDS) }
// setting up write timeout millis
requestTimeoutMillis ?.let { writeTimeout(it, TimeUnit.MILLISECONDS) }
// setting up read timeout millis
responseTimeoutMillis ?.let { readTimeout(it, TimeUnit.MILLISECONDS) }
// Start setup bot client engine proxy
this@HttpClientConfig.proxy ?.let { proxyConfig ->
proxy(
Proxy(
proxyConfig.type.proxyType,
proxyConfig.socketAddress
)
)
proxyConfig.username ?.let { username ->
if (proxyConfig.type == ProxyConfig.ProxyType.socks) {
val passwordAuthentication = PasswordAuthentication(
username,
proxyConfig.password ?.toCharArray() ?: error("For Socks proxy you should use both username and password or do not use authentication at all")
)
Authenticator.setDefault(object : Authenticator() {
override fun getPasswordAuthentication(): PasswordAuthentication? {
return if (requestingHost.lowercase() == proxyConfig.hostname.lowercase()) {
passwordAuthentication
} else {
null
}
}
})
}
}
}
}
fun HttpClientConfig<OkHttpConfig>.setupConfig() {
// setting up telegram bot client
engine {
// Start setup bot client engine configuration
config {
setupConfig()
}
}
proxy ?.username ?.let { username ->
if (proxy.type == ProxyConfig.ProxyType.http) {
val passwordSuffix = proxy.password ?.let { ":$it" }
val credentials = Base64.getEncoder().encodeToString("${username}${passwordSuffix}".toByteArray())
this@setupConfig.defaultRequest {
header(HttpHeaders.ProxyAuthorization, "Basic $credentials")
}
}
}
}
}