compressResponse

Uses the first of a given number of encodings that the client accepts. If none are accepted the request is rejected with an UnacceptedResponseEncodingRejection.

Signature

def compressResponse()(implicit refFactory: ActorRefFactory): Directive0
def compressResponse(e1: Encoder)(implicit refFactory: ActorRefFactory): Directive0
def compressResponse(e1: Encoder, e2: Encoder)(implicit refFactory: ActorRefFactory): Directive0
def compressResponse(e1: Encoder, e2: Encoder, e3: Encoder)(implicit refFactory: ActorRefFactory): Directive0

The signature shown is simplified, the real signature uses magnets. [1]

[1]See The Magnet Pattern for an explanation of magnet-based overloading.

Description

The compressResponse directive allows to specify zero to three encoders to try in the specified order. If none are specified the tried list is Gzip, Deflate, and then NoEncoding.

The compressResponse() directive (without an explicit list of encoders given) will therefore behave as follows:

Accept-Encoding header resulting response
Accept-Encoding: gzip compressed with Gzip
Accept-Encoding: deflate compressed with Deflate
Accept-Encoding: deflate, gzip compressed with Gzip
Accept-Encoding: identity uncompressed
no Accept-Encoding header present compressed with Gzip

For an overview of the different compressResponse directives see When to use which compression directive?.

Example

This example shows the behavior of compressResponse without any encoders specified:

val route = compressResponse() { complete("content") }

Get("/") ~> route ~> check {
  response must haveContentEncoding(gzip)
}
Get("/") ~> `Accept-Encoding`(gzip, deflate) ~> route ~> check {
  response must haveContentEncoding(gzip)
}
Get("/") ~> `Accept-Encoding`(deflate) ~> route ~> check {
  response must haveContentEncoding(deflate)
}
Get("/") ~> `Accept-Encoding`(identity) ~> route ~> check {
  status === StatusCodes.OK
  response must haveContentEncoding(identity)
  responseAs[String] === "content"
}

This example shows the behaviour of compressResponse(Gzip):

val route = compressResponse(Gzip) { complete("content") }

Get("/") ~> route ~> check {
  response must haveContentEncoding(gzip)
}
Get("/") ~> `Accept-Encoding`(gzip, deflate) ~> route ~> check {
  response must haveContentEncoding(gzip)
}
Get("/") ~> `Accept-Encoding`(deflate) ~> route ~> check {
  rejection === UnacceptedResponseEncodingRejection(gzip)
}
Get("/") ~> `Accept-Encoding`(identity) ~> route ~> check {
  rejection === UnacceptedResponseEncodingRejection(gzip)
}