akka.http.scaladsl.coding.Gzip Scala Examples
The following examples show how to use akka.http.scaladsl.coding.Gzip.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
Example 1
Source File: ClickhouseResponseParser.scala From clickhouse-scala-client with GNU Lesser General Public License v3.0 | 5 votes |
package com.crobox.clickhouse.internal import akka.http.scaladsl.coding.{Deflate, Gzip, NoCoding} import akka.http.scaladsl.model._ import akka.http.scaladsl.model.headers.{HttpEncoding, HttpEncodings} import akka.http.scaladsl.unmarshalling.Unmarshaller import akka.stream.Materializer import akka.stream.scaladsl.SourceQueue import com.crobox.clickhouse.internal.progress.QueryProgress.{QueryProgress, _} import com.crobox.clickhouse.{ClickhouseChunkedException, ClickhouseException} import scala.concurrent.{ExecutionContext, Future} import scala.util.{Failure, Success} private[clickhouse] trait ClickhouseResponseParser { protected def processClickhouseResponse(responseFuture: Future[HttpResponse], query: String, host: Uri, progressQueue: Option[SourceQueue[QueryProgress]])( implicit materializer: Materializer, executionContext: ExecutionContext ): Future[String] = responseFuture.flatMap { response => decodeResponse(response) match { case HttpResponse(StatusCodes.OK, _, entity, _) => Unmarshaller.stringUnmarshaller(entity).map(content => { if (content.contains("DB::Exception")) { //FIXME this is quite a fragile way to detect failures, hopefully nobody will have a valid exception string in the result. Check https://github.com/yandex/ClickHouse/issues/2999 throw ClickhouseException("Found exception in the query return body", query, ClickhouseChunkedException(content), StatusCodes.OK) } content }) .andThen { case Success(_) => progressQueue.foreach(queue => { queue.offer(QueryFinished) }) case Failure(exception) => progressQueue.foreach(queue => { queue.offer(QueryFailed(exception)) }) } case HttpResponse(code, _, entity, _) => progressQueue.foreach(_.offer(QueryRejected)) Unmarshaller.stringUnmarshaller(entity).flatMap( response => Future.failed( ClickhouseException(s"Server [$host] returned code $code; $response", query, statusCode = code) ) ) } } protected def decodeResponse(response: HttpResponse): HttpResponse = { val decoder = response.encoding match { case HttpEncodings.gzip => Gzip case HttpEncodings.deflate => Deflate case HttpEncodings.identity => NoCoding case HttpEncoding(enc) => throw new IllegalArgumentException(s"Unsupported response encoding: $enc") } decoder.decodeMessage(response) } protected def splitResponse(response: String): Seq[String] = response.split("\n").toSeq }
Example 2
Source File: PrometheusTests.scala From openwhisk with Apache License 2.0 | 5 votes |
package org.apache.openwhisk.common import akka.http.scaladsl.coding.Gzip import akka.http.scaladsl.model.{HttpCharsets, HttpResponse} import akka.http.scaladsl.model.headers.HttpEncodings.gzip import akka.http.scaladsl.model.headers.{`Accept-Encoding`, `Content-Encoding`, HttpEncoding, HttpEncodings} import akka.http.scaladsl.testkit.ScalatestRouteTest import akka.http.scaladsl.unmarshalling.Unmarshal import com.typesafe.config.ConfigFactory import kamon.Kamon import org.junit.runner.RunWith import org.scalatest.concurrent.ScalaFutures import org.scalatest.junit.JUnitRunner import org.scalatest.matchers.Matcher import org.scalatest.{BeforeAndAfterAll, FlatSpec, Matchers} import scala.concurrent.duration._ @RunWith(classOf[JUnitRunner]) class PrometheusTests extends FlatSpec with Matchers with ScalatestRouteTest with BeforeAndAfterAll with ScalaFutures { behavior of "Prometheus" override protected def beforeAll(): Unit = { super.beforeAll() //Modify Kamon to have a very small tick interval val newConfig = ConfigFactory.parseString("""kamon { | metric { | tick-interval = 50 ms | optimistic-tick-alignment = no | } |}""".stripMargin).withFallback(ConfigFactory.load()) Kamon.reconfigure(newConfig) } override protected def afterAll(): Unit = { super.afterAll() Kamon.reconfigure(ConfigFactory.load()) } it should "respond to /metrics" in { val api = new KamonPrometheus Kamon.counter("foo_bar").withoutTags().increment(42) //Sleep to ensure that Kamon metrics are pushed to reporters Thread.sleep(2.seconds.toMillis) Get("/metrics") ~> `Accept-Encoding`(gzip) ~> api.route ~> check { // Check that response confirms to what Prometheus scrapper accepts contentType.charsetOption shouldBe Some(HttpCharsets.`UTF-8`) contentType.mediaType.params("version") shouldBe "0.0.4" response should haveContentEncoding(gzip) val responseText = Unmarshal(Gzip.decodeMessage(response)).to[String].futureValue withClue(responseText) { responseText should include("foo_bar") } } api.close() } it should "not be enabled by default" in { Get("/metrics") ~> MetricsRoute() ~> check { handled shouldBe false } } private def haveContentEncoding(encoding: HttpEncoding): Matcher[HttpResponse] = be(encoding) compose { (_: HttpResponse).header[`Content-Encoding`].map(_.encodings.head).getOrElse(HttpEncodings.identity) } }
Example 3
Source File: AkkaBackend.scala From drunk with Apache License 2.0 | 5 votes |
package com.github.jarlakxen.drunk.backend import java.io.UnsupportedEncodingException import akka.actor.ActorSystem import akka.http.scaladsl.coding.{Deflate, Gzip, NoCoding} import akka.http.scaladsl.model.HttpResponse import akka.http.scaladsl.model.headers.HttpEncodings import akka.stream.ActorMaterializer import akka.util.ByteString import scala.concurrent.{ExecutionContext, Future} trait AkkaBackend { implicit val as: ActorSystem implicit val mat: ActorMaterializer def send(body: String): Future[(Int, String)] protected def encodingFromContentType(ct: String): Option[String] = ct.split(";").map(_.trim.toLowerCase).collectFirst { case s if s.startsWith("charset=") => s.substring(8) } protected def decodeResponse(response: HttpResponse): HttpResponse = { val decoder = response.encoding match { case HttpEncodings.gzip => Gzip case HttpEncodings.deflate => Deflate case HttpEncodings.identity => NoCoding case ce => throw new UnsupportedEncodingException(s"Unsupported encoding: $ce") } decoder.decodeMessage(response) } protected def bodyToString(hr: HttpResponse, charsetFromHeaders: String): Future[String] = { implicit val ec: ExecutionContext = as.dispatcher hr.entity.dataBytes .runFold(ByteString.empty)(_ ++ _) .map(_.decodeString(charsetFromHeaders)) } }
Example 4
Source File: EncodingDecodingClientApplication.scala From Akka-Cookbook with MIT License | 5 votes |
package com.packt.chapter9 import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.coding.{Encoder, Gzip, NoCoding} import akka.http.scaladsl.model._ import akka.http.scaladsl.model.headers._ import akka.http.scaladsl.model.headers.HttpEncodings._ import akka.http.scaladsl.model.HttpMethods._ import headers.HttpEncodings import akka.stream.ActorMaterializer import akka.util.ByteString import scala.concurrent.duration._ import scala.concurrent.Future import scala.util.{Failure, Success} object EncodingDecodingClientApplication extends App { implicit val system = ActorSystem() implicit val materializer = ActorMaterializer() import system.dispatcher val http = Http() val uriServer = "http://localhost:8088/" val requests = Seq ( HttpRequest(POST, uriServer, List(`Accept-Encoding`(gzip)), HttpEntity("Hello!")), HttpRequest(POST, uriServer, List(`Content-Encoding`(gzip), `Accept-Encoding`(gzip)), HttpEntity(compress("Hello compressed!", Gzip)) ) ) Future.traverse(requests)(http.singleRequest(_).map(decodeResponse)) andThen { case Success(responses) => responses.foreach(response => response.entity.toStrict(5 seconds).map(_.data.decodeString("UTF-8")).andThen { case Success(content) => println(s"Response: $content") case _ => }) case Failure(e) => println(s"request failed $e") } private def decodeResponse(response: HttpResponse) = { val decoder = response.encoding match { case HttpEncodings.gzip => Gzip case HttpEncodings.identity => NoCoding } decoder.decode(response) } private def compress(input: String, encoder: Encoder): ByteString = encoder.encode(ByteString(input)) }
Example 5
Source File: AkkaRequestExecutor.scala From chronicler with Apache License 2.0 | 5 votes |
package com.github.fsanaulla.chronicler.akka.shared.handlers import akka.http.scaladsl.coding.Gzip import akka.http.scaladsl.model._ import akka.http.scaladsl.model.headers.{`Accept-Encoding`, `Content-Encoding`, HttpEncodings} import akka.http.scaladsl.{HttpExt, HttpsConnectionContext} import com.github.fsanaulla.chronicler.core.components.RequestExecutor import scala.concurrent.Future override def post(uri: Uri): Future[HttpResponse] = { val request = HttpRequest( method = HttpMethods.GET, uri = uri ) http.singleRequest( request, connectionContext = ctx ) } }
Example 6
Source File: AkkaBodyUnmarshaller.scala From chronicler with Apache License 2.0 | 5 votes |
package com.github.fsanaulla.chronicler.akka.shared.handlers import akka.http.scaladsl.coding.Gzip import akka.http.scaladsl.model.{HttpCharsets, HttpEntity} import akka.http.scaladsl.unmarshalling.Unmarshaller import akka.stream.Materializer import akka.util.ByteString import com.github.fsanaulla.chronicler.core.alias.ErrorOr import com.github.fsanaulla.chronicler.core.jawn.RichJParser import org.typelevel.jawn.ast.{JParser, JValue} import scala.concurrent.{ExecutionContext, Future} final class AkkaBodyUnmarshaller(compressed: Boolean) extends Unmarshaller[HttpEntity, ErrorOr[JValue]] { override def apply( value: HttpEntity )(implicit ec: ExecutionContext, mat: Materializer ): Future[ErrorOr[JValue]] = { // get encoding from response content type, otherwise use UTF-8 as default val encoding = value.contentType.charsetOption .getOrElse(HttpCharsets.`UTF-8`) .nioCharset() val srcBody = if (compressed) value.dataBytes.via(Gzip.decoderFlow) else value.dataBytes srcBody .runFold(ByteString.empty)(_ ++ _) .map(_.decodeString(encoding)) .map(JParser.parseFromStringEither) } }
Example 7
Source File: ProgressRoutes.scala From scastie with Apache License 2.0 | 5 votes |
package com.olegych.scastie.web.routes import akka.NotUsed import akka.actor.ActorRef import akka.http.scaladsl.coding.Gzip import akka.http.scaladsl.marshalling.sse.EventStreamMarshalling._ import akka.http.scaladsl.model._ import akka.http.scaladsl.model.sse.ServerSentEvent import akka.http.scaladsl.model.ws.TextMessage._ import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import akka.pattern.ask import akka.stream.scaladsl._ import com.olegych.scastie.api._ import com.olegych.scastie.balancer._ import play.api.libs.json.Json import scala.concurrent.Future import scala.concurrent.duration.DurationInt class ProgressRoutes(progressActor: ActorRef) { val routes: Route = encodeResponseWith(Gzip)( concat( snippetIdStart("progress-sse") { sid => complete { progressSource(sid).map { progress => ServerSentEvent(Json.stringify(Json.toJson(progress))) } } }, snippetIdStart("progress-ws")( sid => handleWebSocketMessages(webSocket(sid)) ) ) ) private def progressSource( snippetId: SnippetId ): Source[SnippetProgress, NotUsed] = { Source .fromFuture((progressActor ? SubscribeProgress(snippetId))(1.second).mapTo[Source[SnippetProgress, NotUsed]]) .flatMapConcat(identity) } private def webSocket(snippetId: SnippetId): Flow[ws.Message, ws.Message, _] = { def flow: Flow[String, SnippetProgress, NotUsed] = { val in = Flow[String].to(Sink.ignore) val out = progressSource(snippetId) Flow.fromSinkAndSource(in, out) } Flow[ws.Message] .mapAsync(1) { case Strict(c) => Future.successful(c) case e => Future.failed(new Exception(e.toString)) } .via(flow) .map( progress => ws.TextMessage.Strict(Json.stringify(Json.toJson(progress))) ) } }
Example 8
Source File: ScalaJsRoutes.scala From scastie with Apache License 2.0 | 5 votes |
package com.olegych.scastie.web.routes import com.olegych.scastie.api._ import akka.util.Timeout import akka.pattern.ask import akka.actor.{ActorRef, ActorSystem} import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import akka.http.scaladsl.coding.Gzip import scala.concurrent.duration.DurationInt //not used anymore class ScalaJsRoutes(dispatchActor: ActorRef)(implicit system: ActorSystem) { import system.dispatcher implicit val timeout: Timeout = Timeout(1.seconds) val routes: Route = encodeResponseWith(Gzip)( concat( snippetIdEnd(Shared.scalaJsHttpPathPrefix, ScalaTarget.Js.targetFilename)( sid => complete( (dispatchActor ? FetchScalaJs(sid)) .mapTo[Option[FetchResultScalaJs]] .map(_.map(_.content)) ) ), snippetIdEnd(Shared.scalaJsHttpPathPrefix, ScalaTarget.Js.sourceFilename)( sid => complete( (dispatchActor ? FetchScalaSource(sid)) .mapTo[Option[FetchResultScalaSource]] .map(_.map(_.content)) ) ), snippetIdEnd(Shared.scalaJsHttpPathPrefix, ScalaTarget.Js.sourceMapFilename)( sid => complete( (dispatchActor ? FetchScalaJsSourceMap(sid)) .mapTo[Option[FetchResultScalaJsSourceMap]] .map(_.map(_.content)) ) ) ) ) }
Example 9
Source File: FrontPageRoutes.scala From scastie with Apache License 2.0 | 5 votes |
package com.olegych.scastie.web.routes import akka.http.scaladsl.coding.{Gzip, NoCoding} import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import com.olegych.scastie.api.{SnippetId, SnippetUserPart} import com.olegych.scastie.util.Base64UUID class FrontPageRoutes(production: Boolean) { private def index = getFromResource("public/index.html") private def embeddedResource(snippetId: SnippetId, theme: Option[String]): String = { val user = snippetId.user match { case Some(SnippetUserPart(login, update)) => s"user: '$login', update: $update," case None => "" } val themePart = theme match { case Some(t) => s"theme: '$t'," case None => "" } val id = "id-" + Base64UUID.create val embeddedUrlBase = if (production) "https://scastie.scala-lang.org" else "http://localhost:9000" s"""|document.write(" |<div id='$id'></div> |<script src='$embeddedUrlBase/embedded.js'></script> |<script> |window.addEventListener('load', function(event) { | scastie.EmbeddedResource({ | $themePart | base64UUID: '${snippetId.base64UUID}', | $user | injectId: '$id', | serverUrl: '$embeddedUrlBase' | }); |}); |</script> |");""".stripMargin.split("\n").map(_.trim).mkString("") } val routes: Route = encodeResponseWith(Gzip, NoCoding)( concat( get( concat( path("public" / "app.css")( getFromResource("public/app.css.gz") ), path("public" / "app.js")( getFromResource("public/app.js.gz") ), path("public" / "embedded.css")( getFromResource("public/embedded.css.gz") ), path("embedded.js")( getFromResource("public/embedded.js.gz") ), path("embedded.js.map")( getFromResource("public/embedded.js.map") ), path("public" / Remaining)( path => getFromResource("public/" + path) ) ) ), get( concat( pathSingleSlash(index), snippetId(_ => index), parameter("theme".?) { theme => snippetIdExtension(".js") { sid => complete(embeddedResource(sid, theme)) } }, index, ) ) ) ) }
Example 10
Source File: ApiRoutes.scala From scastie with Apache License 2.0 | 5 votes |
package com.olegych.scastie.web.routes import akka.actor.{ActorRef, ActorSystem} import akka.http.scaladsl.coding.Gzip import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.{Directive1, Route} import com.olegych.scastie.api._ import com.olegych.scastie.web._ import com.olegych.scastie.web.oauth2._ class ApiRoutes( dispatchActor: ActorRef, userDirectives: UserDirectives )(implicit system: ActorSystem) extends PlayJsonSupport { import play.api.libs.json._ import system.dispatcher import userDirectives.optionalLogin implicit val readsInputs: Reads[Inputs] = Json.reads[Inputs] val withRestApiServer: Directive1[RestApiServer] = (extractClientIP & optionalLogin).tmap { case (remoteAddress, user) => new RestApiServer(dispatchActor, remoteAddress, user) } val routes: Route = withRestApiServer( server => concat( post( concat( path("run")( entity(as[Inputs])(inputs => complete(server.run(inputs))) ), path("save")( entity(as[Inputs])(inputs => complete(server.save(inputs))) ), path("update")( entity(as[EditInputs])( editInputs => complete(server.update(editInputs)) ) ), path("fork")( entity(as[EditInputs])( editInputs => complete(server.fork(editInputs)) ) ), path("delete")( entity(as[SnippetId])( snippetId => complete(server.delete(snippetId)) ) ), path("format")( entity(as[FormatRequest])( request => complete(server.format(request)) ) ) ) ), encodeResponseWith(Gzip)( get( concat( snippetIdStart("snippets")( sid => complete(server.fetch(sid)) ), path("old-snippets" / IntNumber)( id => complete(server.fetchOld(id)) ), path("user" / "settings")( complete(server.fetchUser()) ), path("user" / "snippets")( complete(server.fetchUserSnippets()) ) ) ) ) ) ) }
Example 11
Source File: HttpZipDecoder.scala From CM-Well with Apache License 2.0 | 5 votes |
package cmwell.util.akka.http import akka.http.scaladsl.coding.{Deflate, Gzip, NoCoding} import akka.http.scaladsl.model.HttpResponse import akka.http.scaladsl.model.headers.{HttpEncoding, HttpEncodings} object HttpZipDecoder { def decodeResponse(response: HttpResponse): HttpResponse = { val decoder = response.encoding match { case HttpEncodings.gzip ⇒ Gzip case HttpEncodings.deflate ⇒ Deflate case HttpEncodings.identity ⇒ NoCoding case HttpEncoding(_) ⇒ ??? } decoder.decodeMessage(response) } }
Example 12
Source File: AkkaUtils.scala From CM-Well with Apache License 2.0 | 5 votes |
package cmwell.tools.data.utils.akka import java.net.InetSocketAddress import akka.http.scaladsl.ClientTransport import akka.http.scaladsl.coding.{Deflate, Gzip, NoCoding} import akka.http.scaladsl.model.HttpResponse import akka.http.scaladsl.model.headers.{HttpEncoding, HttpEncodings} import akka.http.scaladsl.settings.{ClientConnectionSettings, ConnectionPoolSettings} import com.typesafe.config.ConfigFactory object AkkaUtils { def generateClientConnectionSettings(userAgent : String) ={ val settings = ClientConnectionSettings( ConfigFactory .parseString(s"akka.http.host-connection-pool.client.user-agent-header=$userAgent") .withFallback(config) ) val proxyHost = config.getString("akka.http.client.proxy.https.host") val proxyPort = config.getInt("akka.http.client.proxy.https.port") if (proxyHost!="") { val httpsProxyTransport = ClientTransport.httpsProxy(InetSocketAddress.createUnresolved(proxyHost, proxyPort)) settings.withTransport(httpsProxyTransport) } else settings } def generateConnectionPoolSettings(userAgent : Option[String] = None) ={ val settings = userAgent.fold{ ConnectionPoolSettings(config) .withConnectionSettings(ClientConnectionSettings(config)) }{userAgentV => ConnectionPoolSettings( ConfigFactory .parseString(s"akka.http.host-connection-pool.client.user-agent-header=$userAgentV") .withFallback(config) ) } val proxyHost = config.getString("akka.http.client.proxy.https.host") val proxyPort = config.getInt("akka.http.client.proxy.https.port") if (proxyHost!="") { val httpsProxyTransport = ClientTransport.httpsProxy(InetSocketAddress.createUnresolved(proxyHost, proxyPort)) settings.withTransport(httpsProxyTransport) } else settings } def decodeResponse(response: HttpResponse) = { val decoder = response.encoding match { case HttpEncodings.gzip ⇒ Gzip case HttpEncodings.deflate ⇒ Deflate case HttpEncodings.identity ⇒ NoCoding case HttpEncoding(_) ⇒ ??? } decoder.decodeMessage(response) } }
Example 13
Source File: Webservice.scala From akka-viz with MIT License | 5 votes |
package akkaviz.server import akka.actor.{ActorRef, ActorSystem, Kill, PoisonPill} import akka.http.scaladsl.coding.Gzip import akka.http.scaladsl.model._ import akka.http.scaladsl.model.ws.{BinaryMessage, Message} import akka.http.scaladsl.server.Directives import akka.stream.scaladsl._ import akka.stream.{Materializer, OverflowStrategy} import akkaviz.config.Config import akkaviz.events._ import akkaviz.events.types._ import akkaviz.persistence.{PersistenceSources, ReceivedRecord} import akkaviz.protocol import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration._ class Webservice(implicit materializer: Materializer, system: ActorSystem) extends Directives with SubscriptionSession with ReplSupport with AkkaHttpHelpers with ArchiveSupport with FrontendResourcesSupport with ProtocolSerializationSupport with BackendEventsMarshalling { def route: Flow[HttpRequest, HttpResponse, Any] = encodeResponseWith(Gzip) { get { path("stream") { handleWebSocketMessages(tracingEventsFlow.mapMaterializedValue(EventSystem.subscribe)) } } ~ archiveRouting ~ replRouting ~ frontendResourcesRouting } def tracingEventsFlow: Flow[Message, Message, ActorRef] = { val eventSrc = Source.actorRef[BackendEvent](Config.bufferSize, OverflowStrategy.dropNew) val wsIn = Flow[Message] .via(websocketMessageToClientMessage) .via(handleUserCommand) .scan(defaultSettings)(updateSettings) .expand(r => Iterator.continually(r)) val out = wsIn.zipMat(eventSrc)((_, m) => m) .collect { case (settings, r: BackendEvent) if settings.eventAllowed(r) => r }.via(backendEventToProtocolFlow) .keepAlive(10.seconds, () => protocol.Ping) .via(protocolServerMessageToByteString) .map(BinaryMessage.Strict(_)) out } private[this] val handleUserCommand: Flow[protocol.ApiClientMessage, ChangeSubscriptionSettings, _] = Flow[protocol.ApiClientMessage].mapConcat { case protocol.SetAllowedMessages(classNames) => system.log.debug(s"Set allowed messages to $classNames") List(SetAllowedClasses(classNames)) case protocol.ObserveActors(actors) => system.log.debug(s"Set observed actors to $actors") List(SetActorEventFilter(actors)) case protocol.SetReceiveDelay(duration) => system.log.debug(s"Setting receive delay to $duration") EventSystem.setReceiveDelay(duration) Nil case protocol.SetEnabled(isEnabled) => system.log.info(s"Setting EventSystem.setEnabled($isEnabled)") EventSystem.setEnabled(isEnabled) Nil case protocol.RefreshInternalState(actor) => ActorSystems.refreshActorState(actor) Nil case protocol.PoisonPillActor(actor) => ActorSystems.tell(actor, PoisonPill) Nil case protocol.KillActor(actor) => ActorSystems.tell(actor, Kill) Nil } override def receivedOf(ref: String): Source[ReceivedRecord, _] = PersistenceSources.of(ref) override def receivedBetween(ref: String, ref2: String): Source[ReceivedRecord, _] = PersistenceSources.between(ref, ref2) override def isArchiveEnabled: Boolean = Config.enableArchive }