org.http4s.client.blaze.BlazeClientBuilder Scala Examples
The following examples show how to use org.http4s.client.blaze.BlazeClientBuilder.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
Example 1
Source File: Http4sRpcTransport.scala From iotchain with MIT License | 5 votes |
package jbok.network.rpc.http import cats.effect.ConcurrentEffect import jbok.network.rpc.{RpcRequest, RpcResponse, RpcTransport} import org.http4s.client.blaze.BlazeClientBuilder import org.http4s.{EntityDecoder, EntityEncoder, Method, Request, Uri} import scala.concurrent.ExecutionContext final class Http4sRpcTransport[F[_], P]( baseUri: Uri )(implicit F: ConcurrentEffect[F], entityEncoder: EntityEncoder[F, P], entityDecoder: EntityDecoder[F, RpcResponse[P]]) extends RpcTransport[F, P] { override def fetch(request: RpcRequest[P]): F[RpcResponse[P]] = { val uri = request.path.foldLeft(baseUri)(_ / _) val req = Request[F](Method.POST, uri = uri).withEntity(request.payload) BlazeClientBuilder[F](ExecutionContext.global).resource.use { client => client.fetchAs[RpcResponse[P]](req) } } }
Example 2
Source File: HttpClients.scala From iotchain with MIT License | 5 votes |
package jbok.network.http.client import cats.effect._ import javax.net.ssl.SSLContext import jbok.common.thread.ThreadUtil import jbok.network.http.client.middleware.{LoggerMiddleware, MetricsMiddleware, RetryMiddleware} import okhttp3.OkHttpClient import org.http4s.client.Client import org.http4s.client.blaze.BlazeClientBuilder import org.http4s.client.okhttp.OkHttpBuilder object HttpClients { def withMiddlewares[F[_]](client: Client[F])(implicit F: Concurrent[F], T: Timer[F]): F[Client[F]] = MetricsMiddleware(LoggerMiddleware()(RetryMiddleware()(client))) def okHttp[F[_]](sslContext: Option[SSLContext] = None)(implicit F: ConcurrentEffect[F], cs: ContextShift[F]): Resource[F, Client[F]] = ThreadUtil.blockingThreadPool[F]("jbok-okhttp-client").flatMap { blockEC => val builder = sslContext match { case Some(ctx) => new OkHttpClient.Builder().sslSocketFactory(ctx.getSocketFactory) case None => new OkHttpClient.Builder() } OkHttpBuilder[F](builder.build(), blockEC).resource } def blaze[F[_]](sslContext: Option[SSLContext] = None)(implicit F: ConcurrentEffect[F]): Resource[F, Client[F]] = ThreadUtil.blockingThreadPool[F]("jbok-blaze-client").flatMap { blockEC => BlazeClientBuilder[F](blockEC) .withSslContextOption(sslContext) .resource } }
Example 3
Source File: HttpMetricsSpec.scala From kamon-http4s with Apache License 2.0 | 5 votes |
package kamon.http4s import cats.effect._ import kamon.testkit.InstrumentInspection import org.http4s.HttpRoutes import org.http4s.dsl.io._ import org.http4s.server.Server import org.http4s.server.blaze.BlazeServerBuilder import org.scalatest.concurrent.Eventually import org.scalatest.time.SpanSugar import org.scalatest.{Matchers, OptionValues, WordSpec} import cats.implicits._ import kamon.http4s.middleware.server.KamonSupport import kamon.instrumentation.http.HttpServerMetrics import org.http4s.client.blaze.BlazeClientBuilder import org.http4s.client.Client import scala.concurrent.ExecutionContext import org.http4s.implicits._ class HttpMetricsSpec extends WordSpec with Matchers with Eventually with SpanSugar with InstrumentInspection.Syntax with OptionValues { implicit val contextShift: ContextShift[IO] = IO.contextShift(ExecutionContext.global) implicit val timer: Timer[IO] = IO.timer(ExecutionContext.global) val srv = BlazeServerBuilder[IO] .bindLocal(43567) .withHttpApp(KamonSupport(HttpRoutes.of[IO] { case GET -> Root / "tracing" / "ok" => Ok("ok") case GET -> Root / "tracing" / "not-found" => NotFound("not-found") case GET -> Root / "tracing" / "error" => InternalServerError("This page will generate an error!") }, "/127.0.0.1", 43567).orNotFound) .resource val client = BlazeClientBuilder[IO](ExecutionContext.global).withMaxTotalConnections(10).resource val metrics = Resource.liftF(IO(HttpServerMetrics.of("http4s.server", "/127.0.0.1", 43567))) def withServerAndClient[A](f: (Server[IO], Client[IO], HttpServerMetrics.HttpServerInstruments) => IO[A]): A = (srv, client, metrics).tupled.use(f.tupled).unsafeRunSync() private def get[F[_]: ConcurrentEffect](path: String)(server: Server[F], client: Client[F]): F[String] = { client.expect[String](s"http://127.0.0.1:${server.address.getPort}$path") } "The HttpMetrics" should { "track the total of active requests" in withServerAndClient { (server, client, serverMetrics) => val requests = List .fill(100) { get("/tracing/ok")(server, client) }.parSequence_ val test = IO { serverMetrics.activeRequests.distribution().max should be > 1L serverMetrics.activeRequests.distribution().min shouldBe 0L } requests *> test } "track the response time with status code 2xx" in withServerAndClient { (server, client, serverMetrics) => val requests: IO[Unit] = List.fill(100)(get("/tracing/ok")(server, client)).sequence_ val test = IO(serverMetrics.requestsSuccessful.value should be >= 0L) requests *> test } "track the response time with status code 4xx" in withServerAndClient { (server, client, serverMetrics) => val requests: IO[Unit] = List.fill(100)(get("/tracing/not-found")(server, client).attempt).sequence_ val test = IO(serverMetrics.requestsClientError.value should be >= 0L) requests *> test } "track the response time with status code 5xx" in withServerAndClient { (server, client, serverMetrics) => val requests: IO[Unit] = List.fill(100)(get("/tracing/error")(server, client).attempt).sequence_ val test = IO(serverMetrics.requestsServerError.value should be >= 0L) requests *> test } } }
Example 4
Source File: JoexClient.scala From docspell with GNU General Public License v3.0 | 5 votes |
package docspell.joexapi.client import scala.concurrent.ExecutionContext import cats.effect._ import cats.implicits._ import docspell.common.syntax.all._ import docspell.common.{Ident, LenientUri} import docspell.joexapi.model.BasicResult import org.http4s.circe.CirceEntityDecoder._ import org.http4s.client.Client import org.http4s.client.blaze.BlazeClientBuilder import org.http4s.{Method, Request, Uri} import org.log4s.getLogger trait JoexClient[F[_]] { def notifyJoex(base: LenientUri): F[Unit] def notifyJoexIgnoreErrors(base: LenientUri): F[Unit] def cancelJob(base: LenientUri, job: Ident): F[BasicResult] } object JoexClient { private[this] val logger = getLogger def apply[F[_]: Sync](client: Client[F]): JoexClient[F] = new JoexClient[F] { def notifyJoex(base: LenientUri): F[Unit] = { val notifyUrl = base / "api" / "v1" / "notify" val req = Request[F](Method.POST, uri(notifyUrl)) logger.fdebug(s"Notify joex at ${notifyUrl.asString}") *> client.expect[String](req).map(_ => ()) } def notifyJoexIgnoreErrors(base: LenientUri): F[Unit] = notifyJoex(base).attempt.map { case Right(()) => () case Left(ex) => logger.warn( s"Notifying Joex instance '${base.asString}' failed: ${ex.getMessage}" ) () } def cancelJob(base: LenientUri, job: Ident): F[BasicResult] = { val cancelUrl = base / "api" / "v1" / "job" / job.id / "cancel" val req = Request[F](Method.POST, uri(cancelUrl)) client.expect[BasicResult](req) } private def uri(u: LenientUri): Uri = Uri.unsafeFromString(u.asString) } def resource[F[_]: ConcurrentEffect](ec: ExecutionContext): Resource[F, JoexClient[F]] = BlazeClientBuilder[F](ec).resource.map(apply[F]) }
Example 5
Source File: BackendApp.scala From docspell with GNU General Public License v3.0 | 5 votes |
package docspell.backend import scala.concurrent.ExecutionContext import cats.effect._ import docspell.backend.auth.Login import docspell.backend.ops._ import docspell.backend.signup.OSignup import docspell.ftsclient.FtsClient import docspell.joexapi.client.JoexClient import docspell.store.Store import docspell.store.queue.JobQueue import docspell.store.usertask.UserTaskStore import emil.javamail.{JavaMailEmil, Settings} import org.http4s.client.Client import org.http4s.client.blaze.BlazeClientBuilder trait BackendApp[F[_]] { def login: Login[F] def signup: OSignup[F] def collective: OCollective[F] def source: OSource[F] def tag: OTag[F] def equipment: OEquipment[F] def organization: OOrganization[F] def upload: OUpload[F] def node: ONode[F] def job: OJob[F] def item: OItem[F] def itemSearch: OItemSearch[F] def fulltext: OFulltext[F] def mail: OMail[F] def joex: OJoex[F] def userTask: OUserTask[F] } object BackendApp { def create[F[_]: ConcurrentEffect: ContextShift]( cfg: Config, store: Store[F], httpClient: Client[F], ftsClient: FtsClient[F], blocker: Blocker ): Resource[F, BackendApp[F]] = for { utStore <- UserTaskStore(store) queue <- JobQueue(store) loginImpl <- Login[F](store) signupImpl <- OSignup[F](store) collImpl <- OCollective[F](store) sourceImpl <- OSource[F](store) tagImpl <- OTag[F](store) equipImpl <- OEquipment[F](store) orgImpl <- OOrganization(store) joexImpl <- OJoex(JoexClient(httpClient), store) uploadImpl <- OUpload(store, queue, cfg.files, joexImpl) nodeImpl <- ONode(store) jobImpl <- OJob(store, joexImpl) itemImpl <- OItem(store, ftsClient) itemSearchImpl <- OItemSearch(store) fulltextImpl <- OFulltext(itemSearchImpl, ftsClient, store, queue, joexImpl) javaEmil = JavaMailEmil(blocker, Settings.defaultSettings.copy(debug = cfg.mailDebug)) mailImpl <- OMail(store, javaEmil) userTaskImpl <- OUserTask(utStore, queue, joexImpl) } yield new BackendApp[F] { val login: Login[F] = loginImpl val signup: OSignup[F] = signupImpl val collective: OCollective[F] = collImpl val source = sourceImpl val tag = tagImpl val equipment = equipImpl val organization = orgImpl val upload = uploadImpl val node = nodeImpl val job = jobImpl val item = itemImpl val itemSearch = itemSearchImpl val fulltext = fulltextImpl val mail = mailImpl val joex = joexImpl val userTask = userTaskImpl } def apply[F[_]: ConcurrentEffect: ContextShift]( cfg: Config, connectEC: ExecutionContext, httpClientEc: ExecutionContext, blocker: Blocker )(ftsFactory: Client[F] => Resource[F, FtsClient[F]]): Resource[F, BackendApp[F]] = for { store <- Store.create(cfg.jdbc, connectEC, blocker) httpClient <- BlazeClientBuilder[F](httpClientEc).resource ftsClient <- ftsFactory(httpClient) backend <- create(cfg, store, httpClient, ftsClient, blocker) } yield backend }
Example 6
Source File: Main.scala From http4s-tracer with Apache License 2.0 | 5 votes |
package dev.profunktor.tracer import scala.concurrent.ExecutionContext import cats.effect._ import cats.implicits._ import cats.Parallel import dev.profunktor.tracer.module._ import dev.profunktor.tracer.module.tracer._ import dev.profunktor.tracer.Trace.Trace import org.http4s.client.blaze.BlazeClientBuilder import org.http4s.server.blaze.BlazeServerBuilder class Main[F[_]: ConcurrentEffect: Parallel: Timer: Tracer: λ[T[_] => TracerLog[Trace[T, ?]]]] { val server: F[Unit] = BlazeClientBuilder[F](ExecutionContext.global).resource.use { client => for { repos <- LiveRepositories[F] tracedRepos = TracedRepositories[F](repos) tracedClients = TracedHttpClients[F](client) tracedPrograms = TracedPrograms[F](tracedRepos, tracedClients) httpApi = HttpApi[F](tracedPrograms) _ <- BlazeServerBuilder .apply[F](ExecutionContext.global) .bindHttp(8080, "0.0.0.0") .withHttpApp(httpApi.httpApp) .serve .compile .drain } yield () } }
Example 7
Source File: CliModule.scala From nexus with Apache License 2.0 | 5 votes |
package ch.epfl.bluebrain.nexus.cli import cats.effect.concurrent.Ref import cats.effect.{ConcurrentEffect, Timer} import cats.implicits._ import ch.epfl.bluebrain.nexus.cli.clients._ import ch.epfl.bluebrain.nexus.cli.config.AppConfig import ch.epfl.bluebrain.nexus.cli.sse.{OrgLabel, OrgUuid, ProjectLabel, ProjectUuid} import distage.{ModuleDef, TagK} import izumi.distage.model.definition.StandardAxis.Repo import org.http4s.client.Client import org.http4s.client.blaze.BlazeClientBuilder import scala.concurrent.ExecutionContext import scala.concurrent.duration.Duration final class CliModule[F[_]: ConcurrentEffect: Timer: TagK] extends ModuleDef { make[Console[F]].tagged(Repo.Prod).from(Console[F]) make[Client[F]].tagged(Repo.Prod).fromResource { BlazeClientBuilder[F](ExecutionContext.global).withIdleTimeout(Duration.Inf).resource } make[ProjectClient[F]].tagged(Repo.Prod).fromEffect { (cfg: AppConfig, client: Client[F], console: Console[F]) => Ref.of[F, Map[(OrgUuid, ProjectUuid), (OrgLabel, ProjectLabel)]](Map.empty).map { cache => ProjectClient(client, cfg.env, cache, console) } } make[SparqlClient[F]].tagged(Repo.Prod).from { (cfg: AppConfig, client: Client[F], console: Console[F]) => SparqlClient(client, cfg.env, console) } make[EventStreamClient[F]].tagged(Repo.Prod).from { (cfg: AppConfig, client: Client[F], pc: ProjectClient[F]) => EventStreamClient(client, pc, cfg.env) } make[InfluxClient[F]].tagged(Repo.Prod).from { (cfg: AppConfig, client: Client[F], console: Console[F]) => InfluxClient(client, cfg, console) } } object CliModule { final def apply[F[_]: ConcurrentEffect: Timer: TagK]: CliModule[F] = new CliModule[F] }
Example 8
Source File: AbstractInfluxSpec.scala From nexus with Apache License 2.0 | 5 votes |
package ch.epfl.bluebrain.nexus.cli.influx import cats.effect.{Blocker, IO, Resource} import ch.epfl.bluebrain.nexus.cli.{AbstractCliSpec, Console} import ch.epfl.bluebrain.nexus.cli.clients.InfluxClient import ch.epfl.bluebrain.nexus.cli.config.AppConfig import ch.epfl.bluebrain.nexus.cli.influx.InfluxDocker.InfluxHostConfig import izumi.distage.model.definition.{Module, ModuleDef} import org.http4s.client.blaze.BlazeClientBuilder import scala.concurrent.duration._ class AbstractInfluxSpec extends AbstractCliSpec { override protected def defaultModules: Module = { super.defaultModules ++ new InfluxDocker.Module[IO] } override def testModule: ModuleDef = new ModuleDef { make[AppConfig].fromEffect { host: InfluxHostConfig => copyConfigs.flatMap { case (envFile, _, influxFile) => AppConfig.load[IO](Some(envFile), influxConfigFile = Some(influxFile)).flatMap { case Left(value) => IO.raiseError(value) case Right(value) => val influxOffsetFile = influxFile.getParent.resolve("influx.offset") val cfg = value.copy(influx = value.influx.copy( endpoint = host.endpoint, offsetFile = influxOffsetFile, offsetSaveInterval = 100.milliseconds ) ) IO.pure(cfg) } } } make[InfluxClient[IO]].fromResource { (_: InfluxDocker.Container, cfg: AppConfig, blocker: Blocker, console: Console[IO]) => BlazeClientBuilder[IO](blocker.blockingContext).resource.flatMap { client => val influxClient = InfluxClient(client, cfg, console) waitForInfluxReady(influxClient).map(_ => influxClient) } } } private def waitForInfluxReady( client: InfluxClient[IO], maxDelay: FiniteDuration = 90.seconds ): Resource[IO, Unit] = { import retry.CatsEffect._ import retry.RetryPolicies._ import retry._ val policy = limitRetriesByCumulativeDelay[IO](maxDelay, constantDelay(5.second)) val healthIO = retryingOnAllErrors( policy = policy, onError = (_: Throwable, _) => IO.delay(println("Influx Container not ready, retrying...")) ) { client.health.map { case Left(err) => throw err case Right(_) => () } } Resource.liftF(healthIO) } }
Example 9
Source File: KubernetesClient.scala From kubernetes-client with Apache License 2.0 | 5 votes |
package com.goyeau.kubernetes.client import java.net.http.HttpClient import cats.effect._ import com.goyeau.kubernetes.client.api._ import com.goyeau.kubernetes.client.crd.{CrdContext, CustomResource, CustomResourceList} import com.goyeau.kubernetes.client.util.SslContexts import io.circe.{Decoder, Encoder} import org.http4s.client.Client import org.http4s.client.blaze.BlazeClientBuilder import org.http4s.client.jdkhttpclient.JdkWSClient import scala.concurrent.ExecutionContext case class KubernetesClient[F[_]: ConcurrentEffect: ContextShift](httpClient: Client[F], config: KubeConfig) { lazy val namespaces = NamespacesApi(httpClient, config) lazy val pods = PodsApi( httpClient, JdkWSClient[F](HttpClient.newBuilder().sslContext(SslContexts.fromConfig(config)).build()), config ) lazy val jobs = JobsApi(httpClient, config) lazy val cronJobs = CronJobsApi(httpClient, config) lazy val deployments = DeploymentsApi(httpClient, config) lazy val statefulSets = StatefulSetsApi(httpClient, config) lazy val replicaSets = ReplicaSetsApi(httpClient, config) lazy val services = ServicesApi(httpClient, config) lazy val serviceAccounts = ServiceAccountsApi(httpClient, config) lazy val configMaps = ConfigMapsApi(httpClient, config) lazy val secrets = SecretsApi(httpClient, config) lazy val horizontalPodAutoscalers = HorizontalPodAutoscalersApi(httpClient, config) lazy val podDisruptionBudgets = PodDisruptionBudgetsApi(httpClient, config) lazy val customResourceDefinitions = CustomResourceDefinitionsApi(httpClient, config) lazy val ingresses = IngressessApi(httpClient, config) def customResources[A: Encoder: Decoder, B: Encoder: Decoder](context: CrdContext)(implicit listDecoder: Decoder[CustomResourceList[A, B]], encoder: Encoder[CustomResource[A, B]], decoder: Decoder[CustomResource[A, B]] ) = CustomResourcesApi[F, A, B](httpClient, config, context) } object KubernetesClient { def apply[F[_]: ConcurrentEffect: ContextShift](config: KubeConfig): Resource[F, KubernetesClient[F]] = BlazeClientBuilder[F](ExecutionContext.global, Option(SslContexts.fromConfig(config))).resource .map(httpClient => apply(httpClient, config)) def apply[F[_]: ConcurrentEffect: ContextShift](config: F[KubeConfig]): Resource[F, KubernetesClient[F]] = Resource.liftF(config).flatMap(apply(_)) }
Example 10
Source File: resources.scala From pfps-shopping-cart with Apache License 2.0 | 5 votes |
package shop import cats.effect._ import cats.implicits._ import config.data._ import dev.profunktor.redis4cats.{ Redis, RedisCommands } import dev.profunktor.redis4cats.log4cats._ import eu.timepit.refined.auto._ import io.chrisdavenport.log4cats.Logger import natchez.Trace.Implicits.noop // needed for skunk import org.http4s.client.Client import org.http4s.client.blaze.BlazeClientBuilder import scala.concurrent.ExecutionContext import skunk._ final case class AppResources[F[_]]( client: Client[F], psql: Resource[F, Session[F]], redis: RedisCommands[F, String, String] ) object AppResources { def make[F[_]: ConcurrentEffect: ContextShift: Logger]( cfg: AppConfig ): Resource[F, AppResources[F]] = { def mkPostgreSqlResource(c: PostgreSQLConfig): SessionPool[F] = Session .pooled[F]( host = c.host.value, port = c.port.value, user = c.user.value, database = c.database.value, max = c.max.value ) def mkRedisResource(c: RedisConfig): Resource[F, RedisCommands[F, String, String]] = Redis[F].utf8(c.uri.value) def mkHttpClient(c: HttpClientConfig): Resource[F, Client[F]] = BlazeClientBuilder[F](ExecutionContext.global) .withConnectTimeout(c.connectTimeout) .withRequestTimeout(c.requestTimeout) .resource ( mkHttpClient(cfg.httpClientConfig), mkPostgreSqlResource(cfg.postgreSQL), mkRedisResource(cfg.redis) ).mapN(AppResources.apply[F]) } }
Example 11
Source File: AdserverApp.scala From scala-openrtb with Apache License 2.0 | 5 votes |
package com.powerspace.openrtb.examples.rtb.http4s.adserver import cats.effect.Resource import com.google.openrtb.{BidRequest, BidResponse} import com.powerspace.openrtb.examples.rtb.http4s.common.ExampleSerdeModule import io.circe.{Encoder, Json} import monix.eval.Task import org.http4s.client.Client import org.http4s.client.blaze.BlazeClientBuilder import scala.concurrent.duration.Duration object AdserverApp extends App { import monix.execution.Scheduler.Implicits.global val httpClient: Resource[Task, Client[Task]] = buildHttpClient() val potentialBidResponse = httpBid(httpClient) private val bidRequest = Adserver.buildBidRequest() potentialBidResponse .map(bidResponse => { bidResponse.foreach(br => println(buildAuctionString(br))) }) .runSyncUnsafe(Duration.Inf) private def buildHttpClient(): Resource[Task, Client[Task]] = { BlazeClientBuilder[Task](global).resource } private def httpBid(httpClient: Resource[Task, Client[Task]]) = httpClient.use(AdserverHttpClientBuilder.bid(_, bidRequest)) private def buildAuctionString(bidResponse: BidResponse) = { case class Auction(bidRequest: BidRequest, bidResponse: BidResponse) val auctionEncoder = new Encoder[Auction] { override def apply(auction: Auction): Json = Json.obj( ("request", ExampleSerdeModule.bidRequestEncoder.apply(auction.bidRequest)), ("response", ExampleSerdeModule.bidResponseEncoder.apply(auction.bidResponse)) ) } auctionEncoder(Auction(bidRequest, bidResponse)).toString() } }
Example 12
Source File: PullRequests.scala From github with MIT License | 5 votes |
package io.chrisdavenport.github import cats.implicits._ import cats.effect._ import org.http4s.client.blaze.BlazeClientBuilder import io.chrisdavenport.github.endpoints.PullRequests object PullRequestsExample extends IOApp { def run(args: List[String]): IO[ExitCode] = { for { c <- BlazeClientBuilder[IO](scala.concurrent.ExecutionContext.global).resource out <- PullRequests.pullRequestsFor[IO]( "ChristopherDavenport", "github", None ) .run(c) .take(2) .compile .resource .toList } yield out }.use(requests => IO(println(requests)).as(ExitCode.Success) ) }
Example 13
Source File: GetFileContent.scala From github with MIT License | 5 votes |
package io.chrisdavenport.github import cats.implicits._ import cats.effect._ import org.http4s.client.blaze.BlazeClientBuilder import java.{util => ju} import endpoints.repositories.Content object GetFileContent extends IOApp { def run(args: List[String]): IO[ExitCode] = { for { c <- BlazeClientBuilder[IO](scala.concurrent.ExecutionContext.global).resource out <- Resource.liftF( Content.contentsFor[IO]( "ChristopherDavenport", "github", "README.md", None, None ).run(c) ) _ <- Resource.liftF(out match { case data.Content.Content.File(data) => val out = decodeBase64(data.content) IO(println(out)) case _ => IO.unit }) } yield () }.use(_ => IO.unit.as(ExitCode.Success) ) private val base64 = ju.Base64.getMimeDecoder() def decodeBase64(s: String): String = { val bytes = base64.decode(s.getBytes(java.nio.charset.StandardCharsets.UTF_8)) new String(bytes, java.nio.charset.StandardCharsets.UTF_8) } }
Example 14
Source File: Http4sBlazeClientModule.scala From scala-server-toolkit with MIT License | 5 votes |
package com.avast.sst.http4s.client import cats.effect.{ConcurrentEffect, Resource} import javax.net.ssl.SSLContext import org.http4s.client.Client import org.http4s.client.blaze.BlazeClientBuilder import scala.concurrent.ExecutionContext object Http4sBlazeClientModule { def make[F[_]: ConcurrentEffect]( config: Http4sBlazeClientConfig, executionContext: ExecutionContext, sslContext: Option[SSLContext] = None ): Resource[F, Client[F]] = { val builder = BlazeClientBuilder[F](executionContext) .withResponseHeaderTimeout(config.responseHeaderTimeout) .withIdleTimeout(config.idleTimeout) .withRequestTimeout(config.requestTimeout) .withConnectTimeout(config.connectTimeout) .withUserAgent(config.userAgent) .withMaxTotalConnections(config.maxTotalConnections) .withMaxWaitQueueLimit(config.maxWaitQueueLimit) .withMaxConnectionsPerRequestKey(Function.const(config.maxConnectionsPerRequestkey)) .withCheckEndpointAuthentication(config.checkEndpointIdentification) .withMaxResponseLineSize(config.maxResponseLineSize) .withMaxHeaderLength(config.maxHeaderLength) .withMaxChunkSize(config.maxChunkSize) .withChunkBufferMaxSize(config.chunkBufferMaxSize) .withParserMode(config.parserMode) .withBufferSize(config.bufferSize) sslContext.map(builder.withSslContext).getOrElse(builder).resource } }
Example 15
Source File: CorrelationIdMiddlewareTest.scala From scala-server-toolkit with MIT License | 5 votes |
package com.avast.sst.http4s.server.middleware import java.net.InetSocketAddress import cats.effect.{ContextShift, IO, Resource, Timer} import com.avast.sst.http4s.server.Http4sRouting import org.http4s.client.blaze.BlazeClientBuilder import org.http4s.dsl.Http4sDsl import org.http4s.server.blaze.BlazeServerBuilder import org.http4s.util.CaseInsensitiveString import org.http4s.{Header, HttpRoutes, Request, Uri} import org.scalatest.funsuite.AsyncFunSuite import scala.concurrent.ExecutionContext @SuppressWarnings(Array("scalafix:Disable.get", "scalafix:Disable.toString", "scalafix:Disable.createUnresolved")) class CorrelationIdMiddlewareTest extends AsyncFunSuite with Http4sDsl[IO] { implicit private val cs: ContextShift[IO] = IO.contextShift(ExecutionContext.global) implicit private val timer: Timer[IO] = IO.timer(ExecutionContext.global) test("CorrelationIdMiddleware fills Request attributes and HTTP response header") { val test = for { middleware <- Resource.liftF(CorrelationIdMiddleware.default[IO]) routes = Http4sRouting.make { middleware.wrap { HttpRoutes.of[IO] { case req @ GET -> Root / "test" => val id = middleware.retrieveCorrelationId(req) Ok("test").map(_.withHeaders(Header("Attribute-Value", id.toString))) } } } server <- BlazeServerBuilder[IO](ExecutionContext.global) .bindSocketAddress(InetSocketAddress.createUnresolved("127.0.0.1", 0)) .withHttpApp(routes) .resource client <- BlazeClientBuilder[IO](ExecutionContext.global).resource } yield (server, client) test .use { case (server, client) => client .run( Request[IO](uri = Uri.unsafeFromString(s"http://${server.address.getHostString}:${server.address.getPort}/test")) .withHeaders(Header("Correlation-Id", "test-value")) ) .use { response => IO.delay { assert(response.headers.get(CaseInsensitiveString("Correlation-Id")).get.value === "test-value") assert(response.headers.get(CaseInsensitiveString("Attribute-Value")).get.value === "Some(CorrelationId(test-value))") } } } .unsafeToFuture() } }