Where communities thrive

  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
Repo info
  • 10:34
    Pask423 synchronize #1644
  • 10:34
    mergify[bot] commented #1644
  • 10:34

    Pask423 on akka-1.3.12

    Update shared:akka, shared:core… (compare)

  • 10:34

    mergify[bot] on tapir-style-ci


  • 10:34
    adamw commented #1644
  • 10:34

    adamw on master

    Changes in CI and build.sbt Fix typo Fix task name and 6 more (compare)

  • 10:34
    adamw closed #1631
  • 10:18
    Pask423 synchronize #1631
  • 10:18

    Pask423 on tapir-style-ci

    Fix compilation of 2_13 (compare)

  • 09:15
    Pask423 synchronize #1631
  • 09:15

    Pask423 on tapir-style-ci

    Removed separate flow for JS (compare)

  • 09:10

    mergify[bot] on http-version-change


  • 09:09
    adamw commented #1615
  • 09:09

    adamw on master

    Enable HTTP version changing fo… Add version setting for Finagle Fix review issues and 10 more (compare)

  • 09:09
    adamw closed #1615
  • Nov 26 01:06

    mergify[bot] on scalaz-concurrent-7.2.35


  • Nov 26 01:05

    mergify[bot] on master

    Update scalaz-concurrent to 7.2… Merge pull request #1647 from s… (compare)

  • Nov 26 01:05
    mergify[bot] closed #1647
  • Nov 26 00:25
    mergify[bot] labeled #1647
  • Nov 26 00:24
    softwaremill-ci opened #1647
Hi @adamw, I'm getting around to finally try out sttp3 and I'm having problem with migrating fromMetadata to the new signature. Can you provide an example for the new signature?
v2's signature is: def fromMetadata[T, S](f: ResponseMetadata => ResponseAs[T, S]): ResponseAs[T, S]
v3's is: def fromMetadata[T, R](default: ResponseAs[T, R], conditions: ConditionalResponseAs[T, R]*)
14 replies
Aleksandar Skrbic
    val request = basicRequest

    retry.Backoff(5, 1.second).apply(request.send())
4th line throws this error
java.lang.NoSuchMethodError: sttp.client.ResponseAs$.deserializeRightWithError(Lscala/Function1;)Lscala/Function1;
Does anyone know what could be a problem? I have implicit Decoder for AccessToken
I'm using AkkaHttpBackend
@adamw why tapir 0.17.0-M2 brings sttp3 with package name sttp.client3 when sync-http-client-backend-cats 3.0.0-RC3 uses sttp3 with package name sttp.client? How should I compose them? ;)
In the end I have such an error:
inferred type arguments [mypackage.AppEffect,sttp.client.SttpBackend[mypackage.AppEffect,Any]] do not conform to method fromEffect's type parameter bounds [F[_],I <: sttp.client3.SttpBackend[mypackage.AppEffect,Any]]
2 replies
Aleksandar Skrbic

java.lang.NoSuchMethodError: sttp.client.ResponseAs$.deserializeRightWithError(Lscala/Function1;)Lscala/Function1;

I've managed to solve this. I had different versions of sttp and sttp-akka-http backend so that was the problem :)

Glen Marchesani
so I am getting EventSource (aka server sent events) working in scala js and scala jvm. We had a bunch of weird issues where the scala js code worked but not as expected (things like EventStream in chrome wasn't populated). That Chrome symptom says that you are not using a polyfill and not EventSource directly. We are like but we are using EventSource. The end of the story is it turns out we were using our scala jvm based server sent events parser with sttp's monix fetch backed in the brower and it just worked...
1 reply
nobody noticed this for a long long time
Hello, im getting this weird compilation errors while moving from POM to SBT(sttp v. 1.7.2)
"No implicits found for parameter handler: SttpHandler[R_, Nothing]"
I have sync backend implicit in scope. Maybe i'm missing some compiler flag or something?
2 replies
Tobias Roeser
Hello, can anybody tell me where the * in class AkkaHttpBackend extends SttpBackend[Future, Source[ByteString, Any], Flow[Message, Message, *]] comes from?
6 replies
IJ IDEA can't
Denis Mikhaylov
Hi! Does anyone know any sttp benchmarks with backend comparison? Or maybe someone compared Java 11 HttpClient with Netty?
Glen Marchesani
is there something I need to do to cleanup resources on errors ? I have a sttp client request that is failing because the server isn't started after a little bit I get a java.io.IOException: Too many open files and at that point it never recovers
this is in an isolated use case so there is nothing else using up descriptors
the full stack trace is
17:58:15.191 | ERROR | scala-execution-context-global-14 | a8.hermes.ServerSentEventsFactory. | error with stream will restart @ Some(30)
java.lang.IllegalStateException: failed to create a child event loop
  at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:88)
  at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:58)
  at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:47)
  at io.netty.channel.MultithreadEventLoopGroup.<init>(MultithreadEventLoopGroup.java:59)
  at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:86)
  at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:81)
  at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:68)
  at org.asynchttpclient.netty.channel.NioTransportFactory.newEventLoopGroup(NioTransportFactory.java:32)
  at org.asynchttpclient.netty.channel.NioTransportFactory.newEventLoopGroup(NioTransportFactory.java:21)
  at org.asynchttpclient.netty.channel.ChannelManager.<init>(ChannelManager.java:133)
  at org.asynchttpclient.DefaultAsyncHttpClient.<init>(DefaultAsyncHttpClient.java:92)
  at sttp.client.asynchttpclient.AsyncHttpClientBackend$.defaultClient(AsyncHttpClientBackend.scala:380)
  at sttp.client.asynchttpclient.monix.AsyncHttpClientMonixBackend$.$anonfun$apply$1(AsyncHttpClientMonixBackend.scala:76)
  at monix.eval.internal.TaskRunLoop$.startLight(TaskRunLoop.scala:271)
  at monix.eval.Task.runAsyncOptF(Task.scala:812)
  at monix.eval.Task.runAsyncOpt(Task.scala:710)
  at monix.eval.Task.runAsync(Task.scala:660)
  at monix.reactive.internal.builders.TaskAsObservable.unsafeSubscribeFn(TaskAsObservable.scala:30)
  at monix.reactive.internal.operators.ConcatMapObservable.unsafeSubscribeFn(ConcatMapObservable.scala:76)
  at monix.reactive.internal.operators.OnErrorRecoverWithObservable.unsafeSubscribeFn(OnErrorRecoverWithObservable.scala:35)
  at monix.reactive.internal.operators.LiftByOperatorObservable.unsafeSubscribeFn(LiftByOperatorObservable.scala:30)
  at monix.reactive.observables.ChainedObservable$.$anonfun$subscribe$1(ChainedObservable.scala:74)
  at monix.execution.internal.Trampoline.monix$execution$internal$Trampoline$$immediateLoop(Trampoline.scala:66)
  at monix.execution.internal.Trampoline.startLoop(Trampoline.scala:32)
  at monix.execution.schedulers.TrampolineExecutionContext$JVMOptimalTrampoline.startLoop(TrampolineExecutionContext.scala:132)
  at monix.execution.internal.Trampoline.execute(Trampoline.scala:40)
  at monix.execution.schedulers.TrampolineExecutionContext.execute(TrampolineExecutionContext.scala:57)
  at monix.execution.schedulers.BatchingScheduler.execute(BatchingScheduler.scala:50)
  at monix.execution.schedulers.BatchingScheduler.execute$(BatchingScheduler.scala:47)
  at monix.execution.schedulers.AsyncScheduler.execute(AsyncScheduler.scala:31)
  at monix.execution.schedulers.ExecuteExtensions.executeTrampolined(ExecuteExtensions.scala:86)
  at monix.execution.schedulers.ExecuteExtensions.executeTrampolined$(ExecuteExtensions.scala:85)
  at monix.execution.Scheduler$Extensions.executeTrampolined(Scheduler.scala:305)
  at monix.reactive.observables.ChainedObservable$.subscribe(ChainedObservable.scala:69)
  at monix.reactive.internal.operators.ConcatObservable.unsafeSubscribeFn(ConcatObservable.scala:37)
  at monix.reactive.observables.ChainedObservable.unsafeSubscribeFn(ChainedObservable.scala:55)
  at monix.reactive.internal.operators.OnErrorRecoverWithObservable$$anon$1.$anonfun$onError$1(OnErrorRecoverWithObservable.scala:57)
  at monix.execution.Ack$$anon$1.run(Ack.scala:54)
  at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
  at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
  at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
  at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
  at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:172)
Caused by: io.netty.channel.ChannelException: failed to open a new selector
  at io.netty.channel.nio.NioEventLoop.openSelector(NioEventLoop.java:175)
  at io.netty.channel.nio.NioEventLoop.<init>(NioEventLoop.java:142)
  at io.netty.channel.nio.NioEventLoopGroup.newChild(NioEventLoopGroup.java:146)
  at io.netty.channel.nio.NioEventLoopGroup.newChild(NioEventLoopGroup.java:37)
  at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:84)
  ... 42 more
Caused by: java.io.IOException: Too many open files
  at sun.nio.ch.IOUtil.makePipe(Native Method)
  at sun.nio.ch.KQueueSelectorImpl.<init>(KQueueSelectorImpl.java:84)
  at sun.nio.ch.KQueueSelectorProvider.openSelector(KQueueSelectorProvider.java:42)
  at io.netty.channel.nio.NioEventLoop.openSelector(NioEventLoop.java:173)
  ... 46 more
any advice / direction is appreciated
Wojtek Pituła
hey, Im runnign sttp 1.x alongside sttp 2.x, both with prometheus backend and the clash with Collector already registered that provides name: sttp_request_latency_count. I know I can override those names, but maybe there is some other way?
1 reply
Glen Marchesani
So for my issue I added this (a memoize on the backend task which makes sense (I only need one backend AFAICT) --
val instance: Task[sttp.client.SttpBackend[Task, monix.reactive.Observable[java.nio.ByteBuffer], WebSocketHandler]] =
1 reply
Glen Marchesani
yeah that fixed it for me
Glen Marchesani
anyone recommend code for taking a
    val webSocketT: Task[WebSocket[Task]] = ...
12 replies
and getting a
      lazy val frames: Observable[WebSocketFrame.Incoming] =
using monix
here is what I have

      lazy val frames: Observable[WebSocketFrame.Incoming] = {
        Observable.unsafeCreate[WebSocketFrame.Incoming] { subscriber =>

          val cancelable = AssignableCancelable.multi()

          def feedOnNext(): Unit = {
            val receiveT: Task[(Either[WebSocketEvent.Close, WebSocketFrame.Incoming], WebSocket[Task])] =
                .flatMap { webSocket =>
                    .map(_ -> webSocket)
            cancelable :=
                .runAsync {
                  case Left(error) =>
                  case Right((Left(close), _)) =>
                    if ( logger.isTraceEnabled )
                      logger.trace(s"received close ${close}")
                  case Right((Right(frame), webSocket)) =>
                      .syncOnStopOrFailure {
                        case Some(th) =>
                          logger.error(s"error processing ${frame}", th)
                        case None =>
                          if ( logger.isTraceEnabled)
                            logger.trace(s"stop received closing WebSocket")

Glen Marchesani
any comments are appreciated
Glen Marchesani
okay here is something that doesn't do "unsafe" things
      lazy val frames: Observable[WebSocketFrame.Incoming] = {
        val receiveT: Task[(Either[WebSocketEvent.Close, WebSocketFrame.Incoming], WebSocket[Task])] =
            .flatMap { webSocket =>
                .map(_ -> webSocket)

        val receiveForObservableT: Task[(Either[WebSocketEvent.Close, WebSocketFrame.Incoming], Unit)] = receiveT.map(t => (t._1, ()))

        val observable: Observable[Either[WebSocketEvent.Close, WebSocketFrame.Incoming]] = Observable.fromAsyncStateAction[Unit,Either[WebSocketEvent.Close, WebSocketFrame.Incoming]](_ => receiveForObservableT)(())

          .collect {
            case Right(f) =>
6 replies
Mark Hammons
Hi, I'm having some weird behavior from sttp3 in some cases
when making a POST to (which is supposed to be an invalid ipv4 address), I get a ReadException while I expected sttp to give me a ConnectException.
furthermore, sttp waits until the timeout has been reached to send a ReadException
Mark Hammons
I'm using the sttp3 monix async http backend by the way
5 replies
Hi! I'm trying to integrate with an external API that only accepts form encoded request bodies (application/x-www-form-urlencoded). Do you have any recommendations on how to do this mapping from my case classes to such a body without having to manually create a Map[String, String] for each case class?
1 reply
Arun Gopalpuri
Is there an opentelemetry backend wrapper similar to opentracing wrapper? https://sttp.softwaremill.com/en/latest/backends/wrappers/opentracing.html
5 replies

Hello, I am trying client3 with zio (scala 2.13.3 and zio 1.0.3, sttp 3.0.0-RC5), following the example here https://sttp.softwaremill.com/en/latest/examples.html (GET and parse JSON using the ZIO async-http-client backend and circe), I get at runtime

[info]   Fiber failed.
[info]   An unchecked error was produced.
[info]   java.lang.Error: Defect in zio.Has: Set(SttpBackend[=λ %2:0 → ZIO[-Any,+Throwable,+2:0],+{ZioStreams & package::WebSockets}]) statically known to be contained within the environment are missing
[info]       at zio.Has$HasSyntax$.prune$extension(Has.scala:197)
[info]       at zio.Has$HasSyntax$.union$extension(Has.scala:209)
[info]       at zio.Has$Union$$anon$2.union(Has.scala:91)
[info]       at zio.Has$Union$$anon$2.union(Has.scala:89)

Anything I am missing ? when I am not using layer, and just directly the backend its working properly.

9 replies
Denis Mikhaylov
2 replies
Lorenzo Gabriele
Hi everyone :)
Are you interested in a upickle/ujson integration like the circe one? Can I submit a PR?
4 replies
hi. I would like to use okhttp backend with cats IO. Is it possible to transform SttpBackend[Future, Nothing, WebSocketHandler] to SttpBackend[IO, Nothing, WebSocketHandler] or separate backend should be created?
1 reply
Pavel Yurgin
I trying to implement sttp backend for prometeus metrics.
I want to report statusCode as one of the label for metric. But I noticed that if request fails with DeserializationError, all metadata of response (headers, status code and other) will be lost.
@adamw WDYT about adding optional ResponseMetadata to ResponseError ?
2 replies
Leszek Gruchała
Hi. I am using STTP with ZIO. It's a bit unclear to me if STTP calls should be wrapped with effectBlocking. I think not as otherwise Blocking would be simply required by sttp-zio integration. I guess STTP has it's own execution context, but maybe it's still good to tell ZIO this is a blocking operation?
12 replies
Vasily Shiyan
How do you ensure that streams close when using v3 asStreamUnsafe? Obviously this is backend/stream-specific, but some hints would help.
For example in proxy-ish scenario, using httpclient-backend-fs2, get IO[Stream[IO, T]] from sttp, add some in-flight transformations, stream results in http response via http4s. I think this scenario cannot be expressed with safe asStream.
2 replies
Anton Kulaga
I am having issues with sending requests to download files on FTP via syncronius backend, could you suggest what is the recommended way of downloading files?
2 replies
Hi - I'm trying to get a minimal working example of sttp3 (akka backend) + websocket + asWebSocketStreamAlways. The client is connecting but it's not sending or receiving anything. This is how I'm using it right now - what am I missing here ?
def webSocketFramePipe: Flow[WebSocketFrame.Data[_], WebSocketFrame, NotUsed] = Flow[WebSocketFrame.Data[_]].map{
    case o @ WebSocketFrame.Text(str, _, _) =>
      println(s"received string: $str")
    case other =>
      println(s"received other: $other")

val inputSrc: Source[ByteString, Any] = ... // ie Seq("test1", "test")

.onComplete(_ => backend.close())
5 replies
Binh Nguyen
Hi, anyone know if OpenAPI generator https://sttp.softwaremill.com/en/latest/openapi.html work with sttp 3.X? I tried the example repo https://github.com/softwaremill/sttp-openapi-example but looks like it only work with sttp 2.X
1 reply
Bruno Campos

HI… I am trying to use PrometheusBackend with Cats backend but it looks like it is not supported. It works fine with Monix backend.

AsyncHttpClientMonixBackend().map(backend => PrometheusBackend(backend)) // OK

AsyncHttpClientCatsBackend[cats.effect.IO]().map(backend => PrometheusBackend(backend)) 

       error: type mismatch;
        found   : sttp.client.SttpBackend[cats.effect.IO,Nothing,sttp.client.asynchttpclient.WebSocketHandler]
        required: sttp.client.SttpBackend[[+A]cats.effect.IO[A],S,[WS_RESULT]sttp.client.asynchttpclient.WebSocketHandler[WS_RESULT]]
       Error occurred in an application involving default arguments.
sttp.client.SttpBackend[cats.effect.IO,Nothing,sttp.client.asynchttpclient.WebSocketHandler] <: sttp.client.SttpBackend[[+A]cats.effect.IO[A],S,[WS_RESULT]sttp.client.asynchttpclient.WebSocketHandler[WS_RESULT]]?

Am I missing something?

Looks fine. Try to specify the type explicitly, so PrometheusBackend[IO, Nothing, sttp.client.asynchttpclient.WebSocketHandler]