diff --git a/README.md b/README.md index 1cabf68dd0..06764aa8bc 100755 --- a/README.md +++ b/README.md @@ -45,14 +45,14 @@ sttp (v2) documentation is available at [sttp.softwaremill.com/en/v2](http://stt sttp (v1) documentation is available at [sttp.softwaremill.com/en/v1](https://sttp.softwaremill.com/en/v1). -scaladoc is available at [https://www.javadoc.io](https://www.javadoc.io/doc/com.softwaremill.sttp.client3/core_2.12/3.3.14) +scaladoc is available at [https://www.javadoc.io](https://www.javadoc.io/doc/com.softwaremill.sttp.client3/core_2.12/3.3.15) ## Quickstart with Ammonite If you are an [Ammonite](http://ammonite.io) user, you can quickly start experimenting with sttp by copy-pasting the following: ```scala -import $ivy.`com.softwaremill.sttp.client3::core:3.3.14` +import $ivy.`com.softwaremill.sttp.client3::core:3.3.15` import sttp.client3.quick._ quickRequest.get(uri"http://httpbin.org/ip").send(backend) ``` @@ -64,7 +64,7 @@ This brings in the sttp API and a synchronous backend instance. Add the following dependency: ```scala -"com.softwaremill.sttp.client3" %% "core" % "3.3.14" +"com.softwaremill.sttp.client3" %% "core" % "3.3.15" ``` Then, import: @@ -98,7 +98,7 @@ The documentation is typechecked using [mdoc](https://scalameta.org/mdoc/). The When generating documentation, it's best to set the version to the current one, so that the generated doc files don't include modifications with the current snapshot version. -That is, in sbt run: `set version := "3.3.14"`, before running `mdoc` in `docs`. +That is, in sbt run: `set version := "3.3.15"`, before running `mdoc` in `docs`. ### Testing the Scala.JS backend diff --git a/generated-docs/out/backends/akka.md b/generated-docs/out/backends/akka.md index ad6942282d..54e5ebf71d 100644 --- a/generated-docs/out/backends/akka.md +++ b/generated-docs/out/backends/akka.md @@ -3,7 +3,7 @@ This backend is based on [akka-http](http://doc.akka.io/docs/akka-http/current/scala/http/). To use, add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %% "akka-http-backend" % "3.3.14" +"com.softwaremill.sttp.client3" %% "akka-http-backend" % "3.3.15" ``` A fully **asynchronous** backend. Uses the `Future` effect to return responses. There are also [other `Future`-based backends](future.md), which don't depend on Akka. diff --git a/generated-docs/out/backends/catseffect.md b/generated-docs/out/backends/catseffect.md index 9de0f705d6..a496177589 100644 --- a/generated-docs/out/backends/catseffect.md +++ b/generated-docs/out/backends/catseffect.md @@ -7,9 +7,9 @@ The [Cats Effect](https://github.com/typelevel/cats-effect) backend is **asynchr To use, add the following dependency to your project: ```scala -"com.softwaremill.sttp.client3" %% "async-http-client-backend-cats" % "3.3.14" // for cats-effect 3.x +"com.softwaremill.sttp.client3" %% "async-http-client-backend-cats" % "3.3.15" // for cats-effect 3.x // or -"com.softwaremill.sttp.client3" %% "async-http-client-backend-cats-ce2" % "3.3.14" // for cats-effect 2.x +"com.softwaremill.sttp.client3" %% "async-http-client-backend-cats-ce2" % "3.3.15" // for cats-effect 2.x ``` This backend depends on [async-http-client](https://github.com/AsyncHttpClient/async-http-client), uses [Netty](http://netty.io) behind the scenes. @@ -81,9 +81,9 @@ val backend = AsyncHttpClientCatsBackend.usingClient[IO](asyncHttpClient) To use, add the following dependency to your project: ```scala -"com.softwaremill.sttp.client3" %% "armeria-backend-cats" % "3.3.14" // for cats-effect 3.x +"com.softwaremill.sttp.client3" %% "armeria-backend-cats" % "3.3.15" // for cats-effect 3.x // or -"com.softwaremill.sttp.client3" %% "armeria-backend-cats-ce2" % "3.3.14" // for cats-effect 2.x +"com.softwaremill.sttp.client3" %% "armeria-backend-cats-ce2" % "3.3.15" // for cats-effect 2.x ``` create client: diff --git a/generated-docs/out/backends/finagle.md b/generated-docs/out/backends/finagle.md index f742a3c222..6f82104486 100644 --- a/generated-docs/out/backends/finagle.md +++ b/generated-docs/out/backends/finagle.md @@ -3,7 +3,7 @@ To use, add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %% "finagle-backend" % "3.3.14" +"com.softwaremill.sttp.client3" %% "finagle-backend" % "3.3.15" ``` Next you'll need to add an implicit value: diff --git a/generated-docs/out/backends/fs2.md b/generated-docs/out/backends/fs2.md index c24175a0f0..e267a5f80b 100644 --- a/generated-docs/out/backends/fs2.md +++ b/generated-docs/out/backends/fs2.md @@ -7,9 +7,9 @@ The [fs2](https://github.com/functional-streams-for-scala/fs2) backend is **asyn To use, add the following dependency to your project: ```scala -"com.softwaremill.sttp.client3" %% "async-http-client-backend-fs2" % "3.3.14" // for cats-effect 3.x & fs2 3.x +"com.softwaremill.sttp.client3" %% "async-http-client-backend-fs2" % "3.3.15" // for cats-effect 3.x & fs2 3.x // or -"com.softwaremill.sttp.client3" %% "async-http-client-backend-fs2-ce2" % "3.3.14" // for cats-effect 2.x & fs2 2.x +"com.softwaremill.sttp.client3" %% "async-http-client-backend-fs2-ce2" % "3.3.15" // for cats-effect 2.x & fs2 2.x ``` This backend depends on [async-http-client](https://github.com/AsyncHttpClient/async-http-client) and uses [Netty](http://netty.io) behind the scenes. @@ -88,9 +88,9 @@ val backend = AsyncHttpClientFs2Backend.usingClient[IO](asyncHttpClient, dispatc To use, add the following dependency to your project: ```scala -"com.softwaremill.sttp.client3" %% "httpclient-backend-fs2" % "3.3.14" // for cats-effect 3.x & fs2 3.x +"com.softwaremill.sttp.client3" %% "httpclient-backend-fs2" % "3.3.15" // for cats-effect 3.x & fs2 3.x // or -"com.softwaremill.sttp.client3" %% "httpclient-backend-fs2-ce2" % "3.3.14" // for cats-effect 2.x & fs2 2.x +"com.softwaremill.sttp.client3" %% "httpclient-backend-fs2-ce2" % "3.3.15" // for cats-effect 2.x & fs2 2.x ``` Create the backend using a cats-effect `Resource`: @@ -140,9 +140,9 @@ jdk.httpclient.allowRestrictedHeaders=host To use, add the following dependency to your project: ```scala -"com.softwaremill.sttp.client3" %% "armeria-backend-fs2" % "3.3.14" // for cats-effect 3.x & fs2 3.x +"com.softwaremill.sttp.client3" %% "armeria-backend-fs2" % "3.3.15" // for cats-effect 3.x & fs2 3.x // or -"com.softwaremill.sttp.client3" %% "armeria-backend-fs2" % "3.3.14" // for cats-effect 2.x & fs2 2.x +"com.softwaremill.sttp.client3" %% "armeria-backend-fs2" % "3.3.15" // for cats-effect 2.x & fs2 2.x ``` create client: diff --git a/generated-docs/out/backends/future.md b/generated-docs/out/backends/future.md index a47314c0a6..38d95cb57c 100644 --- a/generated-docs/out/backends/future.md +++ b/generated-docs/out/backends/future.md @@ -21,7 +21,7 @@ Class Supported stream type To use, add the following dependency to your project: ```scala -"com.softwaremill.sttp.client3" %% "async-http-client-backend-future" % "3.3.14" +"com.softwaremill.sttp.client3" %% "async-http-client-backend-future" % "3.3.15" ``` And some imports: @@ -72,7 +72,7 @@ val backend = AsyncHttpClientFutureBackend.usingClient(asyncHttpClient) To use, add the following dependency to your project: ```scala -"com.softwaremill.sttp.client3" %% "okhttp-backend" % "3.3.14" +"com.softwaremill.sttp.client3" %% "okhttp-backend" % "3.3.15" ``` and some imports: @@ -104,7 +104,7 @@ This backend depends on [OkHttp](http://square.github.io/okhttp/) and fully supp To use, add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %% "httpclient-backend" % "3.3.14" +"com.softwaremill.sttp.client3" %% "httpclient-backend" % "3.3.15" ``` and some imports: @@ -141,7 +141,7 @@ jdk.httpclient.allowRestrictedHeaders=host To use, add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %% "armeria-backend-future" % "3.3.14" +"com.softwaremill.sttp.client3" %% "armeria-backend-future" % "3.3.15" ``` add imports: diff --git a/generated-docs/out/backends/http4s.md b/generated-docs/out/backends/http4s.md index c40fa40f60..221b351409 100644 --- a/generated-docs/out/backends/http4s.md +++ b/generated-docs/out/backends/http4s.md @@ -3,9 +3,9 @@ This backend is based on [http4s](https://http4s.org) (client) and is **asynchronous**. To use, add the following dependency to your project: ```scala -"com.softwaremill.sttp.client3" %% "http4s-backend" % "3.3.14" // for cats-effect 3.x & http4s 1.0.0-Mx +"com.softwaremill.sttp.client3" %% "http4s-backend" % "3.3.15" // for cats-effect 3.x & http4s 1.0.0-Mx // or -"com.softwaremill.sttp.client3" %% "http4s-ce2-backend" % "3.3.14" // for cats-effect 2.x & http4s 0.21.x +"com.softwaremill.sttp.client3" %% "http4s-ce2-backend" % "3.3.15" // for cats-effect 2.x & http4s 0.21.x ``` The backend can be created in a couple of ways, e.g.: diff --git a/generated-docs/out/backends/javascript/fetch.md b/generated-docs/out/backends/javascript/fetch.md index 1d4946f20f..f03070f641 100644 --- a/generated-docs/out/backends/javascript/fetch.md +++ b/generated-docs/out/backends/javascript/fetch.md @@ -7,7 +7,7 @@ A JavaScript backend with web socket support. Implemented using the [Fetch API]( This is the default backend, available in the main jar for JS. To use, add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %%% "core" % "3.3.14" +"com.softwaremill.sttp.client3" %%% "core" % "3.3.15" ``` And create the backend instance: @@ -26,7 +26,7 @@ Note that `Fetch` does not pass cookies by default. If your request needs cookie To use, add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %%% "monix" % "3.3.14" +"com.softwaremill.sttp.client3" %%% "monix" % "3.3.15" ``` And create the backend instance: @@ -41,7 +41,7 @@ Any effect implementing the cats-effect `Concurrent` typeclass can be used. To u your project: ``` -"com.softwaremill.sttp.client3" %%% "cats" % "3.3.14" +"com.softwaremill.sttp.client3" %%% "cats" % "3.3.15" ``` And create the backend instance: @@ -80,7 +80,7 @@ Streaming support is provided via `FetchMonixBackend`. Note that streaming suppo To use, add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %%% "monix" % "3.3.14" +"com.softwaremill.sttp.client3" %%% "monix" % "3.3.15" ``` An example of streaming a response: diff --git a/generated-docs/out/backends/monix.md b/generated-docs/out/backends/monix.md index d6566c70c6..b8a0f5081e 100644 --- a/generated-docs/out/backends/monix.md +++ b/generated-docs/out/backends/monix.md @@ -7,7 +7,7 @@ There are several backend implementations which are `monix.eval.Task`-based. The To use, add the following dependency to your project: ```scala -"com.softwaremill.sttp.client3" %% "async-http-client-backend-monix" % "3.3.14" +"com.softwaremill.sttp.client3" %% "async-http-client-backend-monix" % "3.3.15" ``` This backend depends on [async-http-client](https://github.com/AsyncHttpClient/async-http-client), uses [Netty](http://netty.io) behind the scenes. @@ -50,7 +50,7 @@ val backend = AsyncHttpClientMonixBackend.usingClient(asyncHttpClient) To use, add the following dependency to your project: ```scala -"com.softwaremill.sttp.client3" %% "okhttp-backend-monix" % "3.3.14" +"com.softwaremill.sttp.client3" %% "okhttp-backend-monix" % "3.3.15" ``` Create the backend using: @@ -76,7 +76,7 @@ This backend depends on [OkHttp](http://square.github.io/okhttp/) and fully supp To use, add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %% "httpclient-backend-monix" % "3.3.14" +"com.softwaremill.sttp.client3" %% "httpclient-backend-monix" % "3.3.15" ``` Create the backend using: @@ -107,7 +107,7 @@ jdk.httpclient.allowRestrictedHeaders=host To use, add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %% "armeria-backend-monix" % "3.3.14" +"com.softwaremill.sttp.client3" %% "armeria-backend-monix" % "3.3.15" ``` add imports: diff --git a/generated-docs/out/backends/native/curl.md b/generated-docs/out/backends/native/curl.md index 852e3347a8..8e2b8d58d9 100644 --- a/generated-docs/out/backends/native/curl.md +++ b/generated-docs/out/backends/native/curl.md @@ -5,7 +5,7 @@ A Scala Native backend implemented using [Curl](https://github.com/curl/curl/blo To use, add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %%% "core" % "3.3.14" +"com.softwaremill.sttp.client3" %%% "core" % "3.3.15" ``` and initialize one of the backends: diff --git a/generated-docs/out/backends/scalaz.md b/generated-docs/out/backends/scalaz.md index ce6752f422..8a96cd8127 100644 --- a/generated-docs/out/backends/scalaz.md +++ b/generated-docs/out/backends/scalaz.md @@ -7,7 +7,7 @@ The [Scalaz](https://github.com/scalaz/scalaz) backend is **asynchronous**. Send To use, add the following dependency to your project: ```scala -"com.softwaremill.sttp.client3" %% "async-http-client-backend-scalaz" % "3.3.14" +"com.softwaremill.sttp.client3" %% "async-http-client-backend-scalaz" % "3.3.15" ``` This backend depends on [async-http-client](https://github.com/AsyncHttpClient/async-http-client) and uses [Netty](http://netty.io) behind the scenes. @@ -45,7 +45,7 @@ val backend = AsyncHttpClientScalazBackend.usingClient(asyncHttpClient) To use, add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %% "armeria-backend-scalaz" % "3.3.14" +"com.softwaremill.sttp.client3" %% "armeria-backend-scalaz" % "3.3.15" ``` add imports: diff --git a/generated-docs/out/backends/synchronous.md b/generated-docs/out/backends/synchronous.md index 6d8a72b629..0fccd96535 100644 --- a/generated-docs/out/backends/synchronous.md +++ b/generated-docs/out/backends/synchronous.md @@ -25,7 +25,7 @@ sun.net.http.allowRestrictedHeaders=true To use, add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %% "okhttp-backend" % "3.3.14" +"com.softwaremill.sttp.client3" %% "okhttp-backend" % "3.3.15" ``` Create the backend using: @@ -53,7 +53,7 @@ This backend depends on [OkHttp](http://square.github.io/okhttp/) and fully supp To use, add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %% "httpclient-backend" % "3.3.14" +"com.softwaremill.sttp.client3" %% "httpclient-backend" % "3.3.15" ``` Create the backend using: diff --git a/generated-docs/out/backends/wrappers/custom.md b/generated-docs/out/backends/wrappers/custom.md index cdab76c43d..5904d131cc 100644 --- a/generated-docs/out/backends/wrappers/custom.md +++ b/generated-docs/out/backends/wrappers/custom.md @@ -28,35 +28,7 @@ A side-effecting request listener, of type `RequestListener[Identity, L]`, can b ## Backend wrappers and redirects -By default redirects are handled at a low level, using a wrapper around the main, concrete backend: each of the backend factory methods, e.g. `HttpURLConnectionBackend()` returns a backend wrapped in `FollowRedirectsBackend`. - -This causes any further backend wrappers to handle a request which involves redirects as one whole, without the intermediate requests. However, wrappers which collects metrics, implements tracing or handles request retries might want to handle every request in the redirect chain. This can be achieved by layering another `FollowRedirectsBackend` on top of the wrapper. Only the top-level follow redirects backend will handle redirects, other follow redirect wrappers (at lower levels) will be disabled. - -For example: - -```scala -import sttp.capabilities.Effect -import sttp.client3._ -import sttp.monad.MonadError - -class MyWrapper[F[_], P] private (delegate: SttpBackend[F, P]) - extends SttpBackend[F, P] { - - def send[T, R >: P with Effect[F]](request: Request[T, R]): F[Response[T]] = ??? - - def close(): F[Unit] = ??? - - def responseMonad: MonadError[F] = ??? -} - -object MyWrapper { - def apply[F[_], P]( - delegate: SttpBackend[F, P]): SttpBackend[F, P] = { - // disables any other FollowRedirectsBackend-s further down the delegate chain - new FollowRedirectsBackend(new MyWrapper(delegate)) - } -} -``` +See the appropriate section in docs on [redirects](../../conf/redirects.md). ## Logging backend wrapper @@ -266,7 +238,7 @@ object RateLimitingSttpBackend { Implementing a new backend is made easy as the tests are published in the `core` jar file under the `tests` classifier. Simply add the follow dependencies to your `build.sbt`: ``` -"com.softwaremill.sttp.client3" %% "core" % "3.3.14" % Test classifier "tests" +"com.softwaremill.sttp.client3" %% "core" % "3.3.15" % Test classifier "tests" ``` Implement your backend and extend the `HttpTest` class: diff --git a/generated-docs/out/backends/wrappers/logging.md b/generated-docs/out/backends/wrappers/logging.md index cb53e0668e..d747b0a609 100644 --- a/generated-docs/out/backends/wrappers/logging.md +++ b/generated-docs/out/backends/wrappers/logging.md @@ -28,7 +28,7 @@ Log levels can be configured when creating the `LoggingBackend`, or specified in To use the [slf4j](http://www.slf4j.org) logging backend wrapper, add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %% "slf4j-backend" % "3.3.14" +"com.softwaremill.sttp.client3" %% "slf4j-backend" % "3.3.15" ``` There are three backend wrappers available, which log request & response information using a slf4j `Logger`. To see the logs, you'll need to use an slf4j-compatible logger implementation, e.g. [logback](http://logback.qos.ch), or use a binding, e.g. [log4j-slf4j](https://logging.apache.org/log4j/2.0/log4j-slf4j-impl/index.html). @@ -50,5 +50,5 @@ To create a customised logging backend, see the section on [custom backends](cus To use the [scribe](https://github.com/outr/scribe) logging backend wrapper, add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %% "scribe-backend" % "3.3.14" +"com.softwaremill.sttp.client3" %% "scribe-backend" % "3.3.15" ``` \ No newline at end of file diff --git a/generated-docs/out/backends/wrappers/opentracing.md b/generated-docs/out/backends/wrappers/opentracing.md index 2eb7433582..5e401390d8 100644 --- a/generated-docs/out/backends/wrappers/opentracing.md +++ b/generated-docs/out/backends/wrappers/opentracing.md @@ -3,7 +3,7 @@ To use, add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %% "opentracing-backend" % "3.3.14" +"com.softwaremill.sttp.client3" %% "opentracing-backend" % "3.3.15" ``` This backend depends on [opentracing](https://github.com/opentracing/opentracing-java), a standardized set of api for distributed tracing. diff --git a/generated-docs/out/backends/wrappers/prometheus.md b/generated-docs/out/backends/wrappers/prometheus.md index 3afd118bf8..651e6f0147 100644 --- a/generated-docs/out/backends/wrappers/prometheus.md +++ b/generated-docs/out/backends/wrappers/prometheus.md @@ -3,7 +3,7 @@ To use, add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %% "prometheus-backend" % "3.3.14" +"com.softwaremill.sttp.client3" %% "prometheus-backend" % "3.3.15" ``` and some imports: diff --git a/generated-docs/out/backends/wrappers/zio-opentelemetry.md b/generated-docs/out/backends/wrappers/zio-opentelemetry.md index a6510cb23c..c7a891f3e1 100644 --- a/generated-docs/out/backends/wrappers/zio-opentelemetry.md +++ b/generated-docs/out/backends/wrappers/zio-opentelemetry.md @@ -3,7 +3,7 @@ To use, add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %% "zio-telemetry-opentelemetry-backend" % "3.3.14" +"com.softwaremill.sttp.client3" %% "zio-telemetry-opentelemetry-backend" % "3.3.15" ``` This backend depends on [zio-opentelemetry](https://github.com/zio/zio-telemetry). @@ -20,9 +20,8 @@ ZioTelemetryOpenTelemetryBackend( ) ``` -Additionally you can add tags per request by supplying a `ZioTelemetryOpenTelemetryTracer` -(by default, all that happens is that the span for the request is named after using the HTTP method -and path). +By default, the span is named after the HTTP method (e.g "HTTP POST") as [recommended by OpenTelemetry](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/http.md#name) for HTTP clients. +You can override the default span name or add additional tags per request by supplying a `ZioTelemetryOpenTelemetryTracer`. ```scala import io.opentelemetry.semconv.trace.attributes.SemanticAttributes @@ -35,6 +34,8 @@ val zioBackend: SttpBackend[Task, Any] = ??? val tracing: Tracing.Service = ??? def sttpTracer: ZioTelemetryOpenTelemetryTracer = new ZioTelemetryOpenTelemetryTracer { + override def spanName[T](request: Request[T, Nothing]): String = ??? + def before[T](request: Request[T, Nothing]): RIO[Tracing, Unit] = Tracing.setAttribute(SemanticAttributes.HTTP_METHOD.getKey, request.method.method) *> Tracing.setAttribute(SemanticAttributes.HTTP_URL.getKey, request.uri.toString()) *> diff --git a/generated-docs/out/backends/wrappers/zio-opentracing.md b/generated-docs/out/backends/wrappers/zio-opentracing.md index c519db961d..9d0b65bcf5 100644 --- a/generated-docs/out/backends/wrappers/zio-opentracing.md +++ b/generated-docs/out/backends/wrappers/zio-opentracing.md @@ -3,7 +3,7 @@ To use, add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %% "zio-telemetry-opentracing-backend" % "3.3.14" +"com.softwaremill.sttp.client3" %% "zio-telemetry-opentracing-backend" % "3.3.15" ``` This backend depends on [zio-opentracing](https://github.com/zio/zio-telemetry). diff --git a/generated-docs/out/backends/zio.md b/generated-docs/out/backends/zio.md index 18e476bb21..a764613b81 100644 --- a/generated-docs/out/backends/zio.md +++ b/generated-docs/out/backends/zio.md @@ -7,7 +7,7 @@ The [ZIO](https://github.com/zio/zio) backends are **asynchronous**. Sending a r To use, add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %% "httpclient-backend-zio" % "3.3.14" +"com.softwaremill.sttp.client3" %% "httpclient-backend-zio" % "3.3.15" ``` Create the backend using: @@ -38,7 +38,7 @@ jdk.httpclient.allowRestrictedHeaders=host To use, add the following dependency to your project: ```scala -"com.softwaremill.sttp.client3" %% "async-http-client-backend-zio" % "3.3.14" +"com.softwaremill.sttp.client3" %% "async-http-client-backend-zio" % "3.3.15" ``` This backend depends on [async-http-client](https://github.com/AsyncHttpClient/async-http-client), uses [Netty](http://netty.io) behind the scenes. This backend works with all Scala versions. A Scala 3 build is available as well. @@ -84,7 +84,7 @@ val backend = AsyncHttpClientZioBackend.usingClient(runtime, asyncHttpClient) To use, add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %% "armeria-backend-zio" % "3.3.14" +"com.softwaremill.sttp.client3" %% "armeria-backend-zio" % "3.3.15" ``` add imports: diff --git a/generated-docs/out/conf/redirects.md b/generated-docs/out/conf/redirects.md index 87fd0cfcaf..e75fe774ff 100644 --- a/generated-docs/out/conf/redirects.md +++ b/generated-docs/out/conf/redirects.md @@ -54,3 +54,39 @@ val backend: SttpBackend[Identity, Any] = new FollowRedirectsBackend( sensitiveHeaders = HeaderNames.SensitiveHeaders.filterNot(_ == HeaderNames.Authorization.toLowerCase) ) ``` + +## Backend wrappers and redirects + +By default redirects are handled at a low level, using a wrapper around the main, concrete backend: each of the backend factory methods, e.g. `HttpURLConnectionBackend()` returns a backend wrapped in `FollowRedirectsBackend`. + +This causes any further backend wrappers to handle a request which involves redirects as one whole, without the intermediate requests. However, wrappers which collects metrics, implements tracing or handles request retries might want to handle every request in the redirect chain. This can be achieved by layering another `FollowRedirectsBackend` on top of the wrapper. Only the top-level follow redirects backend will handle redirects, other follow redirect wrappers (at lower levels) will be disabled. + +For example: + +```scala +import sttp.capabilities.Effect +import sttp.client3._ +import sttp.monad.MonadError + +class MyWrapper[F[_], P] private (delegate: SttpBackend[F, P]) + extends SttpBackend[F, P] { + + def send[T, R >: P with Effect[F]](request: Request[T, R]): F[Response[T]] = ??? + + def close(): F[Unit] = ??? + + def responseMonad: MonadError[F] = ??? +} + +object MyWrapper { + def apply[F[_], P]( + delegate: SttpBackend[F, P]): SttpBackend[F, P] = { + // disables any other FollowRedirectsBackend-s further down the delegate chain + new FollowRedirectsBackend(new MyWrapper(delegate)) + } +} +``` + +### Custom URI encoding + +Whenever a redirect request is about to be created, the `FollowRedirectsBackend` uses the value provided in the `Location` header. In its simplest form, a call to `uri"$location"` is being made in order to construct these `Uri`s. The `FollowRedirectsBackend` allows modification of such `Uri` by providing a custom `transformUri: Uri => Uri` function. This might be useful if, for example, some parts of the `Uri` had been initially encoded in a more strict or lenient way. \ No newline at end of file diff --git a/generated-docs/out/examples.md b/generated-docs/out/examples.md index 494925dc9f..652cdf05fa 100644 --- a/generated-docs/out/examples.md +++ b/generated-docs/out/examples.md @@ -7,7 +7,7 @@ All of the examples are available [in the sources](https://github.com/softwaremi Required dependencies: ```scala -libraryDependencies ++= List("com.softwaremill.sttp.client3" %% "core" % "3.3.14") +libraryDependencies ++= List("com.softwaremill.sttp.client3" %% "core" % "3.3.15") ``` Example code: @@ -23,8 +23,8 @@ Required dependencies: ```scala libraryDependencies ++= List( - "com.softwaremill.sttp.client3" %% "akka-http-backend" % "3.3.14", - "com.softwaremill.sttp.client3" %% "json4s" % "3.3.14", + "com.softwaremill.sttp.client3" %% "akka-http-backend" % "3.3.15", + "com.softwaremill.sttp.client3" %% "json4s" % "3.3.15", "org.json4s" %% "json4s-native" % "3.6.0" ) ``` @@ -42,8 +42,8 @@ Required dependencies: ```scala libraryDependencies ++= List( - "com.softwaremill.sttp.client3" %% "async-http-client-backend-zio" % "3.3.14", - "com.softwaremill.sttp.client3" %% "circe" % "3.3.14", + "com.softwaremill.sttp.client3" %% "async-http-client-backend-zio" % "3.3.15", + "com.softwaremill.sttp.client3" %% "circe" % "3.3.15", "io.circe" %% "circe-generic" % "0.14.1" ) ``` @@ -61,8 +61,8 @@ Required dependencies: ```scala libraryDependencies ++= List( - "com.softwaremill.sttp.client3" %% "async-http-client-backend-monix" % "3.3.14", - "com.softwaremill.sttp.client3" %% "circe" % "3.3.14", + "com.softwaremill.sttp.client3" %% "async-http-client-backend-monix" % "3.3.15", + "com.softwaremill.sttp.client3" %% "circe" % "3.3.15", "io.circe" %% "circe-generic" % "0.14.1" ) ``` @@ -80,8 +80,8 @@ Required dependencies: ```scala libraryDependencies ++= List( - "com.softwaremill.sttp.client3" %% "slf4j-backend" % "3.3.14", - "com.softwaremill.sttp.client3" %% "circe" % "3.3.14", + "com.softwaremill.sttp.client3" %% "slf4j-backend" % "3.3.15", + "com.softwaremill.sttp.client3" %% "circe" % "3.3.15", "io.circe" %% "circe-generic" % "0.14.1" ) ``` @@ -99,8 +99,8 @@ Required dependencies: ```scala libraryDependencies ++= List( - "com.softwaremill.sttp.client3" %% "async-http-client-backend-monix" % "3.3.14", - "com.softwaremill.sttp.client3" %% "circe" % "3.3.14", + "com.softwaremill.sttp.client3" %% "async-http-client-backend-monix" % "3.3.15", + "com.softwaremill.sttp.client3" %% "circe" % "3.3.15", "io.circe" %% "circe-generic" % "0.14.1" ) ``` @@ -117,7 +117,7 @@ Example code: Required dependencies: ```scala -libraryDependencies ++= List("com.softwaremill.sttp.client3" %% "core" % "3.3.14") +libraryDependencies ++= List("com.softwaremill.sttp.client3" %% "core" % "3.3.15") ``` Example code: @@ -132,7 +132,7 @@ Example code: Required dependencies: ```scala -libraryDependencies ++= List("com.softwaremill.sttp.client3" %% "async-http-client-backend-zio" % "3.3.14") +libraryDependencies ++= List("com.softwaremill.sttp.client3" %% "async-http-client-backend-zio" % "3.3.15") ``` Example code: @@ -147,7 +147,7 @@ Example code: Required dependencies: ```scala -libraryDependencies ++= List("com.softwaremill.sttp.client3" %% "async-http-client-backend-fs2 % "3.3.14") +libraryDependencies ++= List("com.softwaremill.sttp.client3" %% "async-http-client-backend-fs2 % "3.3.15") ``` Example code: @@ -162,7 +162,7 @@ Example code: Required dependencies: ```scala -libraryDependencies ++= List("com.softwaremill.sttp.client3" %% "async-http-client-backend-monix" % "3.3.14") +libraryDependencies ++= List("com.softwaremill.sttp.client3" %% "async-http-client-backend-monix" % "3.3.15") ``` Example code: @@ -177,7 +177,7 @@ Example code: Required dependencies: ```scala -libraryDependencies ++= List("com.softwaremill.sttp.client3" %% "akka-http-backend" % "3.3.14") +libraryDependencies ++= List("com.softwaremill.sttp.client3" %% "akka-http-backend" % "3.3.15") ``` Example code: @@ -192,7 +192,7 @@ Example code: Required dependencies: ```scala -libraryDependencies ++= List("com.softwaremill.sttp.client3" %% "async-http-client-backend-monix" % "3.3.14") +libraryDependencies ++= List("com.softwaremill.sttp.client3" %% "async-http-client-backend-monix" % "3.3.15") ``` Example code: @@ -207,7 +207,7 @@ Example code: Required dependencies: ```scala -libraryDependencies ++= List("com.softwaremill.sttp.client3" %% "async-http-client-backend-fs2" % "3.3.14") +libraryDependencies ++= List("com.softwaremill.sttp.client3" %% "async-http-client-backend-fs2" % "3.3.15") ``` Example code: @@ -222,7 +222,7 @@ Example code: Required dependencies: ```scala -libraryDependencies ++= List("com.softwaremill.sttp.client3" %% "async-http-client-backend-zio" % "3.3.14") +libraryDependencies ++= List("com.softwaremill.sttp.client3" %% "async-http-client-backend-zio" % "3.3.15") ``` Example code: @@ -237,7 +237,7 @@ Example code: Required dependencies: ```scala -libraryDependencies ++= List("com.softwaremill.sttp.client3" %% "async-http-client-backend-zio" % "3.3.14") +libraryDependencies ++= List("com.softwaremill.sttp.client3" %% "async-http-client-backend-zio" % "3.3.15") ``` Example code: @@ -252,7 +252,7 @@ Example code: Required dependencies: ```scala -libraryDependencies ++= List("com.softwaremill.sttp.client3" %% "core" % "3.3.14") +libraryDependencies ++= List("com.softwaremill.sttp.client3" %% "core" % "3.3.15") ``` Example code: diff --git a/generated-docs/out/json.md b/generated-docs/out/json.md index ec7f076835..f55d5cecf8 100644 --- a/generated-docs/out/json.md +++ b/generated-docs/out/json.md @@ -34,7 +34,7 @@ case class ResponsePayload(data: String) JSON encoding of bodies and decoding of responses can be handled using [Circe](https://circe.github.io/circe/) by the `circe` module. To use add the following dependency to your project: ```scala -"com.softwaremill.sttp.client3" %% "circe" % "3.3.14" +"com.softwaremill.sttp.client3" %% "circe" % "3.3.15" ``` This module adds a body serialized, so that json payloads can be sent as request bodies. To send a payload of type `T` as json, a `io.circe.Encoder[T]` implicit value must be available in scope. @@ -66,7 +66,7 @@ Arbitrary JSON structures can be traversed by parsing the result as `io.circe.Js To encode and decode json using json4s, add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %% "json4s" % "3.3.14" +"com.softwaremill.sttp.client3" %% "json4s" % "3.3.15" "org.json4s" %% "json4s-native" % "3.6.0" ``` @@ -100,7 +100,7 @@ val response: Identity[Response[Either[ResponseException[String, Exception], Res To encode and decode JSON using [spray-json](https://github.com/spray/spray-json), add the following dependency to your project: ``` -"com.softwaremill.sttp.client3" %% "spray-json" % "3.3.14" +"com.softwaremill.sttp.client3" %% "spray-json" % "3.3.15" ``` Using this module it is possible to set request bodies and read response bodies as your custom types, using the implicitly available instances of `spray.json.JsonWriter` / `spray.json.JsonReader` or `spray.json.JsonFormat`. @@ -132,7 +132,7 @@ val response: Identity[Response[Either[ResponseException[String, Exception], Res To encode and decode JSON using [play-json](https://www.playframework.com), add the following dependency to your project: ```scala -"com.softwaremill.sttp.client3" %% "play-json" % "3.3.14" +"com.softwaremill.sttp.client3" %% "play-json" % "3.3.15" ``` To use, add an import: `import sttp.client3.playJson._`. @@ -142,11 +142,11 @@ To use, add an import: `import sttp.client3.playJson._`. To encode and decode JSON using the high-performance [zio-json](https://zio.github.io/zio-json/) library, one add the following dependency to your project. ```scala -"com.softwaremill.sttp.client3" %% "zio-json" % "3.3.14" +"com.softwaremill.sttp.client3" %% "zio-json" % "3.3.15" ``` or for ScalaJS (cross build) projects: ```scala -"com.softwaremill.sttp.client3" %%% "zio-json" % "3.3.14" +"com.softwaremill.sttp.client3" %%% "zio-json" % "3.3.15" ``` To use, add an import: `import sttp.client3.ziojson._` (or extend `SttpZioJsonApi`), define an implicit `JsonCodec`, or `JsonDecoder`/`JsonEncoder` for your datatype. diff --git a/generated-docs/out/openapi.md b/generated-docs/out/openapi.md index 96bc54184b..b149f89406 100644 --- a/generated-docs/out/openapi.md +++ b/generated-docs/out/openapi.md @@ -45,8 +45,8 @@ lazy val petstoreApi: Project = project openApiGeneratorName := "scala-sttp", openApiOutputDir := baseDirectory.value.name, libraryDependencies ++= Seq( - "com.softwaremill.sttp.client3" %% "core" % "3.3.14", - "com.softwaremill.sttp.client3" %% "json4s" % "3.3.14", + "com.softwaremill.sttp.client3" %% "core" % "3.3.15", + "com.softwaremill.sttp.client3" %% "json4s" % "3.3.15", "org.json4s" %% "json4s-jackson" % "3.6.8" ) ) @@ -96,8 +96,8 @@ lazy val petstoreApi: Project = project openApiOutputDir := baseDirectory.value.name, openApiIgnoreFileOverride := s"${baseDirectory.in(ThisBuild).value.getPath}/openapi-ignore-file", libraryDependencies ++= Seq( - "com.softwaremill.sttp.client3" %% "core" % "3.3.14", - "com.softwaremill.sttp.client3" %% "json4s" % "3.3.14", + "com.softwaremill.sttp.client3" %% "core" % "3.3.15", + "com.softwaremill.sttp.client3" %% "json4s" % "3.3.15", "org.json4s" %% "json4s-jackson" % "3.6.8" ), (compile in Compile) := ((compile in Compile) dependsOn openApiGenerate).value, diff --git a/generated-docs/out/quickstart.md b/generated-docs/out/quickstart.md index 9bf3b1ecfc..dea2cee5d5 100644 --- a/generated-docs/out/quickstart.md +++ b/generated-docs/out/quickstart.md @@ -9,7 +9,7 @@ To integrate with other parts of your application, you'll often need to use an a The basic dependency which provides the API and the default synchronous backend is: ```scala -"com.softwaremill.sttp.client3" %% "core" % "3.3.14" +"com.softwaremill.sttp.client3" %% "core" % "3.3.15" ``` `sttp client` is available for Scala 2.11, 2.12 and 2.13, and requires Java 8, as well as for Scala 3. @@ -21,7 +21,7 @@ The basic dependency which provides the API and the default synchronous backend If you are an [Ammonite](https://ammonite.io) user, you can quickly start experimenting with sttp by copy-pasting the following: ```scala -import $ivy.`com.softwaremill.sttp.client3::core:3.3.14` +import $ivy.`com.softwaremill.sttp.client3::core:3.3.15` import sttp.client3.quick._ quickRequest.get(uri"http://httpbin.org/ip").send(backend) ``` @@ -31,7 +31,7 @@ Importing the `quick` object has the same effect as importing `sttp.client3._`, If the default `HttpURLConnectionBackend` for some reason is insufficient, you can also use one based on OkHttp or HttpClient: ```scala -import $ivy.`com.softwaremill.sttp.client3::okhttp-backend:3.3.14` +import $ivy.`com.softwaremill.sttp.client3::okhttp-backend:3.3.15` import sttp.client3.okhttp.quick._ quickRequest.get(uri"http://httpbin.org/ip").send(backend) ```