Skip to content

Commit

Permalink
Merge pull request #782 from amesgen/amesgen/merge-series-0.8-into-main
Browse files Browse the repository at this point in the history
Merge `series/0.8` into `main`
  • Loading branch information
amesgen authored Nov 20, 2022
2 parents 782e138 + 19636c8 commit cbcb118
Show file tree
Hide file tree
Showing 10 changed files with 217 additions and 240 deletions.
25 changes: 7 additions & 18 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ lazy val docs = project
.enablePlugins(Http4sOrgSitePlugin)
.dependsOn(core)
.settings(docsSettings)
.settings(libraryDependencies ++= blazeServer)
.settings(libraryDependencies ++= emberServer)

ThisBuild / mergifyStewardConfig := Some(
MergifyStewardConfig(
Expand All @@ -35,21 +35,19 @@ ThisBuild / mergifyRequiredJobs += "site"
ThisBuild / mergifyLabelPaths += "docs" -> file("docs")

val catsV = "2.9.0"
val catsEffectV = "3.3.14"
val fs2V = "3.3.0"
val catsEffectV = "3.4.1"
val fs2V = "3.4.0"
val scodecV = "1.1.34"
val http4sV = "1.0.0-M37"
val reactiveStreamsV = "1.0.4"
val vaultV = "3.3.0"
val caseInsensitiveV = "1.3.0"

val http4sBlazeV = "1.0.0-M36"
val munitV = "1.0.0-M7"
val munitCatsEffectV = "2.0.0-M3"
val javaWebsocketV = "1.5.3"

val blazeServer = Seq(
"org.http4s" %% "http4s-blaze-server" % http4sBlazeV,
val emberServer = Seq(
"org.http4s" %% "http4s-ember-server" % http4sV,
"org.http4s" %% "http4s-dsl" % http4sV
)

Expand All @@ -66,9 +64,8 @@ val coreDeps = Seq(
"org.scodec" %% "scodec-bits" % scodecV,
"org.typelevel" %% "vault" % vaultV,
"org.typelevel" %% "case-insensitive" % caseInsensitiveV
) ++ (blazeServer ++ Seq(
) ++ (emberServer ++ Seq(
"org.http4s" %% "http4s-client-testkit" % http4sV,
"org.java-websocket" % "Java-WebSocket" % javaWebsocketV,
"org.scalameta" %% "munit" % munitV,
"org.typelevel" %% "munit-cats-effect" % munitCatsEffectV
)).map(_ % Test)
Expand All @@ -89,15 +86,6 @@ ThisBuild / githubWorkflowJavaVersions := Seq("11", "17").map(JavaSpec.temurin(_
ThisBuild / tlCiReleaseBranches := Seq("main")
ThisBuild / tlSitePublishBranch := Some("main")

ThisBuild / resolvers += "SOSSS".at("https://s01.oss.sonatype.org/content/repositories/snapshots")

ThisBuild / libraryDependencySchemes ++= Seq(
"org.http4s" %% "http4s-core" % "always",
"org.http4s" %% "http4s-server" % "always",
"org.http4s" %% "http4s-blaze-core" % "always",
"org.http4s" %% "http4s-blaze-server" % "always"
)

lazy val docsSettings =
Seq(
tlSiteApiModule := Some((core / projectID).value),
Expand All @@ -108,6 +96,7 @@ lazy val docsSettings =
Versions(
currentVersion = Version("1.x", "1.x"),
olderVersions = Seq(
Version("0.8.x", "0.8"),
Version("0.7.x", "0.7"),
Version("0.6.x", "0.6.0-M7"),
Version("0.5.x", "0.5.0"),
Expand Down
77 changes: 35 additions & 42 deletions core/src/main/scala/org/http4s/jdkhttpclient/JdkHttpClient.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package org.http4s.jdkhttpclient

import cats._
import cats.effect._
import cats.effect.std.Dispatcher
import cats.effect.syntax.all._
import cats.implicits._
import fs2.Chunk
Expand All @@ -39,6 +38,7 @@ import org.typelevel.ci.CIString
import java.net.URI
import java.net.http.HttpClient
import java.net.http.HttpRequest
import java.net.http.HttpRequest.BodyPublisher
import java.net.http.HttpRequest.BodyPublishers
import java.net.http.HttpResponse
import java.net.http.HttpResponse.BodyHandlers
Expand All @@ -49,8 +49,7 @@ import scala.jdk.CollectionConverters._

object JdkHttpClient {

/** Creates a `Client` from an `HttpClient`. Note that the creation of an `HttpClient` is a side
* effect.
/** Creates a `Client` from an `HttpClient`.
*
* @param jdkHttpClient
* The `HttpClient`.
Expand All @@ -62,39 +61,36 @@ object JdkHttpClient {
def apply[F[_]](
jdkHttpClient: HttpClient,
ignoredHeaders: Set[CIString] = restrictedHeaders
)(implicit F: Async[F]): Resource[F, Client[F]] = Dispatcher[F].map { dispatcher =>
def convertRequest(req: Request[F]): F[HttpRequest] =
convertHttpVersionFromHttp4s[F](req.httpVersion).map { version =>
val rb = HttpRequest.newBuilder
.method(
req.method.name,
req.entity match {
case Entity.Empty => BodyPublishers.noBody()
case Entity.Strict(bytes) =>
BodyPublishers.ofInputStream(() => bytes.toInputStream)
case Entity.Default(body, _) =>
val publisher = FlowAdapters.toFlowPublisher(
StreamUnicastPublisher(body.chunks.map(_.toByteBuffer), dispatcher)
)

if (req.isChunked)
BodyPublishers.fromPublisher(publisher)
else
req.contentLength match {
case Some(length) if length > 0L =>
BodyPublishers.fromPublisher(publisher, length)
case _ => BodyPublishers.noBody
}
)(implicit F: Async[F]): Client[F] = {
def convertRequest(req: Request[F]): Resource[F, HttpRequest] = for {
version <- Resource.eval(convertHttpVersionFromHttp4s[F](req.httpVersion))
bodyPublisher <- req.entity match {
case Entity.Empty => Resource.pure[F, BodyPublisher](BodyPublishers.noBody())
case Entity.Strict(bytes) =>
Resource.pure[F, BodyPublisher](BodyPublishers.ofInputStream(() => bytes.toInputStream))
case Entity.Default(body, _) =>
StreamUnicastPublisher(body.chunks.map(_.toByteBuffer))
.map(FlowAdapters.toFlowPublisher(_))
.map { publisher =>
if (req.isChunked)
BodyPublishers.fromPublisher(publisher)
else
req.contentLength match {
case Some(length) if length > 0L =>
BodyPublishers.fromPublisher(publisher, length)
case _ => BodyPublishers.noBody
}
}
)
.uri(URI.create(req.uri.renderString))
.version(version)
val headers = req.headers.headers.iterator
.filterNot(h => ignoredHeaders.contains(h.name))
.flatMap(h => Iterator(h.name.toString, h.value))
.toArray
(if (headers.isEmpty) rb else rb.headers(headers: _*)).build
}
rb = HttpRequest.newBuilder
.method(req.method.name, bodyPublisher)
.uri(URI.create(req.uri.renderString))
.version(version)
headers = req.headers.headers.iterator
.filterNot(h => ignoredHeaders.contains(h.name))
.flatMap(h => Iterator(h.name.toString, h.value))
.toArray
} yield (if (headers.isEmpty) rb else rb.headers(headers: _*)).build

// Convert the JDK HttpResponse into a http4s Response value.
//
Expand Down Expand Up @@ -247,7 +243,7 @@ object JdkHttpClient {

Client[F] { req =>
for {
req <- Resource.eval(convertRequest(req))
req <- convertRequest(req)
res = F.fromCompletableFuture(
F.delay(jdkHttpClient.sendAsync(req, BodyHandlers.ofPublisher))
)
Expand All @@ -258,11 +254,11 @@ object JdkHttpClient {

/** A `Client` wrapping the default `HttpClient`.
*/
def simple[F[_]](implicit F: Async[F]): Resource[F, Client[F]] =
Resource.eval(defaultHttpClient[F]).flatMap(apply(_))
def simple[F[_]](implicit F: Async[F]): F[Client[F]] =
defaultHttpClient[F].map(apply(_))

private[jdkhttpclient] def defaultHttpClient[F[_]](implicit F: Async[F]): F[HttpClient] =
F.executionContext.flatMap { ec =>
F.executor.flatMap { exec =>
F.delay {
val builder = HttpClient.newBuilder()
// workaround for https://github.com/http4s/http4s-jdk-http-client/issues/200
Expand All @@ -272,10 +268,7 @@ object JdkHttpClient {
builder.sslParameters(params)
}

ec match {
case exec: util.concurrent.Executor => builder.executor(exec)
case _ => builder.executor(ec.execute(_))
}
builder.executor(exec)

builder.build()
}
Expand Down
Loading

0 comments on commit cbcb118

Please sign in to comment.