From 272726df439d05bde0b5603f500cb8557ea17ec9 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 16:21:15 +0000 Subject: [PATCH 01/53] Update fs2-reactive-streams to 3.10.0 in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 5e042b87..8748eb23 100644 --- a/build.sbt +++ b/build.sbt @@ -46,7 +46,7 @@ lazy val core = project .settings( name := "http4s-netty-core", libraryDependencies ++= List( - "co.fs2" %% "fs2-reactive-streams" % "3.9.4", + "co.fs2" %% "fs2-reactive-streams" % "3.10.0", ("com.typesafe.netty" % "netty-reactive-streams-http" % "2.0.12") .exclude("io.netty", "netty-codec-http") .exclude("io.netty", "netty-handler"), From 36d53a97e42533d8caa105b4976461192ad728ca Mon Sep 17 00:00:00 2001 From: Erlend Hamnaberg Date: Thu, 21 Mar 2024 15:38:52 +0100 Subject: [PATCH 02/53] Really fix idle timeout. Dequeue all and handle them in the flatMap of future --- .../http4s/netty/client/Http4sHandler.scala | 40 +++++++++----- .../client/NettyClientIdleTimeoutTest.scala | 55 +++++++++++++------ 2 files changed, 66 insertions(+), 29 deletions(-) diff --git a/client/src/main/scala/org/http4s/netty/client/Http4sHandler.scala b/client/src/main/scala/org/http4s/netty/client/Http4sHandler.scala index dd249bcf..59c66f70 100644 --- a/client/src/main/scala/org/http4s/netty/client/Http4sHandler.scala +++ b/client/src/main/scala/org/http4s/netty/client/Http4sHandler.scala @@ -38,10 +38,11 @@ import scala.util.Success private[netty] class Http4sHandler[F[_]](dispatcher: Dispatcher[F])(implicit F: Async[F]) extends ChannelInboundHandlerAdapter { + type Promise = Either[Throwable, Resource[F, Response[F]]] => Unit private val modelConversion = new NettyModelConversion[F] private val promises = - collection.mutable.Queue[Either[Throwable, Resource[F, Response[F]]] => Unit]() + collection.mutable.Queue[Promise]() // By using the Netty event loop assigned to this channel we get two benefits: // 1. We can avoid the necessary hopping around of threads since Netty pipelines will // only pass events up and down from within the event loop to which it is assigned. @@ -145,6 +146,8 @@ private[netty] class Http4sHandler[F[_]](dispatcher: Dispatcher[F])(implicit F: override def isSharable: Boolean = false override def channelRead(ctx: ChannelHandlerContext, msg: Any): Unit = void { + implicit val ec: ExecutionContext = eventLoopContext + msg match { case h: HttpResponse => val responseResourceF = modelConversion @@ -154,17 +157,23 @@ private[netty] class Http4sHandler[F[_]](dispatcher: Dispatcher[F])(implicit F: } val result = dispatcher.unsafeToFuture(responseResourceF) - pending = pending.flatMap { _ => + if (promises.nonEmpty) { val promise = promises.dequeue() - result.transform { - case Failure(exception) => - promise(Left(exception)) - Failure(exception) - case Success(res) => - promise(Right(res)) - Success(()) - }(eventLoopContext) - }(eventLoopContext) + logger.trace("dequeuing promise") + pending = pending.flatMap { _ => + result.transform { + case Failure(exception) => + logger.trace("handling promise failure") + promise(Left(exception)) + Failure(exception) + case Success(res) => + logger.trace("handling promise success") + + promise(Right(res)) + Success(()) + } + } + } case _ => super.channelRead(ctx, msg) } @@ -193,8 +202,13 @@ private[netty] class Http4sHandler[F[_]](dispatcher: Dispatcher[F])(implicit F: } private def onException(channel: Channel, e: Throwable): Unit = void { - promises.foreach(cb => cb(Left(e))) - promises.clear() + implicit val ec: ExecutionContext = eventLoopContext + + val pendingPromises = + promises.dequeueAll(_ => true).map(promise => Future(promise(Left(e)))) + logger.trace(s"onException: dequeueAll(${pendingPromises.size})") + pending = pending.flatMap(_ => Future.sequence(pendingPromises).map(_ => ())) + channel.close() } diff --git a/client/src/test/scala/org/http4s/netty/client/NettyClientIdleTimeoutTest.scala b/client/src/test/scala/org/http4s/netty/client/NettyClientIdleTimeoutTest.scala index 28891d45..fa5244ba 100644 --- a/client/src/test/scala/org/http4s/netty/client/NettyClientIdleTimeoutTest.scala +++ b/client/src/test/scala/org/http4s/netty/client/NettyClientIdleTimeoutTest.scala @@ -17,6 +17,7 @@ package org.http4s.netty.client import cats.effect.IO +import cats.syntax.all._ import com.comcast.ip4s._ import munit.catseffect.IOFixture import org.http4s.HttpRoutes @@ -28,7 +29,8 @@ import org.http4s.ember.server.EmberServerBuilder import org.http4s.implicits._ import org.http4s.server.Server -import scala.concurrent.duration._ +import scala.concurrent.TimeoutException +import scala.concurrent.duration.* class NettyClientIdleTimeoutTest extends IOSuite { override val munitIOTimeout: Duration = 1.minute @@ -36,18 +38,29 @@ class NettyClientIdleTimeoutTest extends IOSuite { val nettyClient: IOFixture[Client[IO]] = resourceFixture( NettyClientBuilder[IO] - .withIdleTimeout(2.seconds) + .withIdleTimeout(3.seconds) + .withMaxConnectionsPerKey(2) .resource, "netty client") + def respond(path: String, sleep: FiniteDuration, value: String): IO[Response[IO]] = + IO.println(s"server: received /${path} request, sleeping...") >> + IO.sleep(sleep) >> + IO.println(s"server: responding with '$value'") >> Ok(value) + val server: IOFixture[Server] = resourceFixture( EmberServerBuilder .default[IO] .withPort(port"0") .withHttpApp( HttpRoutes - .of[IO] { case GET -> Root / "idle-timeout" => - IO.sleep(30.seconds).as(Response()) + .of[IO] { + case GET -> Root / "idle-timeout" => + respond("idle-timeout", 4.seconds, "Wat") + case GET -> Root / "1" => + respond("1", 5.seconds, "1") + case GET -> Root / "2" => + respond("2", 1.seconds, "2") } .orNotFound ) @@ -55,19 +68,29 @@ class NettyClientIdleTimeoutTest extends IOSuite { "server" ) - List( - (nettyClient, "netty client") - ).foreach { case (client, name) => - test(s"$name fails after idle timeout") { - val s = server() + test("fails after idle timeout") { + val s = server() - val req = Request[IO](uri = s.baseUri / "idle-timeout") - val response = client().run(req).allocated.attempt - IO.race(response, IO.sleep(5.seconds)).map { - case Left(Left(error)) => println(s"response failed, error:"); error.printStackTrace() - case Left(Right(_)) => println("response available") - case Right(_) => fail("idle timeout wasn't triggered") - } + val req = Request[IO](uri = s.baseUri / "idle-timeout") + val response = nettyClient().status(req).attempt + IO.race(response, IO.sleep(5.seconds)).map { + case Left(Left(error: TimeoutException)) => + assertEquals(error.getMessage, "Closing connection due to idle timeout") + case Left(Left(error)) => fail(s"Failed with $error") + case Left(Right(_)) => fail("response available") + case Right(_) => fail("idle timeout wasn't triggered") } } + + test("Request A timed out, request B receives response B") { + val s = server() + val c = nettyClient() + + val req1 = Request[IO](uri = s.baseUri / "1") + val req2 = Request[IO](uri = s.baseUri / "2") + for { + _ <- c.expect[String](req1).attempt.map(_.leftMap(_.getMessage)) + r2 <- c.expect[String](req2).attempt.map(_.leftMap(_.getMessage)) + } yield assertEquals(r2, Left("Closing connection due to idle timeout")) + } } From 6b44868348cc6988b2b9f7528e0801f7c57dae64 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 16:21:46 +0000 Subject: [PATCH 03/53] Update netty-codec-http, ... to 4.1.108.Final in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 5e042b87..746267f9 100644 --- a/build.sbt +++ b/build.sbt @@ -23,7 +23,7 @@ val http4sVersion = "0.23.26" val jetty = "12.0.7" -val netty = "4.1.107.Final" +val netty = "4.1.108.Final" val munit = "0.7.29" From b08ee2ec8582b780dbf998bd45aa7aae399bd444 Mon Sep 17 00:00:00 2001 From: Erlend Hamnaberg Date: Thu, 21 Mar 2024 18:02:10 +0100 Subject: [PATCH 04/53] Add per request timeout Store the current in flight callback in a variable. When the timeout handler reaches timeout, we kill the current request. If the idle timeout triggers, we kill all requests, including the current in-flight request. --- .../netty/client/Http4sChannelPoolMap.scala | 28 ++++++---------- .../http4s/netty/client/Http4sHandler.scala | 33 ++++++++++++++----- .../netty/client/NettyClientBuilder.scala | 11 +++++-- .../client/NettyClientIdleTimeoutTest.scala | 30 +++++++++++++---- 4 files changed, 66 insertions(+), 36 deletions(-) diff --git a/client/src/main/scala/org/http4s/netty/client/Http4sChannelPoolMap.scala b/client/src/main/scala/org/http4s/netty/client/Http4sChannelPoolMap.scala index 86cc0268..1d919535 100644 --- a/client/src/main/scala/org/http4s/netty/client/Http4sChannelPoolMap.scala +++ b/client/src/main/scala/org/http4s/netty/client/Http4sChannelPoolMap.scala @@ -20,7 +20,6 @@ package client import cats.effect.Async import cats.effect.Resource import cats.effect.std.Dispatcher -import cats.syntax.all._ import com.typesafe.netty.http.HttpStreamsClientHandler import fs2.io.net.tls.TLSParameters import io.netty.bootstrap.Bootstrap @@ -50,6 +49,7 @@ import org.http4s.Uri.Scheme import org.http4s.client.RequestKey import java.net.ConnectException +import java.util.concurrent.TimeUnit import scala.concurrent.duration.Duration private[client] case class Key(requestKey: RequestKey, version: HttpVersion) @@ -77,13 +77,12 @@ private[client] class Http4sChannelPoolMap[F[_]]( logger.trace("building pipeline / end-of-pipeline") pipeline.addLast("streaming-handler", new HttpStreamsClientHandler) - if (config.idleTimeout.isFinite && config.idleTimeout.length > 0) { - void( - pipeline - .addLast( - "timeout", - new IdleStateHandler(0, 0, config.idleTimeout.length, config.idleTimeout.unit))) - } + val idletimeout = if (config.idleTimeout.isFinite) config.idleTimeout.toMillis else 0L + val readTimeout = if (config.readTimeout.isFinite) config.readTimeout.toMillis else 0L + + pipeline.addLast( + "timeout", + new IdleStateHandler(readTimeout, 0, idletimeout, TimeUnit.MILLISECONDS)) } private def connectAndConfigure(key: Key): Resource[F, Channel] = { @@ -251,16 +250,9 @@ private[client] object Http4sChannelPoolMap { proxy: Option[Proxy], sslConfig: SSLContextOption, http2: Boolean, - defaultRequestHeaders: Headers + defaultRequestHeaders: Headers, + readTimeout: Duration ) - private[client] def fromFuture[F[_]: Async, A](future: => Future[A]): F[A] = - Async[F].async { callback => - val fut = future - void( - fut - .addListener((f: Future[A]) => - if (f.isSuccess) callback(Right(f.getNow)) else callback(Left(f.cause())))) - Async[F].delay(Some(Async[F].delay(fut.cancel(false)).void)) - } + private[client] def fromFuture[F[_]: Async, A](future: => Future[A]): F[A] = ??? } diff --git a/client/src/main/scala/org/http4s/netty/client/Http4sHandler.scala b/client/src/main/scala/org/http4s/netty/client/Http4sHandler.scala index 59c66f70..ce3c3cc1 100644 --- a/client/src/main/scala/org/http4s/netty/client/Http4sHandler.scala +++ b/client/src/main/scala/org/http4s/netty/client/Http4sHandler.scala @@ -24,6 +24,7 @@ import cats.effect.std.Dispatcher import cats.syntax.all._ import io.netty.channel._ import io.netty.handler.codec.http.HttpResponse +import io.netty.handler.timeout.IdleState import io.netty.handler.timeout.IdleStateEvent import org.http4s._ import org.http4s.netty.client.Http4sHandler.logger @@ -52,6 +53,7 @@ private[netty] class Http4sHandler[F[_]](dispatcher: Dispatcher[F])(implicit F: private var eventLoopContext: ExecutionContext = _ private var pending: Future[Unit] = Future.unit + private var inFlight: Option[Promise] = None private def write2(request: Request[F], channel: Channel, key: Key): F[Unit] = { import io.netty.handler.codec.http2._ @@ -159,17 +161,19 @@ private[netty] class Http4sHandler[F[_]](dispatcher: Dispatcher[F])(implicit F: if (promises.nonEmpty) { val promise = promises.dequeue() + inFlight = Some(promise) logger.trace("dequeuing promise") pending = pending.flatMap { _ => result.transform { case Failure(exception) => logger.trace("handling promise failure") promise(Left(exception)) + inFlight = None Failure(exception) case Success(res) => logger.trace("handling promise success") - promise(Right(res)) + inFlight = None Success(()) } } @@ -204,20 +208,31 @@ private[netty] class Http4sHandler[F[_]](dispatcher: Dispatcher[F])(implicit F: private def onException(channel: Channel, e: Throwable): Unit = void { implicit val ec: ExecutionContext = eventLoopContext - val pendingPromises = - promises.dequeueAll(_ => true).map(promise => Future(promise(Left(e)))) - logger.trace(s"onException: dequeueAll(${pendingPromises.size})") - pending = pending.flatMap(_ => Future.sequence(pendingPromises).map(_ => ())) + val allPromises = + (inFlight.toList ++ promises.dequeueAll(_ => true)).map(promise => Future(promise(Left(e)))) + logger.trace(s"onException: dequeueAll(${allPromises.size})") + pending = pending.flatMap(_ => Future.sequence(allPromises).map(_ => ())) + inFlight = None channel.close() } override def userEventTriggered(ctx: ChannelHandlerContext, evt: scala.Any): Unit = void { evt match { - case _: IdleStateEvent if ctx.channel().isOpen => - val message = s"Closing connection due to idle timeout" - logger.trace(message) - onException(ctx.channel(), new TimeoutException(message)) + case e: IdleStateEvent if ctx.channel().isOpen => + val state = e.state() + state match { + case IdleState.READER_IDLE => + val message = "Timing out request due to missing read" + inFlight.foreach(_(Left(new TimeoutException(message)))) + inFlight = None + () + case IdleState.WRITER_IDLE => () + case IdleState.ALL_IDLE => + val message = "Closing connection due to idle timeout" + logger.trace(message) + onException(ctx.channel(), new TimeoutException(message)) + } case _ => super.userEventTriggered(ctx, evt) } } diff --git a/client/src/main/scala/org/http4s/netty/client/NettyClientBuilder.scala b/client/src/main/scala/org/http4s/netty/client/NettyClientBuilder.scala index 2c1fad0e..62326d7a 100644 --- a/client/src/main/scala/org/http4s/netty/client/NettyClientBuilder.scala +++ b/client/src/main/scala/org/http4s/netty/client/NettyClientBuilder.scala @@ -29,6 +29,7 @@ import scala.concurrent.duration._ class NettyClientBuilder[F[_]]( idleTimeout: Duration, + readTimeout: Duration, eventLoopThreads: Int, maxInitialLength: Int, maxHeaderSize: Int, @@ -45,6 +46,7 @@ class NettyClientBuilder[F[_]]( private def copy( idleTimeout: Duration = idleTimeout, + readTimeout: Duration = readTimeout, eventLoopThreads: Int = eventLoopThreads, maxInitialLength: Int = maxInitialLength, maxHeaderSize: Int = maxHeaderSize, @@ -59,6 +61,7 @@ class NettyClientBuilder[F[_]]( ): NettyClientBuilder[F] = new NettyClientBuilder[F]( idleTimeout, + readTimeout, eventLoopThreads, maxInitialLength, maxHeaderSize, @@ -79,7 +82,9 @@ class NettyClientBuilder[F[_]]( def withMaxHeaderSize(size: Int): Self = copy(maxHeaderSize = size) def withMaxChunkSize(size: Int): Self = copy(maxChunkSize = size) def withMaxConnectionsPerKey(size: Int): Self = copy(maxConnectionsPerKey = size) - def withIdleTimeout(duration: FiniteDuration): Self = copy(idleTimeout = duration) + + def withIdleTimeout(duration: Duration): Self = copy(idleTimeout = duration) + def withReadTimeout(duration: Duration): Self = copy(readTimeout = duration) def withSSLContext(sslContext: SSLContext): Self = copy(sslContext = SSLContextOption.Provided(sslContext)) @@ -134,7 +139,8 @@ class NettyClientBuilder[F[_]]( proxy, sslContext, http2, - defaultRequestHeaders + defaultRequestHeaders, + readTimeout ) Client[F](new Http4sChannelPoolMap[F](bs, config).run) } @@ -144,6 +150,7 @@ object NettyClientBuilder { def apply[F[_]](implicit F: Async[F]): NettyClientBuilder[F] = new NettyClientBuilder[F]( idleTimeout = 60.seconds, + readTimeout = 60.seconds, eventLoopThreads = 0, maxInitialLength = 4096, maxHeaderSize = 8192, diff --git a/client/src/test/scala/org/http4s/netty/client/NettyClientIdleTimeoutTest.scala b/client/src/test/scala/org/http4s/netty/client/NettyClientIdleTimeoutTest.scala index fa5244ba..ef6bbd92 100644 --- a/client/src/test/scala/org/http4s/netty/client/NettyClientIdleTimeoutTest.scala +++ b/client/src/test/scala/org/http4s/netty/client/NettyClientIdleTimeoutTest.scala @@ -33,13 +33,17 @@ import scala.concurrent.TimeoutException import scala.concurrent.duration.* class NettyClientIdleTimeoutTest extends IOSuite { - override val munitIOTimeout: Duration = 1.minute - - val nettyClient: IOFixture[Client[IO]] = + val nettyIdleClient: IOFixture[Client[IO]] = resourceFixture( NettyClientBuilder[IO] .withIdleTimeout(3.seconds) - .withMaxConnectionsPerKey(2) + .resource, + "netty client") + + val nettyReadTimeoutClient: IOFixture[Client[IO]] = + resourceFixture( + NettyClientBuilder[IO] + .withReadTimeout(3.seconds) .resource, "netty client") @@ -72,7 +76,7 @@ class NettyClientIdleTimeoutTest extends IOSuite { val s = server() val req = Request[IO](uri = s.baseUri / "idle-timeout") - val response = nettyClient().status(req).attempt + val response = nettyIdleClient().status(req).attempt IO.race(response, IO.sleep(5.seconds)).map { case Left(Left(error: TimeoutException)) => assertEquals(error.getMessage, "Closing connection due to idle timeout") @@ -82,9 +86,9 @@ class NettyClientIdleTimeoutTest extends IOSuite { } } - test("Request A timed out, request B receives response B") { + test("Request A timed out, idle timeout kills connection") { val s = server() - val c = nettyClient() + val c = nettyIdleClient() val req1 = Request[IO](uri = s.baseUri / "1") val req2 = Request[IO](uri = s.baseUri / "2") @@ -93,4 +97,16 @@ class NettyClientIdleTimeoutTest extends IOSuite { r2 <- c.expect[String](req2).attempt.map(_.leftMap(_.getMessage)) } yield assertEquals(r2, Left("Closing connection due to idle timeout")) } + + test("Request A timed out, request B receives response B") { + val s = server() + val c = nettyReadTimeoutClient() + + val req1 = Request[IO](uri = s.baseUri / "1") + val req2 = Request[IO](uri = s.baseUri / "2") + for { + _ <- c.expect[String](req1).attempt.map(_.leftMap(_.getMessage)) + r2 <- c.expect[String](req2).attempt.map(_.leftMap(_.getMessage)) + } yield assertEquals(r2, Right("2")) + } } From e90712746d54e9f8210f4c995a3cf4f89a234fc8 Mon Sep 17 00:00:00 2001 From: Erlend Hamnaberg Date: Thu, 21 Mar 2024 18:07:20 +0100 Subject: [PATCH 05/53] Make sure we start the next request ensure we call ctx.read() when killing current request to start the next request --- .../src/main/scala/org/http4s/netty/client/Http4sHandler.scala | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/main/scala/org/http4s/netty/client/Http4sHandler.scala b/client/src/main/scala/org/http4s/netty/client/Http4sHandler.scala index ce3c3cc1..942e5087 100644 --- a/client/src/main/scala/org/http4s/netty/client/Http4sHandler.scala +++ b/client/src/main/scala/org/http4s/netty/client/Http4sHandler.scala @@ -226,6 +226,7 @@ private[netty] class Http4sHandler[F[_]](dispatcher: Dispatcher[F])(implicit F: val message = "Timing out request due to missing read" inFlight.foreach(_(Left(new TimeoutException(message)))) inFlight = None + ctx.read() // schedule a new read () case IdleState.WRITER_IDLE => () case IdleState.ALL_IDLE => From 4d0b094ae5505f548ff2324f86fdcfbee9094d81 Mon Sep 17 00:00:00 2001 From: Erlend Hamnaberg Date: Thu, 21 Mar 2024 18:11:50 +0100 Subject: [PATCH 06/53] use logger instead of println --- .../http4s/netty/client/NettyClientIdleTimeoutTest.scala | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/src/test/scala/org/http4s/netty/client/NettyClientIdleTimeoutTest.scala b/client/src/test/scala/org/http4s/netty/client/NettyClientIdleTimeoutTest.scala index ef6bbd92..06dd87a1 100644 --- a/client/src/test/scala/org/http4s/netty/client/NettyClientIdleTimeoutTest.scala +++ b/client/src/test/scala/org/http4s/netty/client/NettyClientIdleTimeoutTest.scala @@ -33,6 +33,8 @@ import scala.concurrent.TimeoutException import scala.concurrent.duration.* class NettyClientIdleTimeoutTest extends IOSuite { + private val logger = org.log4s.getLogger + val nettyIdleClient: IOFixture[Client[IO]] = resourceFixture( NettyClientBuilder[IO] @@ -48,9 +50,9 @@ class NettyClientIdleTimeoutTest extends IOSuite { "netty client") def respond(path: String, sleep: FiniteDuration, value: String): IO[Response[IO]] = - IO.println(s"server: received /${path} request, sleeping...") >> + IO(logger.trace(s"server: received /${path} request, sleeping...")) >> IO.sleep(sleep) >> - IO.println(s"server: responding with '$value'") >> Ok(value) + IO(logger.trace(s"server: responding with '$value'")) >> Ok(value) val server: IOFixture[Server] = resourceFixture( EmberServerBuilder From 7a5ce4ac5fc27d4ad92c27db44572ea1c3801397 Mon Sep 17 00:00:00 2001 From: Erlend Hamnaberg Date: Thu, 21 Mar 2024 18:36:27 +0100 Subject: [PATCH 07/53] read only if autoread is off --- .../main/scala/org/http4s/netty/client/Http4sHandler.scala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/src/main/scala/org/http4s/netty/client/Http4sHandler.scala b/client/src/main/scala/org/http4s/netty/client/Http4sHandler.scala index 942e5087..12970acb 100644 --- a/client/src/main/scala/org/http4s/netty/client/Http4sHandler.scala +++ b/client/src/main/scala/org/http4s/netty/client/Http4sHandler.scala @@ -226,7 +226,9 @@ private[netty] class Http4sHandler[F[_]](dispatcher: Dispatcher[F])(implicit F: val message = "Timing out request due to missing read" inFlight.foreach(_(Left(new TimeoutException(message)))) inFlight = None - ctx.read() // schedule a new read + if (!ctx.channel().config().isAutoRead) void { + ctx.read() // schedule a new read + } () case IdleState.WRITER_IDLE => () case IdleState.ALL_IDLE => From 50828801a7dea45e5ad8821ccb0d67cb7b0406c0 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Thu, 28 Mar 2024 16:19:13 +0000 Subject: [PATCH 08/53] Update fs2-reactive-streams to 3.10.2 in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 0333bbb9..f0f73812 100644 --- a/build.sbt +++ b/build.sbt @@ -46,7 +46,7 @@ lazy val core = project .settings( name := "http4s-netty-core", libraryDependencies ++= List( - "co.fs2" %% "fs2-reactive-streams" % "3.10.0", + "co.fs2" %% "fs2-reactive-streams" % "3.10.2", ("com.typesafe.netty" % "netty-reactive-streams-http" % "2.0.12") .exclude("io.netty", "netty-codec-http") .exclude("io.netty", "netty-handler"), From b00ce736548b6401c1307fddec210f15a5cbc2df Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Fri, 29 Mar 2024 08:21:23 +0000 Subject: [PATCH 09/53] Update scalafmt-core to 3.8.1 in series/0.5 --- .scalafmt.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.scalafmt.conf b/.scalafmt.conf index 5c03b0ce..7a2f1323 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,4 +1,4 @@ -version = 3.8.0 +version = 3.8.1 runner.dialect = scala213 style = default From 754956d43703b6045ac9480cbeb4046b77559f31 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Wed, 3 Apr 2024 16:19:17 +0000 Subject: [PATCH 10/53] Update jetty-client to 12.0.8 in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index f0f73812..c26e1cbf 100644 --- a/build.sbt +++ b/build.sbt @@ -21,7 +21,7 @@ inThisBuild( val http4sVersion = "0.23.26" -val jetty = "12.0.7" +val jetty = "12.0.8" val netty = "4.1.108.Final" From 0258df30279b1bc8d6310e1bdfb191ff60dc4e13 Mon Sep 17 00:00:00 2001 From: Erlend Hamnaberg Date: Wed, 10 Apr 2024 15:28:11 +0200 Subject: [PATCH 11/53] Always kill connection when failing either idle timeout We control when we kill the connection, not the playframework lib. --- .../http4s/netty/client/Http4sChannelPoolMap.scala | 10 +++++++++- .../org/http4s/netty/client/Http4sHandler.scala | 7 +------ .../netty/client/NettyClientIdleTimeoutTest.scala | 14 ++++++++++---- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/client/src/main/scala/org/http4s/netty/client/Http4sChannelPoolMap.scala b/client/src/main/scala/org/http4s/netty/client/Http4sChannelPoolMap.scala index 1d919535..d1cf52a2 100644 --- a/client/src/main/scala/org/http4s/netty/client/Http4sChannelPoolMap.scala +++ b/client/src/main/scala/org/http4s/netty/client/Http4sChannelPoolMap.scala @@ -25,8 +25,10 @@ import fs2.io.net.tls.TLSParameters import io.netty.bootstrap.Bootstrap import io.netty.channel.Channel import io.netty.channel.ChannelFuture +import io.netty.channel.ChannelHandlerContext import io.netty.channel.ChannelInitializer import io.netty.channel.ChannelPipeline +import io.netty.channel.ChannelPromise import io.netty.channel.pool.AbstractChannelPoolHandler import io.netty.channel.pool.AbstractChannelPoolMap import io.netty.channel.pool.ChannelPoolHandler @@ -75,7 +77,13 @@ private[client] class Http4sChannelPoolMap[F[_]]( private def endOfPipeline(pipeline: ChannelPipeline): Unit = void { logger.trace("building pipeline / end-of-pipeline") - pipeline.addLast("streaming-handler", new HttpStreamsClientHandler) + pipeline.addLast( + "streaming-handler", + new HttpStreamsClientHandler { + override def close(ctx: ChannelHandlerContext, future: ChannelPromise): Unit = void { + ctx.close(future) + } + }) val idletimeout = if (config.idleTimeout.isFinite) config.idleTimeout.toMillis else 0L val readTimeout = if (config.readTimeout.isFinite) config.readTimeout.toMillis else 0L diff --git a/client/src/main/scala/org/http4s/netty/client/Http4sHandler.scala b/client/src/main/scala/org/http4s/netty/client/Http4sHandler.scala index 12970acb..883b1044 100644 --- a/client/src/main/scala/org/http4s/netty/client/Http4sHandler.scala +++ b/client/src/main/scala/org/http4s/netty/client/Http4sHandler.scala @@ -224,12 +224,7 @@ private[netty] class Http4sHandler[F[_]](dispatcher: Dispatcher[F])(implicit F: state match { case IdleState.READER_IDLE => val message = "Timing out request due to missing read" - inFlight.foreach(_(Left(new TimeoutException(message)))) - inFlight = None - if (!ctx.channel().config().isAutoRead) void { - ctx.read() // schedule a new read - } - () + onException(ctx.channel(), new TimeoutException(message)) case IdleState.WRITER_IDLE => () case IdleState.ALL_IDLE => val message = "Closing connection due to idle timeout" diff --git a/client/src/test/scala/org/http4s/netty/client/NettyClientIdleTimeoutTest.scala b/client/src/test/scala/org/http4s/netty/client/NettyClientIdleTimeoutTest.scala index 06dd87a1..34fd181d 100644 --- a/client/src/test/scala/org/http4s/netty/client/NettyClientIdleTimeoutTest.scala +++ b/client/src/test/scala/org/http4s/netty/client/NettyClientIdleTimeoutTest.scala @@ -95,9 +95,12 @@ class NettyClientIdleTimeoutTest extends IOSuite { val req1 = Request[IO](uri = s.baseUri / "1") val req2 = Request[IO](uri = s.baseUri / "2") for { - _ <- c.expect[String](req1).attempt.map(_.leftMap(_.getMessage)) + error <- c.expect[String](req1).attempt.map(_.leftMap(_.getMessage)) r2 <- c.expect[String](req2).attempt.map(_.leftMap(_.getMessage)) - } yield assertEquals(r2, Left("Closing connection due to idle timeout")) + } yield { + assertEquals(error, Left("Closing connection due to idle timeout")) + assertEquals(r2, Right("2")) + } } test("Request A timed out, request B receives response B") { @@ -107,8 +110,11 @@ class NettyClientIdleTimeoutTest extends IOSuite { val req1 = Request[IO](uri = s.baseUri / "1") val req2 = Request[IO](uri = s.baseUri / "2") for { - _ <- c.expect[String](req1).attempt.map(_.leftMap(_.getMessage)) + error <- c.expect[String](req1).attempt.map(_.leftMap(_.getMessage)) r2 <- c.expect[String](req2).attempt.map(_.leftMap(_.getMessage)) - } yield assertEquals(r2, Right("2")) + } yield { + assertEquals(error, Left("Timing out request due to missing read")) + assertEquals(r2, Right("2")) + } } } From fd7c0aef5baf0f72a99f9a46c7b44844f9e06d60 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Sat, 13 Apr 2024 12:25:30 +0000 Subject: [PATCH 12/53] Update munit-cats-effect to 2.0.0-M5 in series/0.5 --- build.sbt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index c26e1cbf..57b573fb 100644 --- a/build.sbt +++ b/build.sbt @@ -74,7 +74,7 @@ lazy val server = project "org.scalameta" %% "munit-scalacheck" % munit % Test, "org.http4s" %% "http4s-circe" % http4sVersion % Test, "org.http4s" %% "http4s-jdk-http-client" % "0.9.1" % Test, - "org.typelevel" %% "munit-cats-effect" % "2.0.0-M4" % Test + "org.typelevel" %% "munit-cats-effect" % "2.0.0-M5" % Test ), libraryDependencies ++= nativeNettyModules, mimaBinaryIssueFilters ++= Seq( @@ -114,7 +114,7 @@ lazy val client = project "com.github.bbottema" % "java-socks-proxy-server" % "3.0.0" % Test, "org.scalameta" %% "munit" % munit % Test, "ch.qos.logback" % "logback-classic" % "1.2.13" % Test, - "org.typelevel" %% "munit-cats-effect" % "2.0.0-M4" % Test + "org.typelevel" %% "munit-cats-effect" % "2.0.0-M5" % Test ), libraryDependencies ++= nativeNettyModules, mimaBinaryIssueFilters ++= Seq( From 038ea682604e1d5d5bf10006f9abf8ef37377e74 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Mon, 15 Apr 2024 12:28:31 +0000 Subject: [PATCH 13/53] Update netty-codec-http, ... to 4.1.109.Final in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index c26e1cbf..a9e9550c 100644 --- a/build.sbt +++ b/build.sbt @@ -23,7 +23,7 @@ val http4sVersion = "0.23.26" val jetty = "12.0.8" -val netty = "4.1.108.Final" +val netty = "4.1.109.Final" val munit = "0.7.29" From 96f26cbdedc5d285a33a73a17a57240a91952f8a Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Sun, 21 Apr 2024 16:19:18 +0000 Subject: [PATCH 14/53] Update java-socks-proxy-server to 4.0.0 in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index a9e9550c..ccc57672 100644 --- a/build.sbt +++ b/build.sbt @@ -111,7 +111,7 @@ lazy val client = project ("com.github.monkeywie" % "proxyee" % "1.7.6" % Test) .excludeAll("io.netty") .excludeAll("org.bouncycastle"), - "com.github.bbottema" % "java-socks-proxy-server" % "3.0.0" % Test, + "com.github.bbottema" % "java-socks-proxy-server" % "4.0.0" % Test, "org.scalameta" %% "munit" % munit % Test, "ch.qos.logback" % "logback-classic" % "1.2.13" % Test, "org.typelevel" %% "munit-cats-effect" % "2.0.0-M4" % Test From 0b9ff8168d9b46c294d993a8f8c4e29b613142c3 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 08:26:32 +0000 Subject: [PATCH 15/53] Update sbt-http4s-org to 0.17.0 in series/0.5 --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 5799012f..06f9f80b 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1 +1 @@ -addSbtPlugin("org.http4s" % "sbt-http4s-org" % "0.16.3") +addSbtPlugin("org.http4s" % "sbt-http4s-org" % "0.17.0") From 63750114f5afe46522f2bc4a5e1042dd24cb28e0 Mon Sep 17 00:00:00 2001 From: Erlend Hamnaberg Date: Thu, 25 Apr 2024 14:39:22 +0200 Subject: [PATCH 16/53] set startYear --- build.sbt | 1 + 1 file changed, 1 insertion(+) diff --git a/build.sbt b/build.sbt index ccc57672..f49523b3 100644 --- a/build.sbt +++ b/build.sbt @@ -5,6 +5,7 @@ val Scala213 = "2.13.13" inThisBuild( Seq( + startYear := Some(2020), Test / fork := true, developers := List( // your GitHub handle and name From 87fa3d4cb5b6497dffe4d913dd29f92f5b13435d Mon Sep 17 00:00:00 2001 From: Erlend Hamnaberg Date: Thu, 25 Apr 2024 14:47:14 +0200 Subject: [PATCH 17/53] fix incorrect import style --- .../org/http4s/netty/client/NettyClientIdleTimeoutTest.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/test/scala/org/http4s/netty/client/NettyClientIdleTimeoutTest.scala b/client/src/test/scala/org/http4s/netty/client/NettyClientIdleTimeoutTest.scala index 34fd181d..6f672f99 100644 --- a/client/src/test/scala/org/http4s/netty/client/NettyClientIdleTimeoutTest.scala +++ b/client/src/test/scala/org/http4s/netty/client/NettyClientIdleTimeoutTest.scala @@ -30,7 +30,7 @@ import org.http4s.implicits._ import org.http4s.server.Server import scala.concurrent.TimeoutException -import scala.concurrent.duration.* +import scala.concurrent.duration._ class NettyClientIdleTimeoutTest extends IOSuite { private val logger = org.log4s.getLogger From 780a198124695f5a5fb4e49f784ead46f5e6e470 Mon Sep 17 00:00:00 2001 From: Stijn Koopal Date: Thu, 25 Apr 2024 10:19:10 +0200 Subject: [PATCH 18/53] Also include epoll aarch dependency --- build.sbt | 1 + 1 file changed, 1 insertion(+) diff --git a/build.sbt b/build.sbt index f49523b3..2dcf9e5b 100644 --- a/build.sbt +++ b/build.sbt @@ -36,6 +36,7 @@ val nativeNettyModules = "io.netty" % "netty-transport-classes-kqueue" % netty, "io.netty.incubator" % "netty-incubator-transport-classes-io_uring" % io_uring, ("io.netty" % "netty-transport-native-epoll" % netty).classifier("linux-x86_64") % Runtime, + ("io.netty" % "netty-transport-native-epoll" % netty).classifier("linux-aarch_64") % Runtime, ("io.netty" % "netty-transport-native-kqueue" % netty).classifier("osx-x86_64") % Runtime, ("io.netty" % "netty-transport-native-kqueue" % netty).classifier("osx-aarch_64") % Runtime, ("io.netty.incubator" % "netty-incubator-transport-native-io_uring" % io_uring) From ce7d118ddd633ce22ea176c636b2b3d5893d3a25 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Thu, 2 May 2024 01:15:38 +0000 Subject: [PATCH 19/53] Update scala-library to 2.13.14 in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 2dcf9e5b..12ed214f 100644 --- a/build.sbt +++ b/build.sbt @@ -1,7 +1,7 @@ import com.typesafe.tools.mima.core._ val Scala212 = "2.12.19" -val Scala213 = "2.13.13" +val Scala213 = "2.13.14" inThisBuild( Seq( From c19dd2354af0002e9e33cac85a696776f04ceaae Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Fri, 3 May 2024 20:20:58 +0000 Subject: [PATCH 20/53] Update http4s-circe, http4s-client, ... to 0.23.27 in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 2dcf9e5b..b92b0806 100644 --- a/build.sbt +++ b/build.sbt @@ -20,7 +20,7 @@ inThisBuild( ) ) -val http4sVersion = "0.23.26" +val http4sVersion = "0.23.27" val jetty = "12.0.8" From c286247ccd5db4dcc9a1a95cfa7926b705fe17f0 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 04:26:45 +0000 Subject: [PATCH 21/53] Update sbt to 1.10.0 in series/0.5 --- project/build.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/build.properties b/project/build.properties index 04267b14..081fdbbc 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.9.9 +sbt.version=1.10.0 From 6616df8d3fe70c98bf09888de35711941f7c1a41 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Tue, 7 May 2024 16:22:44 +0000 Subject: [PATCH 22/53] Update jetty-http2-client, ... to 12.0.9 in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index d2567b01..9137b1ac 100644 --- a/build.sbt +++ b/build.sbt @@ -22,7 +22,7 @@ inThisBuild( val http4sVersion = "0.23.27" -val jetty = "12.0.8" +val jetty = "12.0.9" val netty = "4.1.109.Final" From 65cd50328c21351f44a097289fe4541b0f4b5615 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Thu, 9 May 2024 12:38:24 +0000 Subject: [PATCH 23/53] Update sbt-http4s-org to 0.17.1 in series/0.5 --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 06f9f80b..f009a8b6 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1 +1 @@ -addSbtPlugin("org.http4s" % "sbt-http4s-org" % "0.17.0") +addSbtPlugin("org.http4s" % "sbt-http4s-org" % "0.17.1") From e086817c0f2d96a9bfca40840a67dae22bb9f05c Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Wed, 15 May 2024 12:37:18 +0000 Subject: [PATCH 24/53] Update java-socks-proxy-server to 4.1.0 in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index d2567b01..95ab76bf 100644 --- a/build.sbt +++ b/build.sbt @@ -113,7 +113,7 @@ lazy val client = project ("com.github.monkeywie" % "proxyee" % "1.7.6" % Test) .excludeAll("io.netty") .excludeAll("org.bouncycastle"), - "com.github.bbottema" % "java-socks-proxy-server" % "4.0.0" % Test, + "com.github.bbottema" % "java-socks-proxy-server" % "4.1.0" % Test, "org.scalameta" %% "munit" % munit % Test, "ch.qos.logback" % "logback-classic" % "1.2.13" % Test, "org.typelevel" %% "munit-cats-effect" % "2.0.0-M5" % Test From 18a38f2745775022293f6d50cf03fa4369912d44 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Wed, 22 May 2024 12:38:13 +0000 Subject: [PATCH 25/53] Update netty-codec-http, ... to 4.1.110.Final in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index d2567b01..533a8afc 100644 --- a/build.sbt +++ b/build.sbt @@ -24,7 +24,7 @@ val http4sVersion = "0.23.27" val jetty = "12.0.8" -val netty = "4.1.109.Final" +val netty = "4.1.110.Final" val munit = "0.7.29" From f3a3adf90509de5b631b1cb19c77496633b54394 Mon Sep 17 00:00:00 2001 From: Erlend Hamnaberg Date: Wed, 22 May 2024 17:18:55 +0200 Subject: [PATCH 26/53] Fix socks proxy test, improve http proxy test --- .../scala/org/http4s/netty/client/HttpProxyTest.scala | 11 +++++------ .../org/http4s/netty/client/SocksProxyTest.scala | 11 +++++------ 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/client/src/test/scala/org/http4s/netty/client/HttpProxyTest.scala b/client/src/test/scala/org/http4s/netty/client/HttpProxyTest.scala index fad0bfd8..533fd3e9 100644 --- a/client/src/test/scala/org/http4s/netty/client/HttpProxyTest.scala +++ b/client/src/test/scala/org/http4s/netty/client/HttpProxyTest.scala @@ -30,7 +30,6 @@ import org.http4s.Uri import org.http4s.client.testkit.scaffold.ServerScaffold import java.net.ServerSocket -import scala.compat.java8.FutureConverters._ class HttpProxyTest extends IOSuite { @@ -45,12 +44,12 @@ class HttpProxyTest extends IOSuite { val proxy: IOFixture[HttpProxy] = resourceFixture( for { address <- Resource.eval(HttpProxyTest.randomSocketAddress[IO]) - _ <- Resource { + _ <- Resource.make[IO, HttpProxyServer] { val s = new HttpProxyServer() - IO.fromFuture( - IO(toScala(s.startAsync(address.host.toInetAddress.getHostAddress, address.port.value)))) - .as(s -> IO.blocking(s.close())) - } + IO.fromCompletionStage( + IO(s.startAsync(address.host.toInetAddress.getHostAddress, address.port.value))) + .as(s) + }(s => IO.blocking(s.close())) } yield HttpProxy( Uri.Scheme.http, address.host, diff --git a/client/src/test/scala/org/http4s/netty/client/SocksProxyTest.scala b/client/src/test/scala/org/http4s/netty/client/SocksProxyTest.scala index 0f3da954..56df4623 100644 --- a/client/src/test/scala/org/http4s/netty/client/SocksProxyTest.scala +++ b/client/src/test/scala/org/http4s/netty/client/SocksProxyTest.scala @@ -19,7 +19,7 @@ package org.http4s.netty.client import cats.effect.IO import cats.effect.Resource import munit.catseffect.IOFixture -import org.bbottema.javasocksproxyserver.SocksServer +import org.bbottema.javasocksproxyserver.SyncSocksServer import org.http4s.HttpRoutes import org.http4s.Response import org.http4s.Uri @@ -37,11 +37,10 @@ class SocksProxyTest extends IOSuite { val socks: IOFixture[(Socks4, Socks5)] = resourceFixture( for { address <- Resource.eval(HttpProxyTest.randomSocketAddress[IO]) - _ <- Resource { - val s = new SocksServer() - IO.blocking(s.start(address.port.value)) - .map(_ => s -> IO.blocking(s.stop())) - } + _ <- Resource.make[IO, SyncSocksServer] { + val s = new SyncSocksServer() + IO.blocking(s.start(address.port.value)).as(s) + }(s => IO.blocking(s.stop()).void) } yield Socks4(address.host, address.port, None) -> Socks5( address.host, address.port, From 152cbbf024535a44ce2b52b546b7a4cf565e5b6b Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 16:28:34 +0000 Subject: [PATCH 27/53] Update jetty-client to 12.0.10 in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 59c1480d..a5874d78 100644 --- a/build.sbt +++ b/build.sbt @@ -22,7 +22,7 @@ inThisBuild( val http4sVersion = "0.23.27" -val jetty = "12.0.9" +val jetty = "12.0.10" val netty = "4.1.110.Final" From 71209dbeb7defea96a67a7fde3db6d9f8d7057f3 Mon Sep 17 00:00:00 2001 From: Alexey Yuferov Date: Thu, 6 Jun 2024 12:17:58 +0300 Subject: [PATCH 28/53] NettyServerBuilder withWebSocketMaxFrameLength method --- .../main/scala/org/http4s/netty/server/NettyServerBuilder.scala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/src/main/scala/org/http4s/netty/server/NettyServerBuilder.scala b/server/src/main/scala/org/http4s/netty/server/NettyServerBuilder.scala index 80a8368d..d8b95a03 100644 --- a/server/src/main/scala/org/http4s/netty/server/NettyServerBuilder.scala +++ b/server/src/main/scala/org/http4s/netty/server/NettyServerBuilder.scala @@ -187,6 +187,8 @@ final class NettyServerBuilder[F[_]] private ( copy(serviceErrorHandler = handler) def withNettyChannelOptions(opts: NettyChannelOptions): Self = copy(nettyChannelOptions = opts) + def withWebSocketMaxFrameLength(wsMaxFrameLength: Int): Self = + copy(wsMaxFrameLength = wsMaxFrameLength) def withWebSocketCompression: Self = copy(wsCompression = true) def withoutWebSocketCompression: Self = copy(wsCompression = false) From 40dc61aa4872ba588745280f6783ac925828ab74 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Tue, 11 Jun 2024 12:39:51 +0000 Subject: [PATCH 29/53] Update netty-codec-http, ... to 4.1.111.Final in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index a5874d78..468f6e65 100644 --- a/build.sbt +++ b/build.sbt @@ -24,7 +24,7 @@ val http4sVersion = "0.23.27" val jetty = "12.0.10" -val netty = "4.1.110.Final" +val netty = "4.1.111.Final" val munit = "0.7.29" From 8390261cb099e7033bdc809c2f2da451175492b1 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Fri, 14 Jun 2024 16:28:22 +0000 Subject: [PATCH 30/53] Update scalafmt-core to 3.8.2 in series/0.5 --- .scalafmt.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.scalafmt.conf b/.scalafmt.conf index 7a2f1323..b2f2639f 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,4 +1,4 @@ -version = 3.8.1 +version = 3.8.2 runner.dialect = scala213 style = default From 122b7f0a184c3f3af6ea0c7b345e6bd1f257c25a Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Thu, 4 Jul 2024 01:15:58 +0000 Subject: [PATCH 31/53] Update jetty-client to 12.0.11 in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 468f6e65..e2d27284 100644 --- a/build.sbt +++ b/build.sbt @@ -22,7 +22,7 @@ inThisBuild( val http4sVersion = "0.23.27" -val jetty = "12.0.10" +val jetty = "12.0.11" val netty = "4.1.111.Final" From 1821ebcfe7f758338e447353ff0d3d79e908e908 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 01:21:33 +0000 Subject: [PATCH 32/53] Update sbt to 1.10.1 in series/0.5 --- project/build.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/build.properties b/project/build.properties index 081fdbbc..ee4c672c 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.0 +sbt.version=1.10.1 From 2e8ec18550f8f021a58d02a75d5b52539ad5eff8 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 20:19:26 +0000 Subject: [PATCH 33/53] Update netty-codec-http, ... to 4.1.112.Final in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 468f6e65..3662508b 100644 --- a/build.sbt +++ b/build.sbt @@ -24,7 +24,7 @@ val http4sVersion = "0.23.27" val jetty = "12.0.10" -val netty = "4.1.111.Final" +val netty = "4.1.112.Final" val munit = "0.7.29" From cb55327f0edfb03cc2ad7dbae2b6a51781f6052d Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 12:35:19 +0000 Subject: [PATCH 34/53] Update scalafmt-core to 3.8.3 in series/0.5 --- .scalafmt.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.scalafmt.conf b/.scalafmt.conf index b2f2639f..50b75f1d 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,4 +1,4 @@ -version = 3.8.2 +version = 3.8.3 runner.dialect = scala213 style = default From 9a5090f017fad9aec84672b708eef486ee400a6d Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Mon, 29 Jul 2024 16:30:05 +0000 Subject: [PATCH 35/53] Update sbt-http4s-org to 0.17.2 in series/0.5 --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index f009a8b6..008b79ea 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1 +1 @@ -addSbtPlugin("org.http4s" % "sbt-http4s-org" % "0.17.1") +addSbtPlugin("org.http4s" % "sbt-http4s-org" % "0.17.2") From 7a3a0a4baa56c0891400f0f1eb1a414b2fb132e5 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Mon, 29 Jul 2024 16:30:32 +0000 Subject: [PATCH 36/53] Run prePR with sbt-typelevel Executed command: sbt tlPrePrBotHook --- .github/workflows/ci.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fb4ac4d2..4f9c6bfc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,6 +35,10 @@ jobs: runs-on: ${{ matrix.os }} timeout-minutes: 60 steps: + - name: Install sbt + if: contains(runner.os, 'macos') + run: brew install sbt + - name: Checkout current branch (full) uses: actions/checkout@v4 with: @@ -104,6 +108,10 @@ jobs: java: [temurin@17] runs-on: ${{ matrix.os }} steps: + - name: Install sbt + if: contains(runner.os, 'macos') + run: brew install sbt + - name: Checkout current branch (full) uses: actions/checkout@v4 with: @@ -185,6 +193,10 @@ jobs: java: [temurin@17] runs-on: ${{ matrix.os }} steps: + - name: Install sbt + if: contains(runner.os, 'macos') + run: brew install sbt + - name: Checkout current branch (full) uses: actions/checkout@v4 with: From 02457b6ed9a6d4be5316a8d19e52d47f6cf6e069 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Tue, 30 Jul 2024 12:36:05 +0000 Subject: [PATCH 37/53] Update jetty-http2-client, ... to 12.0.12 in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index a53e05c4..2afdca59 100644 --- a/build.sbt +++ b/build.sbt @@ -22,7 +22,7 @@ inThisBuild( val http4sVersion = "0.23.27" -val jetty = "12.0.11" +val jetty = "12.0.12" val netty = "4.1.112.Final" From 4adbe84ffb462b2cdd145e38e92591a50fd549e7 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Mon, 12 Aug 2024 16:23:42 +0000 Subject: [PATCH 38/53] Update munit to 1.0.1 in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index a53e05c4..2485adfb 100644 --- a/build.sbt +++ b/build.sbt @@ -26,7 +26,7 @@ val jetty = "12.0.11" val netty = "4.1.112.Final" -val munit = "0.7.29" +val munit = "1.0.1" val io_uring = "0.0.25.Final" From 01ad3e09896e28d0be0b99509fc7185ee47ed39f Mon Sep 17 00:00:00 2001 From: Erlend Hamnaberg Date: Mon, 19 Aug 2024 09:30:25 +0200 Subject: [PATCH 39/53] fix munit deps, override dependency scheme for munit-cats-effect --- build.sbt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/build.sbt b/build.sbt index 2485adfb..76713d70 100644 --- a/build.sbt +++ b/build.sbt @@ -27,6 +27,7 @@ val jetty = "12.0.11" val netty = "4.1.112.Final" val munit = "1.0.1" +val munitScalaCheck = "1.0.0" val io_uring = "0.0.25.Final" @@ -73,11 +74,12 @@ lazy val server = project "org.http4s" %% "http4s-dsl" % http4sVersion % Test, "ch.qos.logback" % "logback-classic" % "1.4.5" % Test, "org.scalameta" %% "munit" % munit % Test, - "org.scalameta" %% "munit-scalacheck" % munit % Test, + "org.scalameta" %% "munit-scalacheck" % munitScalaCheck % Test, "org.http4s" %% "http4s-circe" % http4sVersion % Test, "org.http4s" %% "http4s-jdk-http-client" % "0.9.1" % Test, - "org.typelevel" %% "munit-cats-effect" % "2.0.0-M5" % Test + "org.typelevel" %% "munit-cats-effect" % "2.0.0" % Test ), + libraryDependencySchemes += "org.typelevel" %% "munit-cats-effect" % VersionScheme.Always, // "early-semver", libraryDependencies ++= nativeNettyModules, mimaBinaryIssueFilters ++= Seq( ProblemFilters.exclude[IncompatibleResultTypeProblem]( @@ -116,8 +118,9 @@ lazy val client = project "com.github.bbottema" % "java-socks-proxy-server" % "4.1.0" % Test, "org.scalameta" %% "munit" % munit % Test, "ch.qos.logback" % "logback-classic" % "1.2.13" % Test, - "org.typelevel" %% "munit-cats-effect" % "2.0.0-M5" % Test + "org.typelevel" %% "munit-cats-effect" % "2.0.0" % Test ), + libraryDependencySchemes += "org.typelevel" %% "munit-cats-effect" % VersionScheme.Always, // "early-semver", libraryDependencies ++= nativeNettyModules, mimaBinaryIssueFilters ++= Seq( ProblemFilters.exclude[Problem]("org.http4s.netty.client.Http4sChannelPoolMap"), From 85aa0f38e03ad51f9817b8f16768ae82cf0f1dbf Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 20:20:56 +0000 Subject: [PATCH 40/53] Update fs2-reactive-streams to 3.11.0 in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 191356f9..64b120f7 100644 --- a/build.sbt +++ b/build.sbt @@ -49,7 +49,7 @@ lazy val core = project .settings( name := "http4s-netty-core", libraryDependencies ++= List( - "co.fs2" %% "fs2-reactive-streams" % "3.10.2", + "co.fs2" %% "fs2-reactive-streams" % "3.11.0", ("com.typesafe.netty" % "netty-reactive-streams-http" % "2.0.12") .exclude("io.netty", "netty-codec-http") .exclude("io.netty", "netty-handler"), From b7620a8838bff07f8bc55d5838c31ccb9e4f14a0 Mon Sep 17 00:00:00 2001 From: Erlend Hamnaberg Date: Tue, 27 Aug 2024 11:03:56 +0200 Subject: [PATCH 41/53] Mark JDKClientWebsocketTest grouping test as flaky --- .../test/scala/org/http4s/netty/server/WebsocketTest.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/test/scala/org/http4s/netty/server/WebsocketTest.scala b/server/src/test/scala/org/http4s/netty/server/WebsocketTest.scala index e471da00..586ba1af 100644 --- a/server/src/test/scala/org/http4s/netty/server/WebsocketTest.scala +++ b/server/src/test/scala/org/http4s/netty/server/WebsocketTest.scala @@ -106,7 +106,7 @@ object WebsocketTest { class NettyWebsocketTest extends WebsocketTest( NettyWSClientBuilder[IO].withIdleTimeout(5.seconds).withNioTransport.resource) { - test("send and receive frames in low-level mode".flaky) { + test("send and receive frames in low-level mode") { testLowLevel } } @@ -117,7 +117,7 @@ class JDKClientWebsocketTest testLowLevel } - test("group frames by their `last` attribute in high-level mode") { + test("group frames by their `last` attribute in high-level mode".flaky) { val uri = server() client() .connectHighLevel(WSRequest(uri)) From 639693412950170add9bd576eef5fcef43431c5c Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Sun, 8 Sep 2024 11:13:52 +0000 Subject: [PATCH 42/53] Update netty-codec-http, ... to 4.1.113.Final in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 64b120f7..a911c1b8 100644 --- a/build.sbt +++ b/build.sbt @@ -24,7 +24,7 @@ val http4sVersion = "0.23.27" val jetty = "12.0.12" -val netty = "4.1.112.Final" +val netty = "4.1.113.Final" val munit = "1.0.1" val munitScalaCheck = "1.0.0" From 056a09adcc2afb0f6d943c1cb9601b1c4b17cb9d Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Sun, 8 Sep 2024 11:13:59 +0000 Subject: [PATCH 43/53] Update jetty-client to 12.0.13 in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 64b120f7..39ede800 100644 --- a/build.sbt +++ b/build.sbt @@ -22,7 +22,7 @@ inThisBuild( val http4sVersion = "0.23.27" -val jetty = "12.0.12" +val jetty = "12.0.13" val netty = "4.1.112.Final" From 7286d512341c3280ef8100b32e3ec00bd7b1ebd7 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Sun, 8 Sep 2024 11:14:06 +0000 Subject: [PATCH 44/53] Update sbt-http4s-org to 0.17.3 in series/0.5 --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 008b79ea..f0c1820b 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1 +1 @@ -addSbtPlugin("org.http4s" % "sbt-http4s-org" % "0.17.2") +addSbtPlugin("org.http4s" % "sbt-http4s-org" % "0.17.3") From b564aefde64853fb01762e584ecc2f04fd7f30f5 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Sun, 8 Sep 2024 11:14:33 +0000 Subject: [PATCH 45/53] Run prePR with sbt-typelevel Executed command: sbt tlPrePrBotHook --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4f9c6bfc..2688a361 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -186,7 +186,7 @@ jobs: dependency-submission: name: Submit Dependencies - if: github.event_name != 'pull_request' + if: github.event.repository.fork == false && github.event_name != 'pull_request' strategy: matrix: os: [ubuntu-latest] From 248ac0dbf2bb986b3d6ceb13662f85598a3b1ebd Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Sun, 8 Sep 2024 11:14:36 +0000 Subject: [PATCH 46/53] Update scala-library to 2.12.20 in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 64b120f7..8e7bdf0d 100644 --- a/build.sbt +++ b/build.sbt @@ -1,6 +1,6 @@ import com.typesafe.tools.mima.core._ -val Scala212 = "2.12.19" +val Scala212 = "2.12.20" val Scala213 = "2.13.14" inThisBuild( From 9a92dab9a46bb7ed4d3be1383c8e55eb345700f2 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Tue, 10 Sep 2024 00:43:34 +0000 Subject: [PATCH 47/53] Update http4s-circe, http4s-client, ... to 0.23.28 in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 07aba6ce..46d3d703 100644 --- a/build.sbt +++ b/build.sbt @@ -20,7 +20,7 @@ inThisBuild( ) ) -val http4sVersion = "0.23.27" +val http4sVersion = "0.23.28" val jetty = "12.0.13" From dd7742ec1a8803ff4399cee449805eadc5b3df8f Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Fri, 13 Sep 2024 12:17:25 +0000 Subject: [PATCH 48/53] Update munit to 1.0.2 in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 46d3d703..653767c0 100644 --- a/build.sbt +++ b/build.sbt @@ -26,7 +26,7 @@ val jetty = "12.0.13" val netty = "4.1.113.Final" -val munit = "1.0.1" +val munit = "1.0.2" val munitScalaCheck = "1.0.0" val io_uring = "0.0.25.Final" From fdd6dee6397933a3049aeff82e102fb9cc48dae6 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 00:49:40 +0000 Subject: [PATCH 49/53] Update sbt to 1.10.2 in series/0.5 --- project/build.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/build.properties b/project/build.properties index ee4c672c..0b699c30 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.1 +sbt.version=1.10.2 From 2fb0dc78d486582387a1e8ec498b2818ecbc1ec7 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 16:11:39 +0000 Subject: [PATCH 50/53] Update java-socks-proxy-server to 4.1.1 in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 46d3d703..7a4cf391 100644 --- a/build.sbt +++ b/build.sbt @@ -115,7 +115,7 @@ lazy val client = project ("com.github.monkeywie" % "proxyee" % "1.7.6" % Test) .excludeAll("io.netty") .excludeAll("org.bouncycastle"), - "com.github.bbottema" % "java-socks-proxy-server" % "4.1.0" % Test, + "com.github.bbottema" % "java-socks-proxy-server" % "4.1.1" % Test, "org.scalameta" %% "munit" % munit % Test, "ch.qos.logback" % "logback-classic" % "1.2.13" % Test, "org.typelevel" %% "munit-cats-effect" % "2.0.0" % Test From 381f7d7117c25dbeafed6bb3a4aec9e0fdaf1b10 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Wed, 25 Sep 2024 20:17:53 +0000 Subject: [PATCH 51/53] Update scala-library to 2.13.15 in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 585011a1..5d41d9da 100644 --- a/build.sbt +++ b/build.sbt @@ -1,7 +1,7 @@ import com.typesafe.tools.mima.core._ val Scala212 = "2.12.20" -val Scala213 = "2.13.14" +val Scala213 = "2.13.15" inThisBuild( Seq( From 9fd13e54f9968002825c6de3dfddc56dfac59821 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 16:12:00 +0000 Subject: [PATCH 52/53] Update netty-codec-http, ... to 4.1.114.Final in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 5d41d9da..6d292237 100644 --- a/build.sbt +++ b/build.sbt @@ -24,7 +24,7 @@ val http4sVersion = "0.23.28" val jetty = "12.0.13" -val netty = "4.1.113.Final" +val netty = "4.1.114.Final" val munit = "1.0.2" val munitScalaCheck = "1.0.0" From e613d6d08abaa0a725ef0a27b650f192a45e6079 Mon Sep 17 00:00:00 2001 From: "http4s-steward[bot]" <106843772+http4s-steward[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 20:10:51 +0000 Subject: [PATCH 53/53] Update jetty-http2-client, ... to 12.0.14 in series/0.5 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 5d41d9da..9f2cd918 100644 --- a/build.sbt +++ b/build.sbt @@ -22,7 +22,7 @@ inThisBuild( val http4sVersion = "0.23.28" -val jetty = "12.0.13" +val jetty = "12.0.14" val netty = "4.1.113.Final"