Skip to content

Instantly share code, notes, and snippets.

@dacr
Last active May 25, 2024 10:18
Show Gist options
  • Save dacr/423622a035767944545cfba26142774f to your computer and use it in GitHub Desktop.
Save dacr/423622a035767944545cfba26142774f to your computer and use it in GitHub Desktop.
ZIO learning - http client using synchronous sttp with proxy support / published by https://github.com/dacr/code-examples-manager #6756aa6d-6d0e-4a87-87b1-b69cbc528917/197f0f70d4510d1f00488d89d1398f7c06f616db
// summary : ZIO learning - http client using synchronous sttp with proxy support
// keywords : scala, zio, learning, pure-functional, sttp, http-proxy, proxy, @testable
// publish : gist
// authors : David Crosson
// license : Apache NON-AI License Version 2.0 (https://raw.githubusercontent.com/non-ai-licenses/non-ai-licenses/main/NON-AI-APACHE2)
// id : 6756aa6d-6d0e-4a87-87b1-b69cbc528917
// created-on : 2022-01-23T11:36:49+01:00
// managed-by : https://github.com/dacr/code-examples-manager
// run-with : scala-cli $file
// ---------------------
//> using scala "3.4.2"
//> using dep "dev.zio::zio:2.0.13"
//> using dep "com.softwaremill.sttp.client3::async-http-client-backend-zio:3.8.15"
//> using dep "org.slf4j:slf4j-nop:2.0.7"
// ---------------------
import zio.*
import sttp.client3.*
import sttp.client3.SttpBackendOptions.ProxyType
import sttp.client3.asynchttpclient.zio.*
case class HttpProxyConfig(host: String, port: Int, nonProxyHosts: List[String])
object HttpProxyConfig {
def fromPropOrEnv(): Option[HttpProxyConfig] =
import scala.util.Properties.{propOrNone, envOrNone}
val keys = LazyList("http_proxy", "https_proxy")
keys.flatMap { key =>
propOrNone(key).orElse(envOrNone(key)).flatMap(fromProvidedString)
}.headOption
def fromProvidedString(spec: String): Option[HttpProxyConfig] =
val nonProxyHosts = scala.util.Properties.envOrElse("no_proxy", "").split(",\\s*").toList.map(_.trim)
val extractor = """^https?://([^:/]+)(?::(\d+))?/?$""".r
extractor.findFirstIn(spec.trim.toLowerCase()).collect {
case extractor(host, null) => HttpProxyConfig(host, 80, nonProxyHosts)
case extractor(host, port) => HttpProxyConfig(host, port.toInt, nonProxyHosts)
}
}
def makeProxyConfig(config: HttpProxyConfig): SttpBackendOptions =
import scala.concurrent.duration.*
val proxy = SttpBackendOptions.Proxy(config.host, config.port, proxyType = ProxyType.Http, nonProxyHosts = config.nonProxyHosts)
SttpBackendOptions(connectionTimeout = 5.seconds, Some(proxy))
// ---------------------------------------------------------------------------
object Encapsulated extends ZIOAppDefault {
val sttpBackend =
import scala.concurrent.duration.*
val options =
HttpProxyConfig
.fromPropOrEnv()
.map(makeProxyConfig)
.getOrElse(SttpBackendOptions.Default)
.connectionTimeout(5.seconds)
AsyncHttpClientZioBackend.scoped(options)
override def run = for {
backend <- sttpBackend
result <- backend.send(basicRequest.get(uri"https://mapland.fr/clientInfo").response(asStringAlways))
_ <- Console.printLine(result.body)
} yield ()
}
Encapsulated.main(Array.empty)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment