akka.http.scaladsl.unmarshalling.Unmarshal Scala Examples
The following examples show how to use akka.http.scaladsl.unmarshalling.Unmarshal.
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: ExampleApp.scala From akka-http-json with Apache License 2.0 | 5 votes |
package de.heikoseeberger.akkahttpcirce import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.marshalling.Marshal import akka.http.scaladsl.model.{ HttpRequest, RequestEntity } import akka.http.scaladsl.server.Directives import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.scaladsl.Source import scala.io.StdIn import scala.concurrent.duration._ object ExampleApp { private final case class Foo(bar: String) def main(args: Array[String]): Unit = { implicit val system = ActorSystem() Http().bindAndHandle(route, "127.0.0.1", 8000) StdIn.readLine("Hit ENTER to exit") system.terminate() } private def route(implicit sys: ActorSystem) = { import Directives._ import FailFastCirceSupport._ import io.circe.generic.auto._ pathSingleSlash { post { entity(as[Foo]) { foo => complete { foo } } } } ~ pathPrefix("stream") { post { entity(as[SourceOf[Foo]]) { fooSource: SourceOf[Foo] => import sys._ Marshal(Source.single(Foo("a"))).to[RequestEntity] complete(fooSource.throttle(1, 2.seconds)) } } ~ get { pathEndOrSingleSlash { complete( Source(0 to 5) .throttle(1, 1.seconds) .map(i => Foo(s"bar-$i")) ) } ~ pathPrefix("remote") { onSuccess(Http().singleRequest(HttpRequest(uri = "http://localhost:8000/stream"))) { response => complete(Unmarshal(response).to[SourceOf[Foo]]) } } } } } }
Example 2
Source File: AkkaHttpClient.scala From graphql-gateway with Apache License 2.0 | 5 votes |
package sangria.gateway.http.client import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.model.HttpHeader.ParsingResult import akka.http.scaladsl.model._ import akka.http.scaladsl.model.Uri.Query import akka.http.scaladsl.model.headers.Location import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.Materializer import akka.util.ByteString import sangria.gateway.util.Logging import scala.concurrent.{ExecutionContext, Future} class AkkaHttpClient(implicit system: ActorSystem, mat: Materializer, ec: ExecutionContext) extends HttpClient with Logging { import AkkaHttpClient._ import HttpClient._ override def request(method: Method.Value, url: String, queryParams: Seq[(String, String)] = Seq.empty, headers: Seq[(String, String)] = Seq.empty, body: Option[(String, String)] = None) = { val m = mapMethod(method) val query = Query(queryParams: _*) val hs = headers.map(header) val uri = Uri(url).withQuery(query) val entity = body.fold(HttpEntity.Empty){case (tpe, content) ⇒ HttpEntity(contentType(tpe), ByteString(content))} val request = HttpRequest(m, uri, hs.toVector, entity) val client = Http().singleRequest(_: HttpRequest) val richClient = RichHttpClient.httpClientWithRedirect(client) logger.debug(s"Http request: ${m.value} $url") richClient(request).map(AkkaHttpResponse(m, url, _)) } override def oauthClientCredentials(url: String, clientId: String, clientSecret: String, scopes: Seq[String]): Future[HttpResponse] = throw new IllegalStateException("Not yet implemented, please use play implementation.") private def contentType(str: String) = ContentType.parse(str).fold( errors ⇒ throw ClientError(s"Invalid content type '$str'", errors.map(_.detail)), identity) private def header(nameValue: (String, String)) = HttpHeader.parse(nameValue._1, nameValue._2) match { case ParsingResult.Ok(_, errors) if errors.nonEmpty ⇒ throw ClientError(s"Invalid header '${nameValue._1}'", errors.map(_.detail)) case ParsingResult.Error(error) ⇒ throw ClientError(s"Invalid header '${nameValue._1}'", Seq(error.detail)) case ParsingResult.Ok(h, _) ⇒ h } def mapMethod(method: Method.Value) = method match { case Method.Get ⇒ HttpMethods.GET case Method.Post ⇒ HttpMethods.POST } object RichHttpClient { import akka.http.scaladsl.model.HttpResponse type HttpClient = HttpRequest ⇒ Future[HttpResponse] def redirectOrResult(client: HttpClient)(response: HttpResponse): Future[HttpResponse] = response.status match { case StatusCodes.Found | StatusCodes.MovedPermanently | StatusCodes.SeeOther ⇒ val newUri = response.header[Location].get.uri // Always make sure you consume the response entity streams (of type Source[ByteString,Unit]) by for example connecting it to a Sink (for example response.discardEntityBytes() if you don’t care about the response entity), since otherwise Akka HTTP (and the underlying Streams infrastructure) will understand the lack of entity consumption as a back-pressure signal and stop reading from the underlying TCP connection! response.discardEntityBytes() logger.debug(s"Http redirect: ${HttpMethods.GET.value} $newUri") client(HttpRequest(method = HttpMethods.GET, uri = newUri)) case _ ⇒ Future.successful(response) } def httpClientWithRedirect(client: HttpClient): HttpClient = { lazy val redirectingClient: HttpClient = req ⇒ client(req).flatMap(redirectOrResult(redirectingClient)) // recurse to support multiple redirects redirectingClient } } case class ClientError(message: String, errors: Seq[String]) extends Exception(message + ":\n" + errors.map(" * " + _).mkString("\n")) } object AkkaHttpClient { case class AkkaHttpResponse(method: HttpMethod, url: String, response: HttpResponse)(implicit mat: Materializer) extends HttpClient.HttpResponse { def asString = Unmarshal(response).to[String] def statusCode = response.status.intValue() def isSuccessful = response.status.isSuccess() def debugInfo = s"${method.value} $url" } }
Example 3
Source File: MultiServiceSpec.scala From akka-http-spring-boot with Apache License 2.0 | 5 votes |
package com.github.scalaspring.akka.http import java.net.ServerSocket import akka.http.scaladsl.client.RequestBuilding._ import akka.http.scaladsl.model.StatusCodes._ import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server._ import akka.http.scaladsl.unmarshalling.Unmarshal import com.github.scalaspring.scalatest.TestContextManagement import com.typesafe.scalalogging.StrictLogging import org.scalatest.concurrent.ScalaFutures import org.scalatest.{FlatSpec, Matchers} import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.SpringApplicationContextLoader import org.springframework.context.annotation.{Bean, Import} import org.springframework.test.context.ContextConfiguration import resource._ import scala.concurrent.duration._ @ContextConfiguration( loader = classOf[SpringApplicationContextLoader], classes = Array(classOf[MultiServiceSpec.Configuration]) ) class MultiServiceSpec extends FlatSpec with TestContextManagement with AkkaStreamsAutowiredImplicits with Matchers with ScalaFutures with StrictLogging { implicit val patience = PatienceConfig((10.seconds)) // Allow time for server startup @Autowired val settings: ServerSettings = null @Autowired val client: HttpClient = null "Echo service" should "echo" in { val name = "name" val future = client.request(Get(s"http://${settings.interface}:${settings.port}/multi/echo/$name")) whenReady(future) { response => response.status shouldBe OK whenReady(Unmarshal(response.entity).to[String])(_ shouldBe name) } } "Reverse service" should "reverse" in { val name = "name" val future = client.request(Get(s"http://${settings.interface}:${settings.port}/multi/reverse/$name")) whenReady(future) { response => response.status shouldBe OK whenReady(Unmarshal(response.entity).to[String])(_ shouldBe name.reverse) } } } object MultiServiceSpec { @Configuration @Import(Array(classOf[AkkaHttpServerAutoConfiguration])) class Configuration extends AkkaHttpServer with EchoService with ReverseService { @Bean def serverSettings = new ServerSettings(port = managed(new ServerSocket(0)).map(_.getLocalPort).opt.get) } trait EchoService extends AkkaHttpService { abstract override def route: Route = { (get & path("multi"/"echo"/Segment)) { name => complete(name) } ~ super.route } } trait ReverseService extends AkkaHttpService { abstract override def route: Route = { (get & path("multi"/"reverse"/Segment)) { name => complete(name.reverse) } } ~ super.route } }
Example 4
Source File: SingleServiceSpec.scala From akka-http-spring-boot with Apache License 2.0 | 5 votes |
package com.github.scalaspring.akka.http import java.net.ServerSocket import akka.http.scaladsl.client.RequestBuilding._ import akka.http.scaladsl.model.StatusCodes._ import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server._ import akka.http.scaladsl.unmarshalling.Unmarshal import com.github.scalaspring.scalatest.TestContextManagement import com.typesafe.scalalogging.StrictLogging import org.scalatest.concurrent.ScalaFutures import org.scalatest.{FlatSpec, Matchers} import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.SpringApplicationContextLoader import org.springframework.context.annotation.{Bean, Import} import org.springframework.test.context.ContextConfiguration import resource._ import scala.concurrent.duration._ @ContextConfiguration( loader = classOf[SpringApplicationContextLoader], classes = Array(classOf[SingleServiceSpec.Configuration]) ) class SingleServiceSpec extends FlatSpec with TestContextManagement with AkkaStreamsAutowiredImplicits with Matchers with ScalaFutures with StrictLogging { implicit val patience = PatienceConfig(10.seconds) // Allow time for server startup @Autowired val settings: ServerSettings = null @Autowired val client: HttpClient = null "Echo service" should "echo" in { val name = "name" val future = client.request(Get(s"http://${settings.interface}:${settings.port}/single/echo/$name")) whenReady(future) { response => //logger.info(s"""received response "$response"""") response.status shouldBe OK whenReady(Unmarshal(response.entity).to[String])(_ shouldBe name) } } } object SingleServiceSpec { @Configuration @Import(Array(classOf[AkkaHttpServerAutoConfiguration])) class Configuration extends AkkaHttpServer with EchoService { @Bean def serverSettings = new ServerSettings(port = managed(new ServerSocket(0)).map(_.getLocalPort).opt.get) } trait EchoService extends AkkaHttpService { abstract override def route: Route = { get { path("single"/ "echo" / Segment) { name => complete(name) } } } ~ super.route } }
Example 5
Source File: JacksonMapperSpec.scala From squbs with Apache License 2.0 | 5 votes |
package org.squbs.marshallers.json import akka.actor.ActorSystem import akka.http.scaladsl.marshalling.Marshal import akka.http.scaladsl.model.{HttpEntity, MediaTypes, MessageEntity} import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.ActorMaterializer import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility import com.fasterxml.jackson.annotation.PropertyAccessor import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.module.scala.DefaultScalaModule import org.scalatest.{AsyncFlatSpec, BeforeAndAfterAll, Matchers} import org.squbs.marshallers.json.TestData._ class JacksonMapperSpec extends AsyncFlatSpec with Matchers with BeforeAndAfterAll { import JacksonMapperSupport._ implicit val system = ActorSystem("JacksonMapperSpec") implicit val mat = ActorMaterializer() JacksonMapperSupport.setDefaultMapper(new ObjectMapper().registerModule(DefaultScalaModule)) it should "marshal and unmarshal standard case classes" in { val entity = HttpEntity(MediaTypes.`application/json`, fullTeamJson) Marshal(fullTeam).to[MessageEntity] map { _ shouldBe entity } Unmarshal(entity).to[Team] map { _ shouldBe fullTeam } } it should "marshal and unmarshal Scala non-case classes" in { val entity = HttpEntity(MediaTypes.`application/json`, fullTeamJson) Marshal(fullTeamNonCaseClass).to[MessageEntity] map { _ shouldBe entity } Unmarshal(entity).to[TeamNonCaseClass] map { _ shouldBe fullTeamNonCaseClass } } it should "marshal and unmarshal Scala class with Java Bean members" in { val entity = HttpEntity(MediaTypes.`application/json`, fullTeamJson) Marshal(fullTeamWithBeanMember).to[MessageEntity] map { _ shouldBe entity } Unmarshal(entity).to[TeamWithBeanMember] map { _ shouldBe fullTeamWithBeanMember } } it should "marshal and unmarshal Java Bean with case class members" in { val entity = HttpEntity(MediaTypes.`application/json`, fullTeamJson) Marshal(fullTeamWithCaseClassMember).to[MessageEntity] map { _ shouldBe entity } Unmarshal(entity).to[TeamBeanWithCaseClassMember] map { _ shouldBe fullTeamWithCaseClassMember } } it should "marshal and unmarshal Java Bean" in { val fieldMapper = new ObjectMapper().setVisibility(PropertyAccessor.FIELD, Visibility.ANY) .registerModule(DefaultScalaModule) JacksonMapperSupport.register[TeamWithPrivateMembers](fieldMapper) val entity = HttpEntity(MediaTypes.`application/json`, fullTeamJson) Marshal(fullTeamWithPrivateMembers).to[MessageEntity] map { _ shouldBe entity } Unmarshal(entity).to[TeamWithPrivateMembers] map { _ shouldBe fullTeamWithPrivateMembers } } it should "Marshal and unmarshal Jackson annotated Java subclasses" in { JacksonMapperSupport.register[PageData](new ObjectMapper) val entity = HttpEntity(MediaTypes.`application/json`, pageTestJson) Marshal(pageTest).to[MessageEntity] map { _ shouldBe entity } Unmarshal(entity).to[PageData] map { _ shouldBe pageTest } } }
Example 6
Source File: Json4sNativeSpec.scala From squbs with Apache License 2.0 | 5 votes |
package org.squbs.marshallers.json import akka.actor.ActorSystem import akka.http.scaladsl.marshalling.Marshal import akka.http.scaladsl.model.{HttpEntity, MediaTypes, MessageEntity} import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.ActorMaterializer import org.json4s._ import org.scalatest.{AsyncFlatSpec, BeforeAndAfterAll, Matchers} class Json4sNativeSpec extends AsyncFlatSpec with Matchers with BeforeAndAfterAll { import de.heikoseeberger.akkahttpjson4s.Json4sSupport._ implicit val system = ActorSystem("Json4sNativeSpec") implicit val mat = ActorMaterializer() implicit val serialization = native.Serialization "NoTypeHints Example (case class)" should "have correct behaviour of read/write" in { implicit val formats = DefaultFormats.withHints(NoTypeHints) val playInfo = PlayerInfo("d", "k", 30) val entity = HttpEntity(MediaTypes.`application/json`, """{"firstName":"d","lastName":"k","age":30}""") Marshal(playInfo).to[MessageEntity] map { _ shouldBe entity } Unmarshal(entity).to[PlayerInfo] map { _ shouldBe playInfo } } "NoTypeHints Example (case class contain the other case class)" should "have correct behaviour of read/write" in { implicit val formats = DefaultFormats.withHints(NoTypeHints) val name = Player("d", "k") val playInfo = PlayerInfo2(name, 30) val entity = HttpEntity(MediaTypes.`application/json`, """{"name":{"firstName":"d","lastName":"k"},"age":30}""") Marshal(playInfo).to[MessageEntity] map { _ shouldBe entity } Unmarshal(entity).to[PlayerInfo2] map { _ shouldBe playInfo } } "ShortTypeHints Example (inheritance)" should "have correct behaviour of read/write" in { implicit val formats = DefaultFormats.withHints(ShortTypeHints(classOf[Dog] :: classOf[Fish] :: Nil)) val animals = Animals(Dog("pluto") :: Fish(1.2) :: Nil) val entity = HttpEntity(MediaTypes.`application/json`, """{"animals":[{"jsonClass":"Dog","name":"pluto"},{"jsonClass":"Fish","weight":1.2}]}""") Marshal(animals).to[MessageEntity] map { _ shouldBe entity } Unmarshal(entity).to[Animals] map { _ shouldBe animals } } "FullTypeHints Example (inheritance)" should "have correct behaviour of read/write" in { implicit val formats = DefaultFormats.withHints(FullTypeHints(classOf[Dog] :: classOf[Fish] :: Nil)) val animals = Animals(Dog("lucky") :: Fish(3.4) :: Nil) val entity = HttpEntity(MediaTypes.`application/json`, """{"animals":[{"jsonClass":"org.squbs.marshallers.json.Dog","name":"lucky"},""" + """{"jsonClass":"org.squbs.marshallers.json.Fish","weight":3.4}]}""") Marshal(animals).to[MessageEntity] map { _ shouldBe entity } Unmarshal(entity).to[Animals] map { _ shouldBe animals } } "Custom Example (inheritance)" should "have correct behaviour of read/write" in { implicit val formats = new Formats { val dateFormat: DateFormat = DefaultFormats.lossless.dateFormat override val typeHints = FullTypeHints(classOf[Fish] :: classOf[Dog] :: Nil) override val typeHintFieldName = "$type$" } val animals = Animals(Dog("lucky") :: Fish(3.4) :: Nil) val entity = HttpEntity(MediaTypes.`application/json`, """{"animals":[{"$type$":"org.squbs.marshallers.json.Dog","name":"lucky"},""" + """{"$type$":"org.squbs.marshallers.json.Fish","weight":3.4}]}""") Marshal(animals).to[MessageEntity] map { _ shouldBe entity } Unmarshal(entity).to[Animals] map { _ shouldBe animals } } }
Example 7
Source File: Json4sJacksonSpec.scala From squbs with Apache License 2.0 | 5 votes |
package org.squbs.marshallers.json import akka.actor.ActorSystem import akka.http.scaladsl.marshalling.Marshal import akka.http.scaladsl.model.{HttpEntity, MediaTypes, MessageEntity} import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.ActorMaterializer import org.json4s._ import org.scalatest.{AsyncFlatSpec, BeforeAndAfterAll, Matchers} class Json4sJacksonSpec extends AsyncFlatSpec with Matchers with BeforeAndAfterAll { import de.heikoseeberger.akkahttpjson4s.Json4sSupport._ implicit val system = ActorSystem("Json4sJacksonSpec") implicit val mat = ActorMaterializer() implicit val serialization = jackson.Serialization "NotTypeHints Example (case class)" should "have correct behaviour of read/write" in { implicit val formats = DefaultFormats.withHints(NoTypeHints) val playInfo = PlayerInfo("d", "k", 30) val entity = HttpEntity(MediaTypes.`application/json`, """{"firstName":"d","lastName":"k","age":30}""") Marshal(playInfo).to[MessageEntity] map { _ shouldBe entity } Unmarshal(entity).to[PlayerInfo] map { _ shouldBe playInfo } } "NotTypeHints Example (case class contain the other case class)" should "have correct behaviour of read/write" in { implicit val formats = DefaultFormats.withHints(NoTypeHints) val name = Player("d", "k") val playInfo = PlayerInfo2(name, 30) val entity = HttpEntity(MediaTypes.`application/json`, """{"name":{"firstName":"d","lastName":"k"},"age":30}""") Marshal(playInfo).to[MessageEntity] map { _ shouldBe entity } Unmarshal(entity).to[PlayerInfo2] map { _ shouldBe playInfo } } "ShortTypeHints Example (inheritance)" should "have correct behaviour of read/write" in { implicit val formats = DefaultFormats.withHints(ShortTypeHints(classOf[Dog] :: classOf[Fish] :: Nil)) val animals = Animals(Dog("pluto") :: Fish(1.2) :: Nil) val entity = HttpEntity(MediaTypes.`application/json`, """{"animals":[{"jsonClass":"Dog","name":"pluto"},{"jsonClass":"Fish","weight":1.2}]}""") Marshal(animals).to[MessageEntity] map { _ shouldBe entity } Unmarshal(entity).to[Animals] map { _ shouldBe animals } } "FullTypeHints Example (inheritance)" should "have correct behaviour of read/write" in { implicit val formats = DefaultFormats.withHints(FullTypeHints(classOf[Dog] :: classOf[Fish] :: Nil)) val animals = Animals(Dog("lucky") :: Fish(3.4) :: Nil) val entity = HttpEntity(MediaTypes.`application/json`, """{"animals":[{"jsonClass":"org.squbs.marshallers.json.Dog","name":"lucky"},""" + """{"jsonClass":"org.squbs.marshallers.json.Fish","weight":3.4}]}""") Marshal(animals).to[MessageEntity] map { _ shouldBe entity } Unmarshal(entity).to[Animals] map { _ shouldBe animals } } "Custom Example (inheritance)" should "have correct behaviour of read/write" in { implicit val formats = new Formats { val dateFormat = DefaultFormats.lossless.dateFormat override val typeHints = FullTypeHints(classOf[Fish] :: classOf[Dog] :: Nil) override val typeHintFieldName = "$type$" } val animals = Animals(Dog("lucky") :: Fish(3.4) :: Nil) val entity = HttpEntity(MediaTypes.`application/json`, """{"animals":[{"$type$":"org.squbs.marshallers.json.Dog","name":"lucky"},""" + """{"$type$":"org.squbs.marshallers.json.Fish","weight":3.4}]}""") Marshal(animals).to[MessageEntity] map { _ shouldBe entity } Unmarshal(entity).to[Animals] map { _ shouldBe animals } } override protected def afterAll(): Unit = system.terminate() } case class Player(firstName: String, lastName: String) case class PlayerInfo(firstName: String, lastName: String, age: Int) case class PlayerInfo2(name: Player, age: Int) trait Animal case class Dog(name: String) extends Animal case class Fish(weight: Double) extends Animal case class Animals(animals: List[Animal])
Example 8
Source File: CorsBenchmark.scala From akka-http-cors with Apache License 2.0 | 5 votes |
package ch.megard.akka.http.cors import java.util.concurrent.TimeUnit import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.Http.ServerBinding import akka.http.scaladsl.model.headers.{Origin, `Access-Control-Request-Method`} import akka.http.scaladsl.model.{HttpMethods, HttpRequest} import akka.http.scaladsl.server.Directives import akka.http.scaladsl.unmarshalling.Unmarshal import ch.megard.akka.http.cors.scaladsl.CorsDirectives import ch.megard.akka.http.cors.scaladsl.settings.CorsSettings import com.typesafe.config.ConfigFactory import org.openjdk.jmh.annotations._ import scala.concurrent.duration._ import scala.concurrent.{Await, ExecutionContext} @State(Scope.Benchmark) @OutputTimeUnit(TimeUnit.SECONDS) @BenchmarkMode(Array(Mode.Throughput)) class CorsBenchmark extends Directives with CorsDirectives { private val config = ConfigFactory.parseString("akka.loglevel = ERROR").withFallback(ConfigFactory.load()) implicit private val system: ActorSystem = ActorSystem("CorsBenchmark", config) implicit private val ec: ExecutionContext = scala.concurrent.ExecutionContext.global private val http = Http() private val corsSettings = CorsSettings.default private var binding: ServerBinding = _ private var request: HttpRequest = _ private var requestCors: HttpRequest = _ private var requestPreflight: HttpRequest = _ @Setup def setup(): Unit = { val route = { path("baseline") { get { complete("ok") } } ~ path("cors") { cors(corsSettings) { get { complete("ok") } } } } val origin = Origin("http://example.com") binding = Await.result(http.bindAndHandle(route, "127.0.0.1", 0), 1.second) val base = s"http://${binding.localAddress.getHostString}:${binding.localAddress.getPort}" request = HttpRequest(uri = base + "/baseline") requestCors = HttpRequest( method = HttpMethods.GET, uri = base + "/cors", headers = List(origin) ) requestPreflight = HttpRequest( method = HttpMethods.OPTIONS, uri = base + "/cors", headers = List(origin, `Access-Control-Request-Method`(HttpMethods.GET)) ) } @TearDown def shutdown(): Unit = { val f = for { _ <- http.shutdownAllConnectionPools() _ <- binding.terminate(1.second) _ <- system.terminate() } yield () Await.ready(f, 5.seconds) } @Benchmark def baseline(): Unit = { val f = http.singleRequest(request).flatMap(r => Unmarshal(r.entity).to[String]) assert(Await.result(f, 1.second) == "ok") } @Benchmark def default_cors(): Unit = { val f = http.singleRequest(requestCors).flatMap(r => Unmarshal(r.entity).to[String]) assert(Await.result(f, 1.second) == "ok") } @Benchmark def default_preflight(): Unit = { val f = http.singleRequest(requestPreflight).flatMap(r => Unmarshal(r.entity).to[String]) assert(Await.result(f, 1.second) == "") } }
Example 9
Source File: AkkaKubernetesSpec.scala From akka-kubernetes-tests with Apache License 2.0 | 5 votes |
package akka.kubernetes.sample import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.model.{HttpRequest, StatusCodes} import akka.http.scaladsl.unmarshalling.Unmarshal import akka.management.cluster.{ClusterHttpManagementJsonProtocol, ClusterMembers} import akka.stream.ActorMaterializer import org.scalatest.concurrent.{Eventually, ScalaFutures} import org.scalatest.time.{Seconds, Span} import org.scalatest.{BeforeAndAfterAll, Matchers, WordSpec} class AkkaKubernetesSpec extends WordSpec with BeforeAndAfterAll with ScalaFutures with Matchers with ClusterHttpManagementJsonProtocol with Eventually { implicit val system = ActorSystem() implicit val materializer = ActorMaterializer() implicit override val patienceConfig = PatienceConfig(timeout = Span(60, Seconds), interval = Span(2, Seconds)) val target = system.settings.config.getString("akka.k8s.target") val clusterSize = system.settings.config.getInt("akka.k8s.cluster-size") val deployedVersion = system.settings.config.getString("akka.k8s.deployment-version") val log = system.log log.info("Running with target {} clusterSize {} version {}", target, clusterSize, deployedVersion) "Version deployed" should { "should have been updated" in { eventually { val response = Http().singleRequest(HttpRequest(uri = s"$target/version")).futureValue val reportedVersion = Unmarshal(response.entity).to[String].futureValue log.info("Reported version is: {}", reportedVersion) reportedVersion shouldEqual deployedVersion } } } "Cluster formation" should { "work" in { eventually { val response = Http().singleRequest(HttpRequest(uri = s"$target/cluster/members")).futureValue response.status shouldEqual StatusCodes.OK val clusterMembers: ClusterMembers = Unmarshal(response).to[ClusterMembers].futureValue withClue("Latest response: " + clusterMembers) { clusterMembers.members.size shouldEqual clusterSize clusterMembers.unreachable shouldEqual Seq.empty } log.info("Current cluster members: {}", clusterMembers) } } } "Akka Boss (singleton)" should { "say hello" in { val response = Http().singleRequest(HttpRequest(uri = s"$target/boss")).futureValue response.status shouldEqual StatusCodes.OK } } "Akka members (sharding)" should { "do some work" in { val response = Http().singleRequest(HttpRequest(uri = s"$target/team-member/johan")).futureValue response.status shouldEqual StatusCodes.OK } } override protected def afterAll(): Unit = { system.terminate() } }
Example 10
Source File: ClusterSoakSpec.scala From akka-kubernetes-tests with Apache License 2.0 | 5 votes |
package akka.cluster.soak import akka.actor.ActorSystem import akka.discovery.ServiceDiscovery.Resolved import akka.event.Logging import akka.http.scaladsl.Http import akka.http.scaladsl.model.{HttpRequest, StatusCodes} import akka.http.scaladsl.unmarshalling.Unmarshal import akka.kubernetes.soak.Tests.{ResponseTimeNanos, Target} import akka.kubernetes.soak.{StatsJsonSupport, TestResults} import akka.stream.ActorMaterializer import akka.stream.scaladsl.{Sink, Source} import org.scalatest.concurrent.ScalaFutures import org.scalatest.time.{Seconds, Span} import org.scalatest.{Matchers, WordSpec} import akka.util.PrettyDuration._ import scala.collection.immutable import scala.concurrent.Future import scala.concurrent.duration._ class ClusterSoakSpec(endpoints: Resolved)(implicit system: ActorSystem) extends WordSpec with StatsJsonSupport with ScalaFutures with Matchers { import system.dispatcher implicit val mat = ActorMaterializer() implicit override val patienceConfig = PatienceConfig(timeout = Span(30, Seconds), interval = Span(2, Seconds)) val log = Logging(system, getClass) "The Clustered service" should { "not have had any failures" in { val responses: immutable.Seq[TestResults] = Source(endpoints.addresses) .mapAsyncUnordered(10) { rt => log.info("Hitting {}", rt.host) val request = HttpRequest(uri = s"http://${rt.host}:${rt.port.getOrElse(8080)}/stats") for { response <- Http().singleRequest(request) entity <- response.entity.toStrict(1.second) results <- response.status match { case StatusCodes.OK => Unmarshal(entity).to[TestResults] case unexpected => Future.failed( new RuntimeException(s"Unexpected response code: $unexpected body: ${entity.data.utf8String}") ) } } yield results } .runWith(Sink.seq) .futureValue log.info("{} nodes tested", responses.size) val maxJoinTimes = responses.map(_.joiningTime).sorted.reverse.take(5).map(_.nanos.pretty) log.info("Max join times: {}", maxJoinTimes) val maxResponseTimePerNode: immutable.Seq[(Target, ResponseTimeNanos)] = responses.map(_.lastResult.responses.maxBy(_._2)) val averageResponseTimesPerNode = responses .map((eachNode: TestResults) => { val total = eachNode.lastResult.responses.map(_._2).sum.nanos val count = eachNode.lastResult.responses.size total / count }) .sorted .reverse log.info("All response times: {}", responses) log.info("Slowest response times across all node pings: {}", maxResponseTimePerNode.sortBy(_._2).reverse.take(5).map(_._2.nanos.pretty)) log.info("Slowest average response times across all node pings: {}", averageResponseTimesPerNode.take(5).map(_.pretty)) responses.filter(_.testsFailed != 0) shouldEqual Nil withClue("Response took longer than 2 seconds. Do some investigation") { responses.filter(_.lastResult.responses.exists(_._2.nanos > 2.seconds)) shouldEqual Nil } withClue("Found unreachable events") { responses.filter(_.memberUnreachableEvents != 0) shouldEqual Nil } withClue("Found downed events") { responses.filter(_.memberDownedEvents != 0) shouldEqual Nil } } } }
Example 11
Source File: AkkaHttpTest.scala From fusion-data with Apache License 2.0 | 5 votes |
package mass.console import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.model._ import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.ActorMaterializer import scala.concurrent.Future case class SpidFacebookData( AppId: String, Type: String, Application: String, ExpiresAt: Long, IsValid: Boolean, IssuedAt: Long, Scopes: Array[String], UserId: String) class AkkaHttpTest { implicit val system = ActorSystem() implicit val mat = ActorMaterializer() import system.dispatcher val resultFuture: Future[HttpResponse] = Http().singleRequest( HttpRequest( HttpMethods.POST, "/api/signin", headers = List(headers.`Content-Type`(ContentTypes.`application/json`)), entity = """{"account":"[email protected]", "password": "yangbajing"}""")) resultFuture.flatMap(httpResponse => Unmarshal(httpResponse.entity).to[String]).foreach { str => println(str) } }
Example 12
Source File: AkkaHTTPClient.scala From learn-akka with Apache License 2.0 | 5 votes |
package com.allaboutscala.learn.akka.client import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.model.{MediaTypes, HttpEntity, HttpMethods, HttpRequest} import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.ActorMaterializer import akka.util.ByteString import com.allaboutscala.learn.akka.http.jsonsupport.{Donuts, JsonSupport} import scala.concurrent.{Await, Future} import scala.util.{Failure, Success} import scala.concurrent.duration._ object AkkaHttpClient extends App with JsonSupport { implicit val system = ActorSystem("akka-http-donuts-client") implicit val materializer = ActorMaterializer() implicit val ec = system.dispatcher // HTTP GET request val donutsUri = "http://localhost:8080/donuts" val donutsHttpRequest = HttpRequest( uri = donutsUri, method = HttpMethods.GET ) val donutsResponse = Http().singleRequest(donutsHttpRequest) donutsResponse .onComplete { case Success(donutsResponse) => println(s"Raw HttpResponse = $donutsResponse") // You obviously should not block using Await.result(...) and use flatMap or other similar future sequencing mechanics val donutsF: Future[Donuts] = Unmarshal(donutsResponse).to[Donuts] val donuts: Donuts = Await.result(donutsF, 5.second) println(s"Unmarshalled HttpResponse to Case Class = $donuts") case Failure(e) => println(s"Failed to HTTP GET $donutsUri, error = ${e.getMessage}") } Thread.sleep(3000) // HTTP POST request val jsonDonutInput = ByteString("""{"name":"plain donut", "price":1.50}""") val httpPostCreateDonut = HttpRequest( uri = "http://localhost:8080/create-donut", method = HttpMethods.POST, entity = HttpEntity(MediaTypes.`application/json`, jsonDonutInput)) val createDonutF = for { response <- Http().singleRequest(httpPostCreateDonut) _ = println(s"Akka HTTP request status = ${response.status}") if response.status.isSuccess() output <- Unmarshal(response).to[String] } yield println(s"HTTP POST request output = $output") Await.result(createDonutF, 5.second) system.terminate() }
Example 13
Source File: ExampleApp.scala From akka-http-json with Apache License 2.0 | 5 votes |
package de.heikoseeberger.akkahttpjackson import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.model.HttpRequest import akka.http.scaladsl.server.Directives import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.scaladsl.Source import scala.concurrent.Await import scala.concurrent.duration._ import scala.io.StdIn object ExampleApp { final case class Foo(bar: String) def main(args: Array[String]): Unit = { implicit val system = ActorSystem() // provide an implicit ObjectMapper if you want serialization/deserialization to use it // instead of a default ObjectMapper configured only with DefaultScalaModule provided // by JacksonSupport // // for example: // // implicit val objectMapper = new ObjectMapper() // .registerModule(DefaultScalaModule) // .registerModule(new GuavaModule()) Http().bindAndHandle(route, "127.0.0.1", 8000) StdIn.readLine("Hit ENTER to exit") Await.ready(system.terminate(), Duration.Inf) } def route(implicit sys: ActorSystem) = { import Directives._ import JacksonSupport._ pathSingleSlash { post { entity(as[Foo]) { foo => complete { foo } } } } ~ pathPrefix("stream") { post { entity(as[SourceOf[Foo]]) { fooSource: SourceOf[Foo] => complete(fooSource.throttle(1, 2.seconds)) } } ~ get { pathEndOrSingleSlash { complete( Source(0 to 5) .throttle(1, 1.seconds) .map(i => Foo(s"bar-$i")) ) } ~ pathPrefix("remote") { onSuccess(Http().singleRequest(HttpRequest(uri = "http://localhost:8000/stream"))) { response => complete(Unmarshal(response).to[SourceOf[Foo]]) } } } } } }
Example 14
Source File: PrometheusUtils.scala From kafka-lag-exporter with Apache License 2.0 | 5 votes |
package com.lightbend.kafkalagexporter.integration import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.model.{HttpRequest, HttpResponse, StatusCodes} import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.Materializer import com.lightbend.kafkalagexporter.MetricsSink.GaugeDefinition import org.scalatest.Matchers import org.scalatest.concurrent.ScalaFutures import org.slf4j.{Logger, LoggerFactory} import scala.concurrent.{ExecutionContext, Future} import scala.util.matching.Regex val regex = s"""$name\\{$labels.*\\}\\s+(-?.+)""".r log.debug(s"Created regex: {}", regex.pattern.toString) Rule(regex, assertion) } } case class Rule(regex: Regex, assertion: String => _) case class Result(rule: Rule, groupResults: List[String]) { def assertDne(): Unit = { log.debug(s"Rule: ${rule.regex.toString}") groupResults.length shouldBe 0 } def assert(): Unit = { log.debug(s"Rule: ${rule.regex.toString}") groupResults.length shouldBe 1 log.debug(s"Actual value is ${groupResults.head}") rule.assertion(groupResults.head) } } }
Example 15
Source File: ExampleApp.scala From akka-http-json with Apache License 2.0 | 5 votes |
package de.heikoseeberger.akkahttpavro4s import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.marshalling.Marshal import akka.http.scaladsl.model.{ HttpRequest, RequestEntity } import akka.http.scaladsl.server.Directives import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.scaladsl.Source import com.sksamuel.avro4s.{ FromRecord, SchemaFor, ToRecord } import scala.concurrent.Await import scala.concurrent.duration._ import scala.io.StdIn object ExampleApp { final object Foo { implicit val schemaFor = SchemaFor[Foo] implicit val toRecord = ToRecord[Foo] implicit val fromRecord = FromRecord[Foo] } final case class Foo(bar: String) def main(args: Array[String]): Unit = { implicit val system = ActorSystem() Http().bindAndHandle(route, "127.0.0.1", 8000) StdIn.readLine("Hit ENTER to exit") Await.ready(system.terminate(), Duration.Inf) } def route(implicit sys: ActorSystem) = { import AvroSupport._ import Directives._ pathSingleSlash { post { entity(as[Foo]) { foo => complete { foo } } } } ~ pathPrefix("stream") { post { entity(as[SourceOf[Foo]]) { fooSource: SourceOf[Foo] => import sys._ Marshal(Source.single(Foo("a"))).to[RequestEntity] complete(fooSource.throttle(1, 2.seconds)) } } ~ get { pathEndOrSingleSlash { complete( Source(0 to 5) .throttle(1, 1.seconds) .map(i => Foo(s"bar-$i")) ) } ~ pathPrefix("remote") { onSuccess(Http().singleRequest(HttpRequest(uri = "http://localhost:8000/stream"))) { response => complete(Unmarshal(response).to[SourceOf[Foo]]) } } } } } }
Example 16
Source File: ExampleApp.scala From akka-http-json with Apache License 2.0 | 5 votes |
package de.heikoseeberger.akkahttpjson4s import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.model.HttpRequest import akka.http.scaladsl.server.Directives import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.scaladsl.Source import org.json4s.{ DefaultFormats, jackson } import scala.concurrent.Await import scala.concurrent.duration._ import scala.io.StdIn object ExampleApp { final case class Foo(bar: String) def main(args: Array[String]): Unit = { implicit val system = ActorSystem() Http().bindAndHandle(route, "127.0.0.1", 8000) StdIn.readLine("Hit ENTER to exit") Await.ready(system.terminate(), Duration.Inf) } def route(implicit sys: ActorSystem) = { import Directives._ import Json4sSupport._ implicit val serialization = jackson.Serialization // or native.Serialization implicit val formats = DefaultFormats pathSingleSlash { post { entity(as[Foo]) { foo => complete { foo } } } } ~ pathPrefix("stream") { post { entity(as[SourceOf[Foo]]) { fooSource: SourceOf[Foo] => complete(fooSource.throttle(1, 2.seconds)) } } ~ get { pathEndOrSingleSlash { complete( Source(0 to 5) .throttle(1, 1.seconds) .map(i => Foo(s"bar-$i")) ) } ~ pathPrefix("remote") { onSuccess(Http().singleRequest(HttpRequest(uri = "http://localhost:8000/stream"))) { response => complete(Unmarshal(response).to[SourceOf[Foo]]) } } } } } }
Example 17
Source File: GenCodecSupportSpec.scala From akka-http-json with Apache License 2.0 | 5 votes |
package de.heikoseeberger.akkahttpavsystemgencodec import akka.actor.ActorSystem import akka.http.scaladsl.marshalling.Marshal import akka.http.scaladsl.model.ContentTypes.`application/json` import akka.http.scaladsl.model._ import akka.http.scaladsl.unmarshalling.Unmarshaller.UnsupportedContentTypeException import akka.http.scaladsl.unmarshalling.{ Unmarshal, Unmarshaller } import akka.stream.Materialzer import com.avsystem.commons.serialization.GenCodec import org.scalatest.{ AsyncWordSpec, BeforeAndAfterAll, Matchers } import scala.concurrent.Await import scala.concurrent.duration.DurationInt object GenCodecSupportSpec { final object Foo { implicit val codec: GenCodec[Foo] = GenCodec.materialize[Foo] } final case class Foo(bar: String) { require(bar == "bar", "bar must be 'bar'!") } } final class GenCodecSupportSpec extends AsyncWordSpec with Matchers with BeforeAndAfterAll { import GenCodecSupport._ import GenCodecSupportSpec._ private implicit val system = ActorSystem() private implicit val mat = Materialzer() "GenCodecSupport" should { "enable marshalling and unmarshalling of case classes" in { val foo = Foo("bar") Marshal(foo) .to[RequestEntity] .flatMap(Unmarshal(_).to[Foo]) .map(_ shouldBe foo) } "provide proper error messages for requirement errors" in { val entity = HttpEntity(MediaTypes.`application/json`, """{ "bar": "baz" }""") Unmarshal(entity) .to[Foo] .failed .map(_ should have message "requirement failed: bar must be 'bar'!") } "fail with NoContentException when unmarshalling empty entities" in { val entity = HttpEntity.empty(`application/json`) Unmarshal(entity) .to[Foo] .failed .map(_ shouldBe Unmarshaller.NoContentException) } "fail with UnsupportedContentTypeException when Content-Type is not `application/json`" in { val entity = HttpEntity("""{ "bar": "bar" }""") Unmarshal(entity) .to[Foo] .failed .map(_ shouldBe UnsupportedContentTypeException(`application/json`)) } "allow unmarshalling with passed in Content-Types" in { val foo = Foo("bar") val `application/json-home` = MediaType.applicationWithFixedCharset("json-home", HttpCharsets.`UTF-8`, "json-home") final object CustomGenCodecSupport extends GenCodecSupport { override def unmarshallerContentTypes = List(`application/json`, `application/json-home`) } import CustomGenCodecSupport._ val entity = HttpEntity(`application/json-home`, """{ "bar": "bar" }""") Unmarshal(entity).to[Foo].map(_ shouldBe foo) } } override protected def afterAll() = { Await.ready(system.terminate(), 42.seconds) super.afterAll() } }
Example 18
Source File: ExampleApp.scala From akka-http-json with Apache License 2.0 | 5 votes |
package de.heikoseeberger.akkahttpplayjson import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.model.HttpRequest import akka.http.scaladsl.server.Directives import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.scaladsl.Source import play.api.libs.json.{ Format, JsValue, Json } import scala.concurrent.Await import scala.concurrent.duration._ import scala.io.StdIn object ExampleApp { final object Foo { implicit val fooFormat: Format[Foo] = Json.format[Foo] } final case class Foo(bar: String) def main(args: Array[String]): Unit = { implicit val system = ActorSystem() Http().bindAndHandle(route, "127.0.0.1", 8000) StdIn.readLine("Hit ENTER to exit") Await.ready(system.terminate(), Duration.Inf) } def route(implicit sys: ActorSystem) = { import Directives._ import PlayJsonSupport._ implicit val prettyPrint: JsValue => String = Json.prettyPrint pathSingleSlash { post { entity(as[Foo]) { foo => complete { foo } } } } ~ pathPrefix("stream") { post { entity(as[SourceOf[Foo]]) { fooSource: SourceOf[Foo] => complete(fooSource.throttle(1, 2.seconds)) } } ~ get { pathEndOrSingleSlash { complete( Source(0 to 5) .throttle(1, 1.seconds) .map(i => Foo(s"bar-$i")) ) } ~ pathPrefix("remote") { onSuccess(Http().singleRequest(HttpRequest(uri = "http://localhost:8000/stream"))) { response => complete(Unmarshal(response).to[SourceOf[Foo]]) } } } } } }
Example 19
Source File: ExampleApp.scala From akka-http-json with Apache License 2.0 | 5 votes |
package de.heikoseeberger.akkahttpjsoniterscala import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.model.HttpRequest import akka.http.scaladsl.server.{ Directives, Route } import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.scaladsl.Source import scala.concurrent.Await import scala.concurrent.duration._ import scala.io.StdIn object ExampleApp { final case class Foo(bar: String) def main(args: Array[String]): Unit = { implicit val system: ActorSystem = ActorSystem() Http().bindAndHandle(route, "127.0.0.1", 8000) StdIn.readLine("Hit ENTER to exit") Await.ready(system.terminate(), Duration.Inf) } def route(implicit sys: ActorSystem): Route = { import Directives._ import JsoniterScalaSupport._ import com.github.plokhotnyuk.jsoniter_scala.core._ import com.github.plokhotnyuk.jsoniter_scala.macros._ // here you should provide implicit codecs for in/out messages of all routes implicit val codec: JsonValueCodec[Foo] = JsonCodecMaker.make[Foo](CodecMakerConfig) // also, you can provide an implicit reader/writer configs to override defaults: // // implicit val readerConfig = ReaderConfig.withThrowReaderExceptionWithStackTrace(true) // implicit val writerConfig = WriterConfig.withIndentionStep(2) pathSingleSlash { post { entity(as[Foo]) { foo => complete { foo } } } } ~ pathPrefix("stream") { post { entity(as[SourceOf[Foo]]) { fooSource: SourceOf[Foo] => complete(fooSource.throttle(1, 2.seconds)) } } ~ get { pathEndOrSingleSlash { complete( Source(0 to 5) .throttle(1, 1.seconds) .map(i => Foo(s"bar-$i")) ) } ~ pathPrefix("remote") { onSuccess(Http().singleRequest(HttpRequest(uri = "http://localhost:8000/stream"))) { response => complete(Unmarshal(response).to[SourceOf[Foo]]) } } } } } }
Example 20
Source File: JsoniterScalaSupportSpec.scala From akka-http-json with Apache License 2.0 | 5 votes |
package de.heikoseeberger.akkahttpjsoniterscala import akka.actor.ActorSystem import akka.http.scaladsl.marshalling.Marshal import akka.http.scaladsl.model.ContentTypes.{ `application/json`, `text/plain(UTF-8)` } import akka.http.scaladsl.model._ import akka.http.scaladsl.unmarshalling.Unmarshaller.UnsupportedContentTypeException import akka.http.scaladsl.unmarshalling.{ Unmarshal, Unmarshaller } import akka.stream.scaladsl.{ Sink, Source } import com.github.plokhotnyuk.jsoniter_scala.core.JsonValueCodec import com.github.plokhotnyuk.jsoniter_scala.macros._ import org.scalatest.BeforeAndAfterAll import scala.concurrent.Await import scala.concurrent.duration.DurationInt import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AsyncWordSpec object JsoniterScalaSupportSpec { final case class Foo(bar: String) { require(bar startsWith "bar", "bar must start with 'bar'!") } } final class JsoniterScalaSupportSpec extends AsyncWordSpec with Matchers with BeforeAndAfterAll { import JsoniterScalaSupport._ import JsoniterScalaSupportSpec._ private implicit val system: ActorSystem = ActorSystem() private implicit val codec: JsonValueCodec[Foo] = JsonCodecMaker.make[Foo](CodecMakerConfig) "JsoniterScalaSupport" should { "should enable marshalling and unmarshalling" in { val foo = Foo("bar") Marshal(foo) .to[RequestEntity] .flatMap(Unmarshal(_).to[Foo]) .map(_ shouldBe foo) } "enable streamed marshalling and unmarshalling for json arrays" in { val foos = (0 to 100).map(i => Foo(s"bar-$i")).toList Marshal(Source(foos)) .to[RequestEntity] .flatMap(entity => Unmarshal(entity).to[SourceOf[Foo]]) .flatMap(_.runWith(Sink.seq)) .map(_ shouldBe foos) } "provide proper error messages for requirement errors" in { val entity = HttpEntity(MediaTypes.`application/json`, """{ "bar": "baz" }""") Unmarshal(entity) .to[Foo] .failed .map(_ should have message "requirement failed: bar must start with 'bar'!") } "fail with NoContentException when unmarshalling empty entities" in { val entity = HttpEntity.empty(`application/json`) Unmarshal(entity) .to[Foo] .failed .map(_ shouldBe Unmarshaller.NoContentException) } "fail with UnsupportedContentTypeException when Content-Type is not `application/json`" in { val entity = HttpEntity("""{ "bar": "bar" }""") Unmarshal(entity) .to[Foo] .failed .map( _ shouldBe UnsupportedContentTypeException(Some(`text/plain(UTF-8)`), `application/json`) ) } "allow unmarshalling with passed in Content-Types" in { val foo = Foo("bar") val `application/json-home` = MediaType.applicationWithFixedCharset("json-home", HttpCharsets.`UTF-8`, "json-home") final object CustomJsoniterScalaSupport extends JsoniterScalaSupport { override def unmarshallerContentTypes: List[ContentTypeRange] = List(`application/json`, `application/json-home`) } import CustomJsoniterScalaSupport._ val entity = HttpEntity(`application/json-home`, """{ "bar": "bar" }""") Unmarshal(entity).to[Foo].map(_ shouldBe foo) } } override protected def afterAll(): Unit = { Await.ready(system.terminate(), 42.seconds) super.afterAll() } }
Example 21
Source File: ExampleApp.scala From akka-http-json with Apache License 2.0 | 5 votes |
package de.heikoseeberger.akkahttpargonaut import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.marshalling.Marshal import akka.http.scaladsl.model.{ HttpRequest, RequestEntity } import akka.http.scaladsl.server.Directives import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.scaladsl.Source import argonaut.Argonaut.casecodec1 import argonaut.CodecJson import scala.concurrent.Await import scala.concurrent.duration._ import scala.io.StdIn object ExampleApp { final object Foo { implicit val fooCodec: CodecJson[Foo] = casecodec1(Foo.apply, Foo.unapply)("bar") } final case class Foo(bar: String) def main(args: Array[String]): Unit = { implicit val system = ActorSystem() Http().bindAndHandle(route, "127.0.0.1", 8000) StdIn.readLine("Hit ENTER to exit") Await.ready(system.terminate(), Duration.Inf) } def route(implicit sys: ActorSystem) = { import ArgonautSupport._ import Directives._ pathSingleSlash { post { entity(as[Foo]) { foo => complete { foo } } } } ~ pathPrefix("stream") { post { entity(as[SourceOf[Foo]]) { fooSource: SourceOf[Foo] => import sys._ Marshal(Source.single(Foo("a"))).to[RequestEntity] complete(fooSource.throttle(1, 2.seconds)) } } ~ get { pathEndOrSingleSlash { complete( Source(0 to 5) .throttle(1, 1.seconds) .map(i => Foo(s"bar-$i")) ) } ~ pathPrefix("remote") { onSuccess(Http().singleRequest(HttpRequest(uri = "http://localhost:8000/stream"))) { response => complete(Unmarshal(response).to[SourceOf[Foo]]) } } } } } }
Example 22
Source File: UpickleCustomizationSupport.scala From akka-http-json with Apache License 2.0 | 5 votes |
package de.heikoseeberger.akkahttpupickle import akka.http.javadsl.common.JsonEntityStreamingSupport import akka.http.scaladsl.common.EntityStreamingSupport import akka.http.scaladsl.marshalling.{ Marshaller, Marshalling, ToEntityMarshaller } import akka.http.scaladsl.model.{ ContentTypeRange, HttpEntity, MediaType, MessageEntity } import akka.http.scaladsl.model.MediaTypes.`application/json` import akka.http.scaladsl.unmarshalling.{ FromEntityUnmarshaller, Unmarshal, Unmarshaller } import akka.http.scaladsl.util.FastFuture import akka.stream.scaladsl.{ Flow, Source } import akka.util.ByteString import UpickleCustomizationSupport._ import scala.collection.immutable.Seq import scala.concurrent.Future import scala.util.Try import scala.util.control.NonFatal // This companion object only exists for binary compatibility as adding methods with default implementations // (including val's as they create synthetic methods) is not compatible. private object UpickleCustomizationSupport { private def jsonStringUnmarshaller(support: UpickleCustomizationSupport) = Unmarshaller.byteStringUnmarshaller .forContentTypes(support.unmarshallerContentTypes: _*) .mapWithCharset { case (ByteString.empty, _) => throw Unmarshaller.NoContentException case (data, charset) => data.decodeString(charset.nioCharset.name) } private def jsonSourceStringMarshaller(support: UpickleCustomizationSupport) = Marshaller.oneOf(support.mediaTypes: _*)(support.sourceByteStringMarshaller) private def jsonStringMarshaller(support: UpickleCustomizationSupport) = Marshaller.oneOf(support.mediaTypes: _*)(Marshaller.stringMarshaller) } implicit def sourceMarshaller[A](implicit writes: apiInstance.Writer[A], support: JsonEntityStreamingSupport = EntityStreamingSupport.json() ): ToEntityMarshaller[SourceOf[A]] = jsonSourceStringMarshaller(this).compose(jsonSource[A]) }
Example 23
Source File: ExampleApp.scala From akka-http-json with Apache License 2.0 | 5 votes |
package de.heikoseeberger.akkahttpupickle import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.model.HttpRequest import akka.http.scaladsl.server.Directives import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.scaladsl.Source import scala.concurrent.Await import scala.concurrent.duration._ import scala.io.StdIn import upickle.default.{ ReadWriter, macroRW } object ExampleApp { final object Foo { implicit val rw: ReadWriter[Foo] = macroRW } final case class Foo(bar: String) def main(args: Array[String]): Unit = { implicit val system = ActorSystem() Http().bindAndHandle(route, "127.0.0.1", 8000) StdIn.readLine("Hit ENTER to exit") Await.ready(system.terminate(), Duration.Inf) } def route(implicit system: ActorSystem) = { import Directives._ import UpickleSupport._ pathSingleSlash { post { entity(as[Foo]) { foo => complete { foo } } } } ~ pathPrefix("stream") { post { entity(as[SourceOf[Foo]]) { fooSource: SourceOf[Foo] => complete(fooSource.throttle(1, 2.seconds)) } } ~ get { pathEndOrSingleSlash { complete( Source(0 to 5) .throttle(1, 1.seconds) .map(i => Foo(s"bar-$i")) ) } ~ pathPrefix("remote") { onSuccess(Http().singleRequest(HttpRequest(uri = "http://localhost:8000/stream"))) { response => complete(Unmarshal(response).to[SourceOf[Foo]]) } } } } } }
Example 24
Source File: UpickleSupportSpec.scala From akka-http-json with Apache License 2.0 | 5 votes |
package de.heikoseeberger.akkahttpupickle import akka.actor.ActorSystem import akka.http.scaladsl.marshalling.Marshal import akka.http.scaladsl.model.ContentTypes.{ `application/json`, `text/plain(UTF-8)` } import akka.http.scaladsl.model._ import akka.http.scaladsl.unmarshalling.Unmarshaller.UnsupportedContentTypeException import akka.http.scaladsl.unmarshalling.{ Unmarshal, Unmarshaller } import akka.stream.scaladsl.{ Sink, Source } import org.scalatest.BeforeAndAfterAll import scala.concurrent.Await import scala.concurrent.duration.DurationInt import upickle.default.{ ReadWriter, macroRW } import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AsyncWordSpec object UpickleSupportSpec { final object Foo { implicit val rw: ReadWriter[Foo] = macroRW } final case class Foo(bar: String) { require(bar startsWith "bar", "bar must start with 'bar'!") } } final class UpickleSupportSpec extends AsyncWordSpec with Matchers with BeforeAndAfterAll { import UpickleSupport._ import UpickleSupportSpec._ private implicit val system = ActorSystem() "UpickleSupport" should { "enable marshalling and unmarshalling of case classes" in { val foo = Foo("bar") Marshal(foo) .to[RequestEntity] .flatMap(Unmarshal(_).to[Foo]) .map(_ shouldBe foo) } "enable streamed marshalling and unmarshalling for json arrays" in { val foos = (0 to 100).map(i => Foo(s"bar-$i")).toList Marshal(Source(foos)) .to[RequestEntity] .flatMap(entity => Unmarshal(entity).to[SourceOf[Foo]]) .flatMap(_.runWith(Sink.seq)) .map(_ shouldBe foos) } "provide proper error messages for requirement errors" in { val entity = HttpEntity(MediaTypes.`application/json`, """{ "bar": "baz" }""") Unmarshal(entity) .to[Foo] .failed .map(_ should have message "requirement failed: bar must start with 'bar'!") } "fail with NoContentException when unmarshalling empty entities" in { val entity = HttpEntity.empty(`application/json`) Unmarshal(entity) .to[Foo] .failed .map(_ shouldBe Unmarshaller.NoContentException) } "fail with UnsupportedContentTypeException when Content-Type is not `application/json`" in { val entity = HttpEntity("""{ "bar": "bar" }""") Unmarshal(entity) .to[Foo] .failed .map( _ shouldBe UnsupportedContentTypeException(Some(`text/plain(UTF-8)`), `application/json`) ) } "allow unmarshalling with passed in Content-Types" in { val foo = Foo("bar") val `application/json-home` = MediaType.applicationWithFixedCharset("json-home", HttpCharsets.`UTF-8`, "json-home") final object CustomUpickleSupport extends UpickleSupport { override def unmarshallerContentTypes = List(`application/json`, `application/json-home`) } import CustomUpickleSupport._ val entity = HttpEntity(`application/json-home`, """{ "bar": "bar" }""") Unmarshal(entity).to[Foo].map(_ shouldBe foo) } } override protected def afterAll() = { Await.ready(system.terminate(), 42.seconds) super.afterAll() } }
Example 25
Source File: UpickleCustomizationSupportSpec.scala From akka-http-json with Apache License 2.0 | 5 votes |
package de.heikoseeberger.akkahttpupickle import akka.actor.ActorSystem import akka.http.scaladsl.marshalling.Marshal import akka.http.scaladsl.model.ContentTypes.{ `application/json`, `text/plain(UTF-8)` } import akka.http.scaladsl.model._ import akka.http.scaladsl.unmarshalling.Unmarshaller.UnsupportedContentTypeException import akka.http.scaladsl.unmarshalling.{ Unmarshal, Unmarshaller } import akka.stream.scaladsl.{ Sink, Source } import org.scalatest.BeforeAndAfterAll import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AsyncWordSpec import upickle.AttributeTagged import upickle.core.Visitor import scala.concurrent.Await import scala.concurrent.duration.DurationInt final class UpickleCustomizationSupportSpec extends AsyncWordSpec with Matchers with BeforeAndAfterAll { private implicit val system = ActorSystem() object FooApi extends AttributeTagged { override implicit val IntWriter: FooApi.Writer[Int] = new Writer[Int] { override def write0[V](out: Visitor[_, V], v: Int): V = out.visitString("foo", -1) } } object UpickleFoo extends UpickleCustomizationSupport { override type Api = FooApi.type override def api: FooApi.type = FooApi } import UpickleFoo._ "UpickleCustomizationSupport" should { "support custom configuration" in { Marshal(123) .to[RequestEntity] .flatMap(Unmarshal(_).to[String]) .map(_ shouldBe "foo") } } override protected def afterAll() = { Await.ready(system.terminate(), 42.seconds) super.afterAll() } }
Example 26
Source File: RestClient.scala From twitter4s with Apache License 2.0 | 5 votes |
package com.danielasfregola.twitter4s.http.clients.rest import akka.actor.ActorSystem import akka.http.scaladsl.model.{HttpRequest, HttpResponse} import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.{ActorMaterializer, Materializer} import com.danielasfregola.twitter4s.entities.{AccessToken, ConsumerToken, RateLimit, RatedData} import com.danielasfregola.twitter4s.http.clients.Client import com.danielasfregola.twitter4s.http.oauth.OAuth1Provider import scala.concurrent.Future private[twitter4s] class RestClient(val consumerToken: ConsumerToken, val accessToken: AccessToken)( implicit val system: ActorSystem) extends Client { lazy val oauthProvider = new OAuth1Provider(consumerToken, Some(accessToken)) private[twitter4s] implicit class RichRestHttpRequest(val request: HttpRequest) { implicit val materializer = ActorMaterializer() implicit val ec = materializer.executionContext def respondAs[T: Manifest]: Future[T] = for { requestWithAuth <- withOAuthHeader(None)(materializer)(request) t <- sendReceiveAs[T](requestWithAuth) } yield t def respondAsRated[T: Manifest]: Future[RatedData[T]] = for { requestWithAuth <- withOAuthHeader(None)(materializer)(request) t <- sendReceiveAsRated[T](requestWithAuth) } yield t def sendAsFormData: Future[Unit] = for { requestWithAuth <- withSimpleOAuthHeader(None)(materializer)(request) _ <- sendIgnoreResponse(requestWithAuth) } yield () } def sendIgnoreResponse(httpRequest: HttpRequest)(implicit system: ActorSystem, materializer: Materializer): Future[Unit] = { sendAndReceive(httpRequest, _ => Future.successful((): Unit)) } def sendReceiveAs[T: Manifest](httpRequest: HttpRequest)(implicit system: ActorSystem, materializer: Materializer): Future[T] = { implicit val ec = materializer.executionContext implicit val jsonSerialization = serialization sendAndReceive(httpRequest, response => Unmarshal(response.entity).to[T]) } def sendReceiveAsRated[T: Manifest](httpRequest: HttpRequest)(implicit system: ActorSystem, materializer: Materializer): Future[RatedData[T]] = { implicit val ec = materializer.executionContext implicit val jsonSerialization = serialization val unmarshallRated: HttpResponse => Future[RatedData[T]] = { response => val rate = RateLimit(response.headers) val data = Unmarshal(response.entity).to[T] data.map(d => RatedData(rate, d)) } sendAndReceive(httpRequest, unmarshallRated) } }
Example 27
Source File: VoiceFileBot.scala From telegram with Apache License 2.0 | 5 votes |
import akka.http.scaladsl.Http import akka.http.scaladsl.model.{HttpRequest, Uri} import akka.http.scaladsl.unmarshalling.Unmarshal import akka.util.ByteString import cats.instances.future._ import cats.syntax.functor._ import com.bot4s.telegram.api.declarative.Commands import com.bot4s.telegram.future.Polling import com.bot4s.telegram.methods._ import scala.concurrent.Future import scala.util.{Failure, Success} class VoiceFileBot(token: String) extends AkkaExampleBot(token) with Polling with Commands[Future] { onMessage { implicit msg => using(_.voice) { voice => request(GetFile(voice.fileId)).andThen({ case Success(file) => file.filePath match { case Some(filePath) => // See https://core.telegram.org/bots/api#getfile val url = s"https://api.telegram.org/file/bot${token}/${filePath}" for { res <- Http().singleRequest(HttpRequest(uri = Uri(url))) if res.status.isSuccess() bytes <- Unmarshal(res).to[ByteString] _ <- reply(s"File with ${bytes.size} bytes received.") } yield () case None => reply("No file_path was returned") } case Failure(e) => logger.error("Exception: " + e) // poor's man logging }).void } } }
Example 28
Source File: Registry.scala From kanadi with MIT License | 5 votes |
package org.zalando.kanadi.api import java.net.URI import defaults._ import akka.http.scaladsl.HttpExt import akka.http.scaladsl.model.headers.RawHeader import akka.http.scaladsl.model.{ContentTypes, HttpMethods, HttpRequest, Uri} import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.Materializer import com.typesafe.scalalogging.{Logger, LoggerTakingImplicit} import de.heikoseeberger.akkahttpcirce.ErrorAccumulatingCirceSupport._ import org.mdedetrich.webmodels.{FlowId, OAuth2TokenProvider} import org.mdedetrich.webmodels.RequestHeaders.`X-Flow-ID` import org.zalando.kanadi.models._ import scala.concurrent.{ExecutionContext, Future} case class Registry(baseUri: URI, oAuth2TokenProvider: Option[OAuth2TokenProvider] = None)(implicit kanadiHttpConfig: HttpConfig, http: HttpExt, materializer: Materializer) extends RegistryInterface { protected val logger: LoggerTakingImplicit[FlowId] = Logger.takingImplicit[FlowId](classOf[Registry]) private val baseUri_ = Uri(baseUri.toString) def partitionStrategies(implicit flowId: FlowId = randomFlowId(), executionContext: ExecutionContext): Future[List[PartitionStrategy]] = { val uri = baseUri_.withPath(baseUri_.path / "registry" / "partition-strategies") val baseHeaders = List(RawHeader(`X-Flow-ID`, flowId.value)) for { headers <- oAuth2TokenProvider match { case None => Future.successful(baseHeaders) case Some(futureProvider) => futureProvider.value().map { oAuth2Token => toHeader(oAuth2Token) +: baseHeaders } } request = HttpRequest(HttpMethods.GET, uri, headers) _ = logger.debug(request.toString) response <- http.singleRequest(request) result <- { if (response.status.isSuccess()) { Unmarshal(response.entity.httpEntity.withContentType(ContentTypes.`application/json`)) .to[List[PartitionStrategy]] } else processNotSuccessful(request, response) } } yield result } }
Example 29
Source File: HTTPResponseStream.scala From akka_streams_tutorial with MIT License | 5 votes |
package akkahttp import akka.NotUsed import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.common.{EntityStreamingSupport, JsonEntityStreamingSupport} import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import akka.http.scaladsl.model._ import akka.http.scaladsl.server.Directives.{complete, get, logRequestResult, path, _} import akka.http.scaladsl.server.Route import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.ThrottleMode import akka.stream.scaladsl.{Flow, Sink, Source} import com.typesafe.config.ConfigFactory import spray.json.DefaultJsonProtocol import scala.concurrent.Future import scala.concurrent.duration._ import scala.util.{Failure, Success} object HTTPResponseStream extends App with DefaultJsonProtocol with SprayJsonSupport { implicit val system = ActorSystem("HTTPResponseStream") implicit val executionContext = system.dispatcher //JSON Protocol and streaming support final case class ExamplePerson(name: String) implicit def examplePersonFormat = jsonFormat1(ExamplePerson.apply) implicit val jsonStreamingSupport: JsonEntityStreamingSupport = EntityStreamingSupport.json() val (address, port) = ("127.0.0.1", 8080) server(address, port) client(address, port) def client(address: String, port: Int): Unit = { val requestParallelism = ConfigFactory.load.getInt("akka.http.host-connection-pool.max-connections") val requests: Source[HttpRequest, NotUsed] = Source .fromIterator(() => Range(0, requestParallelism).map(i => HttpRequest(uri = Uri(s"http://$address:$port/download/$i"))).iterator ) // Run singleRequest and completely consume response elements def runRequestDownload(req: HttpRequest) = Http() .singleRequest(req) .flatMap { response => val unmarshalled: Future[Source[ExamplePerson, NotUsed]] = Unmarshal(response).to[Source[ExamplePerson, NotUsed]] val source: Source[ExamplePerson, Future[NotUsed]] = Source.futureSource(unmarshalled) source.via(processorFlow).runWith(printSink) } requests .mapAsync(requestParallelism)(runRequestDownload) .runWith(Sink.ignore) } val printSink = Sink.foreach[ExamplePerson] { each: ExamplePerson => println(s"Client processed element: $each") } val processorFlow: Flow[ExamplePerson, ExamplePerson, NotUsed] = Flow[ExamplePerson].map { each: ExamplePerson => { //println(s"Process: $each") each } } def server(address: String, port: Int): Unit = { def routes: Route = logRequestResult("httpecho") { path("download" / Segment) { id: String => get { println(s"Server received request with id: $id, stream response...") extractRequest { r: HttpRequest => val finishedWriting = r.discardEntityBytes().future onComplete(finishedWriting) { done => //Limit response by appending eg .take(5) val responseStream: Stream[ExamplePerson] = Stream.continually(ExamplePerson(s"request:$id")) complete(Source(responseStream).throttle(1, 1.second, 1, ThrottleMode.shaping)) } } } } } val bindingFuture = Http().bindAndHandle(routes, address, port) bindingFuture.onComplete { case Success(b) => println("Server started, listening on: " + b.localAddress) case Failure(e) => println(s"Server could not bind to: $address:$port. Exception message: ${e.getMessage}") system.terminate() } } }
Example 30
Source File: HttpRequestFactory.scala From hydra with Apache License 2.0 | 5 votes |
package hydra.ingest.http import akka.http.scaladsl.model.{HttpMethods, HttpRequest} import akka.http.scaladsl.server.directives.CodingDirectives import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.Materializer import hydra.core.ingest.RequestParams._ import hydra.core.ingest._ import hydra.core.transport.{AckStrategy, ValidationStrategy} import scala.concurrent.Future import scala.util.Success class HttpRequestFactory extends RequestFactory[HttpRequest] with CodingDirectives { override def createRequest(correlationId: String, request: HttpRequest)( implicit mat: Materializer ): Future[HydraRequest] = { implicit val ec = mat.executionContext lazy val vs = request.headers .find(_.lowercaseName() == HYDRA_VALIDATION_STRATEGY) .map(h => ValidationStrategy(h.value())) .getOrElse(ValidationStrategy.Strict) lazy val as = request.headers .find(_.lowercaseName() == HYDRA_ACK_STRATEGY) .map(h => AckStrategy(h.value())) .getOrElse(Success(AckStrategy.NoAck)) lazy val clientId = request.headers .find(_.lowercaseName() == HydraClientId) .map(_.value().toLowerCase) Unmarshal(request.entity).to[String].flatMap { payload => val dPayload = if (request.method == HttpMethods.DELETE) null else payload val metadata: Map[String, String] = request.headers.map(h => h.name.toLowerCase -> h.value).toMap Future .fromTry(as) .map(ack => HydraRequest(correlationId, dPayload, clientId, metadata, vs, ack) ) } } }
Example 31
Source File: AuthenticationProviderSTS.scala From rokku with Apache License 2.0 | 5 votes |
package com.ing.wbaa.rokku.proxy.provider import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.model.headers.RawHeader import akka.http.scaladsl.model.{ HttpRequest, StatusCodes, Uri } import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.Materializer import com.ing.wbaa.rokku.proxy.config.StsSettings import com.ing.wbaa.rokku.proxy.data.{ AwsRequestCredential, JsonProtocols, RequestId, User, UserRawJson } import com.ing.wbaa.rokku.proxy.handler.LoggerHandlerWithId import com.ing.wbaa.rokku.proxy.util.JwtToken import scala.concurrent.{ ExecutionContext, Future } trait AuthenticationProviderSTS extends JsonProtocols with JwtToken { private val logger = new LoggerHandlerWithId import AuthenticationProviderSTS.STSException import spray.json._ protected[this] implicit def system: ActorSystem protected[this] implicit def executionContext: ExecutionContext protected[this] implicit def materializer: Materializer protected[this] def stsSettings: StsSettings protected[this] def areCredentialsActive(awsRequestCredential: AwsRequestCredential)(implicit id: RequestId): Future[Option[User]] = { val QueryParameters = Map("accessKey" -> awsRequestCredential.accessKey.value) ++ awsRequestCredential.sessionToken.map(s => "sessionToken" -> s.value) val uri = stsSettings.stsBaseUri .withPath(Uri.Path("/isCredentialActive")) .withQuery(Uri.Query(QueryParameters)) Http() .singleRequest( HttpRequest(uri = uri) .addHeader(RawHeader("Authorization", createInternalToken)) .addHeader(RawHeader("x-rokku-request-id", id.value)) ) .flatMap { response => response.status match { case StatusCodes.OK => Unmarshal(response.entity).to[String].map { jsonString => Some(User(jsonString.parseJson.convertTo[UserRawJson])) } case StatusCodes.Forbidden => logger.error(s"User not authenticated " + s"with accessKey (${awsRequestCredential.accessKey.value}) " + s"and sessionToken (${awsRequestCredential.sessionToken})") Future.successful(None) case c => val msg = s"Received unexpected StatusCode ($c) for " + s"accessKey (${awsRequestCredential.accessKey.value}) " + s"and sessionToken (${awsRequestCredential.sessionToken})" logger.error(msg) Future.failed(STSException(msg)) } } } } object AuthenticationProviderSTS { final case class STSException(private val message: String, private val cause: Throwable = None.orNull) extends Exception(message, cause) }
Example 32
Source File: Error.scala From akka-http-oauth2-client with Apache License 2.0 | 5 votes |
package com.github.dakatsuka.akka.http.oauth2.client import akka.http.scaladsl.model.HttpResponse import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.Materializer import com.github.dakatsuka.akka.http.oauth2.client.utils.JsonUnmarshaller import io.circe.Decoder import scala.concurrent.{ ExecutionContext, Future } object Error { sealed abstract class Code(val value: String) case object InvalidRequest extends Code("invalid_request") case object InvalidClient extends Code("invalid_client") case object InvalidToken extends Code("invalid_token") case object InvalidGrant extends Code("invalid_grant") case object InvalidScope extends Code("invalid_scope") case object UnsupportedGrantType extends Code("unsupported_grant_type") case object Unknown extends Code("unknown") object Code { def fromString(code: String): Code = code match { case "invalid_request" => InvalidRequest case "invalid_client" => InvalidClient case "invalid_token" => InvalidToken case "invalid_grant" => InvalidGrant case "invalid_scope" => InvalidScope case "unsupported_grant_type" => UnsupportedGrantType case _ => Unknown } } class UnauthorizedException(val code: Code, val description: String, val response: HttpResponse) extends RuntimeException(s"$code: $description") object UnauthorizedException extends JsonUnmarshaller { case class UnauthorizedResponse(error: String, errorDescription: String) implicit def decoder: Decoder[UnauthorizedResponse] = Decoder.instance { c => for { error <- c.downField("error").as[String].right description <- c.downField("error_description").as[String].right } yield UnauthorizedResponse(error, description) } def fromHttpResponse(response: HttpResponse)(implicit ec: ExecutionContext, mat: Materializer): Future[UnauthorizedException] = { Unmarshal(response).to[UnauthorizedResponse].map { r => new UnauthorizedException(Code.fromString(r.error), r.errorDescription, response) } } } }
Example 33
Source File: AccessToken.scala From akka-http-oauth2-client with Apache License 2.0 | 5 votes |
package com.github.dakatsuka.akka.http.oauth2.client import akka.http.scaladsl.model.HttpResponse import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.Materializer import com.github.dakatsuka.akka.http.oauth2.client.utils.JsonUnmarshaller import io.circe.Decoder import scala.concurrent.Future case class AccessToken( accessToken: String, tokenType: String, expiresIn: Int, refreshToken: Option[String] ) object AccessToken extends JsonUnmarshaller { implicit def decoder: Decoder[AccessToken] = Decoder.instance { c => for { accessToken <- c.downField("access_token").as[String].right tokenType <- c.downField("token_type").as[String].right expiresIn <- c.downField("expires_in").as[Int].right refreshToken <- c.downField("refresh_token").as[Option[String]].right } yield AccessToken(accessToken, tokenType, expiresIn, refreshToken) } def apply(response: HttpResponse)(implicit mat: Materializer): Future[AccessToken] = { Unmarshal(response).to[AccessToken] } }
Example 34
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 35
Source File: OpenWhiskEventsTests.scala From openwhisk with Apache License 2.0 | 5 votes |
package org.apache.openwhisk.core.monitoring.metrics import akka.http.scaladsl.Http import akka.http.scaladsl.model.{HttpRequest, StatusCodes} import akka.http.scaladsl.unmarshalling.Unmarshal import com.typesafe.config.ConfigFactory import io.prometheus.client.CollectorRegistry import kamon.Kamon import org.junit.runner.RunWith import org.scalatest.junit.JUnitRunner import scala.concurrent.duration._ import scala.util.Try @RunWith(classOf[JUnitRunner]) class OpenWhiskEventsTests extends KafkaSpecBase { behavior of "Server" it should "start working http server" in { val httpPort = freePort() val globalConfig = system.settings.config val config = ConfigFactory.parseString(s""" | akka.kafka.consumer.kafka-clients { | bootstrap.servers = "localhost:$kafkaPort" | } | kamon { | metric { | tick-interval = 50 ms | optimistic-tick-alignment = no | } | } | whisk { | user-events { | port = $httpPort | rename-tags { | namespace = "ow_namespace" | } | } | } """.stripMargin).withFallback(globalConfig) CollectorRegistry.defaultRegistry.clear() val binding = OpenWhiskEvents.start(config).futureValue val res = get("localhost", httpPort, "/ping") res shouldBe Some(StatusCodes.OK, "pong") //Check if metrics using Kamon API gets included in consolidated Prometheus Kamon.counter("fooTest").withoutTags().increment(42) sleep(1.second) val metricRes = get("localhost", httpPort, "/metrics") metricRes.get._2 should include("fooTest") binding.unbind().futureValue } def get(host: String, port: Int, path: String = "/") = { val response = Try { Http() .singleRequest(HttpRequest(uri = s"http://$host:$port$path")) .futureValue }.toOption response.map { res => (res.status, Unmarshal(res).to[String].futureValue) } } }
Example 36
Source File: Xmlrpc.scala From xmlrpc with MIT License | 5 votes |
package xmlrpc import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.client.RequestBuilding._ import akka.http.scaladsl.marshallers.xml.ScalaXmlSupport._ import akka.http.scaladsl.model._ import akka.http.scaladsl.unmarshalling.{FromResponseUnmarshaller, Unmarshal} import akka.stream.Materializer import akka.util.Timeout import xmlrpc.protocol._ import scala.concurrent.{ExecutionContext, Future} import scala.xml.NodeSeq object Xmlrpc { import XmlrpcProtocol._ case class XmlrpcServer(fullAddress: String) { def uri: Uri = Uri(fullAddress) } def invokeMethod[P: Datatype, R: Datatype](name: String, parameter: P = Void) (implicit xmlrpcServer: XmlrpcServer, as: ActorSystem, ma: Materializer, ec: ExecutionContext, fc: Timeout): XmlrpcResponse[R] = { import XmlrpcResponse.AkkaHttpToXmlrpcResponse def unmarshall[A](f: Future[HttpResponse])(implicit um: FromResponseUnmarshaller[A]): Future[A] = f.flatMap(Unmarshal(_).to[A]) val request: NodeSeq = writeXmlRequest(name, parameter) val requestWithHeader: String = """<?xml version="1.0"?>""" + request.toString try { (Http().singleRequest(Post(xmlrpcServer.uri, request)) ~> unmarshall[NodeSeq]).asXmlrpcResponse[R] } catch { case t: Throwable => XmlrpcResponse(ConnectionError("An exception has been thrown by Spray", Some(t)).failures) } } }
Example 37
Source File: HttpMessageExtractors.scala From wix-http-testkit with MIT License | 5 votes |
package com.wix.e2e.http.client.extractors import akka.http.scaladsl.model.{HttpEntity, HttpMessage} import akka.http.scaladsl.unmarshalling.{Unmarshal, Unmarshaller} import com.wix.e2e.http.WixHttpTestkitResources import com.wix.e2e.http.api.Marshaller import com.wix.e2e.http.utils.waitFor import scala.concurrent.duration._ trait HttpMessageExtractors { implicit class HttpMessageExtractorsOps[M <: HttpMessage](message: M) { def extractAs[T : Manifest](implicit marshaller: Marshaller = Marshaller.Implicits.marshaller, atMost: FiniteDuration = 5.seconds): T = message.entity.extractAs[T] def extractAsString(implicit atMost: FiniteDuration = 5.seconds): String = message.entity.extractAsString def extractAsBytes(implicit atMost: FiniteDuration = 5.seconds): Array[Byte] = message.entity.extractAsBytes } implicit class HttpEntityExtractorsOps[E <: HttpEntity](entity: E) { def extractAs[T : Manifest](implicit marshaller: Marshaller = Marshaller.Implicits.marshaller, atMost: FiniteDuration = 5.seconds): T = marshaller.unmarshall[T](extract[String]) def extractAsString(implicit atMost: FiniteDuration = 5.seconds): String = extract[String] def extractAsBytes(implicit atMost: FiniteDuration = 5.seconds): Array[Byte] = extract[Array[Byte]] import WixHttpTestkitResources.materializer private def extract[T](implicit um: Unmarshaller[E, T], atMost: FiniteDuration) = waitFor(Unmarshal(entity).to[T])(atMost) } } object HttpMessageExtractors extends HttpMessageExtractors
Example 38
Source File: UnMarshalling.scala From introduction-to-akkahttp with Apache License 2.0 | 5 votes |
package com.shashank.akkahttp.basic.routing import akka.actor.ActorSystem import akka.http.scaladsl.marshalling.Marshal import akka.http.scaladsl.model.{HttpMethods, HttpRequest, HttpResponse, MessageEntity} import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.{ActorMaterializer, Materializer} import akka.util.ByteString import scala.concurrent.Await import scala.concurrent.duration._ import scala.concurrent.ExecutionContext.Implicits.global import spray.json._ object UnMarshalling { def main(args: Array[String]) { implicit val sys = ActorSystem("IntroductionToAkkaHttp") implicit val mat:Materializer = ActorMaterializer() //type FromStringUnmarshaller[T] = Unmarshaller[String, T] val intFuture = Unmarshal("42").to[Int] val int = Await.result(intFuture, 1.second) println("int unmarshalling "+int) //type FromStringUnmarshaller[T] = Unmarshaller[String, T] val boolFuture = Unmarshal("off").to[Boolean] val bool = Await.result(boolFuture, 1.second) println("off unmarshalling "+bool) //type ToEntityMarshaller[T] = Marshaller[T, MessageEntity] val string = "Yeah" val entityFuture = Marshal(string).to[MessageEntity] val entity = Await.result(entityFuture, 1.second) // don't block in non-test code! println(entity) //type ToResponseMarshaller[T] = Marshaller[T, HttpResponse] val errorMsg = "Not found, pal!" val responseFuture = Marshal(404 -> errorMsg).to[HttpResponse] val response = Await.result(responseFuture, 1.second) println(response) //type FromEntityUnmarshaller[T] = Unmarshaller[HttpEntity, T] val jsonByteString = ByteString("""{"name":"Hello"}""") val httpRequest = HttpRequest(HttpMethods.POST, entity = jsonByteString) val jsonDataUnmarshalledFuture = Unmarshal(httpRequest).to[String] val jsonDataUnmarshalled = Await.result(jsonDataUnmarshalledFuture, 1.second) println(jsonDataUnmarshalled) sys.terminate() } }
Example 39
Source File: QrCodesBot.scala From telegram with Apache License 2.0 | 5 votes |
import java.net.URLEncoder import akka.http.scaladsl.Http import akka.http.scaladsl.model.{HttpRequest, Uri} import akka.http.scaladsl.unmarshalling.Unmarshal import akka.util.ByteString import com.bot4s.telegram.api.declarative.Commands import com.bot4s.telegram.api._ import com.bot4s.telegram.future.Polling import com.bot4s.telegram.methods._ import com.bot4s.telegram.models.AkkaInputFile import scala.concurrent.Future class QrCodesBot(token: String) extends AkkaExampleBot(token) with Polling with Commands[Future] with ChatActions[Future] { // Multiple variants onCommand('qr | 'qrcode | 'qr_code) { implicit msg => withArgs { args => val url = "https://api.qrserver.com/v1/create-qr-code/?data=" + URLEncoder.encode(args mkString " ", "UTF-8") for { response <- Http().singleRequest(HttpRequest(uri = Uri(url))) if response.status.isSuccess() bytes <- Unmarshal(response).to[ByteString] photo = AkkaInputFile("qrcode.png", bytes) _ <- uploadingPhoto // Hint the user _ <- request(SendPhoto(msg.source, photo)) } yield () } } }
Example 40
Source File: TestResponseFromUnsupportedApis.scala From ohara with Apache License 2.0 | 5 votes |
package oharastream.ohara.configurator import java.util.concurrent.TimeUnit import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._ import akka.http.scaladsl.model.{HttpMethod, HttpMethods, HttpRequest} import akka.http.scaladsl.unmarshalling.Unmarshal import oharastream.ohara.client.configurator.ErrorApi import oharastream.ohara.common.rule.OharaTest import oharastream.ohara.common.util.{CommonUtils, Releasable} import org.junit.{After, Test} import org.scalatest.matchers.should.Matchers._ import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration.Duration import scala.concurrent.{Await, Future} class TestResponseFromUnsupportedApis extends OharaTest { private[this] val configurator = Configurator.builder.fake().build() private[this] implicit val actorSystem: ActorSystem = ActorSystem("Executor-TestResponseFromUnsupportedApis") private[this] val expectedMessage = oharastream.ohara.configurator.route.apiUrl private[this] def result[T](f: Future[T]): T = Await.result(f, Duration(20, TimeUnit.SECONDS)) @Test def testGet(): Unit = sendRequest(HttpMethods.GET, CommonUtils.randomString()).apiUrl.get shouldBe expectedMessage @Test def testPut(): Unit = sendRequest(HttpMethods.PUT, CommonUtils.randomString()).apiUrl.get shouldBe expectedMessage @Test def testDelete(): Unit = sendRequest(HttpMethods.DELETE, CommonUtils.randomString()).apiUrl.get shouldBe expectedMessage @Test def testPost(): Unit = sendRequest(HttpMethods.POST, CommonUtils.randomString()).apiUrl.get shouldBe expectedMessage private[this] def sendRequest(method: HttpMethod, postfix: String): ErrorApi.Error = result( Http() .singleRequest(HttpRequest(method, s"http://${configurator.hostname}:${configurator.port}/$postfix")) .flatMap { response => if (response.status.isSuccess()) Future.failed(new AssertionError()) else Unmarshal(response.entity).to[ErrorApi.Error] } ) @After def tearDown(): Unit = { Releasable.close(configurator) result(actorSystem.terminate()) } }
Example 41
Source File: WebhookBot.scala From telegram with Apache License 2.0 | 5 votes |
import java.net.URLEncoder import akka.http.scaladsl.Http import akka.http.scaladsl.model.{HttpRequest, Uri} import akka.http.scaladsl.unmarshalling.Unmarshal import com.bot4s.telegram.api.Webhook import com.bot4s.telegram.methods._ import com.bot4s.telegram.models.Message import scala.concurrent.Future class WebhookBot(token: String) extends AkkaExampleBot(token) with Webhook { val port = 8080 val webhookUrl = "https://88c444ab.ngrok.io" val baseUrl = "http://api.mathjs.org/v1/?expr=" override def receiveMessage(msg: Message): Future[Unit] = { msg.text.fold(Future.successful(())) { text => val url = baseUrl + URLEncoder.encode(text, "UTF-8") for { res <- Http().singleRequest(HttpRequest(uri = Uri(url))) if res.status.isSuccess() result <- Unmarshal(res).to[String] _ <- request(SendMessage(msg.source, result)) } yield () } } }
Example 42
Source File: YetAnotherAkkaClient.scala From telegram with Apache License 2.0 | 5 votes |
package com.bot4s.telegram.clients import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.marshalling.Marshal import akka.http.scaladsl.model.Uri.Path import akka.http.scaladsl.model._ import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.Materializer import akka.stream.scaladsl.{Sink, Source} import cats.instances.future._ import com.bot4s.telegram.api.RequestHandler import com.bot4s.telegram.methods.{Request, Response} import io.circe.{Decoder, Encoder} import slogging.StrictLogging import com.bot4s.telegram.marshalling.responseDecoder import scala.concurrent.{ExecutionContext, Future} class YetAnotherAkkaClient(token: String, telegramHost: String = "api.telegram.org") (implicit system: ActorSystem, materializer: Materializer, ec: ExecutionContext) extends RequestHandler[Future] with StrictLogging { private val flow = Http().outgoingConnectionHttps(telegramHost) import com.bot4s.telegram.marshalling.AkkaHttpMarshalling._ override def sendRequest[R, T <: Request[_]](request: T)(implicit encT: Encoder[T], decR: Decoder[R]): Future[R] = { Source.fromFuture( Marshal(request).to[RequestEntity] .map { re => HttpRequest(HttpMethods.POST, Uri(path = Path(s"/bot$token/" + request.methodName)), entity = re) }) .via(flow) .mapAsync(1)(r => Unmarshal(r.entity).to[Response[R]]) .runWith(Sink.head) .map(processApiResponse[R]) } }
Example 43
Source File: AkkaHttpClient.scala From telegram with Apache License 2.0 | 5 votes |
package com.bot4s.telegram.clients import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.marshalling._ import akka.http.scaladsl.model._ import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.Materializer import cats.instances.future._ import com.bot4s.telegram.api.RequestHandler import com.bot4s.telegram.marshalling.AkkaHttpMarshalling import com.bot4s.telegram.marshalling._ import com.bot4s.telegram.methods.{Request, Response} import io.circe.{Decoder, Encoder} import slogging.StrictLogging import scala.concurrent.{ExecutionContext, Future} class AkkaHttpClient(token: String, telegramHost: String = "api.telegram.org") (implicit system: ActorSystem, materializer: Materializer, ec: ExecutionContext) extends RequestHandler[Future] with StrictLogging { import AkkaHttpMarshalling._ private val apiBaseUrl = s"https://$telegramHost/bot$token/" private val http = Http() override def sendRequest[R, T <: Request[_]](request: T)(implicit encT: Encoder[T], decR: Decoder[R]): Future[R] = { Marshal(request).to[RequestEntity] .map { re => HttpRequest(HttpMethods.POST, Uri(apiBaseUrl + request.methodName), entity = re) } .flatMap(http.singleRequest(_)) .flatMap(r => Unmarshal(r.entity).to[Response[R]]) .map(t => processApiResponse[R](t)) } }
Example 44
Source File: MarathonApiServiceDiscovery.scala From akka-management with Apache License 2.0 | 5 votes |
package akka.discovery.marathon import java.net.InetAddress import akka.actor.ActorSystem import akka.discovery._ import akka.http.scaladsl._ import akka.http.scaladsl.model._ import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.ActorMaterializer import scala.collection.immutable.Seq import scala.concurrent.Future import scala.concurrent.duration.FiniteDuration import scala.util.Try import AppList._ import JsonFormat._ import akka.annotation.ApiMayChange import akka.discovery.ServiceDiscovery.{ Resolved, ResolvedTarget } import akka.event.Logging @ApiMayChange object MarathonApiServiceDiscovery { @ApiMayChange class MarathonApiServiceDiscovery(system: ActorSystem) extends ServiceDiscovery { import MarathonApiServiceDiscovery._ import system.dispatcher private val log = Logging(system, getClass) private val http = Http()(system) private val settings = Settings(system) private implicit val mat: ActorMaterializer = ActorMaterializer()(system) override def lookup(lookup: Lookup, resolveTimeout: FiniteDuration): Future[Resolved] = { val uri = Uri(settings.appApiUrl).withQuery( Uri.Query( "embed" -> "apps.tasks", "embed" -> "apps.deployments", "label" -> settings.appLabelQuery.format(lookup.serviceName))) val request = HttpRequest(uri = uri) log.info("Requesting seed nodes by: {}", request.uri) val portName = lookup.portName match { case Some(name) => name case None => settings.appPortName } for { response <- http.singleRequest(request) entity <- response.entity.toStrict(resolveTimeout) appList <- { log.debug("Marathon API entity: [{}]", entity.data.utf8String) val unmarshalled = Unmarshal(entity).to[AppList] unmarshalled.failed.foreach { _ => log.error( "Failed to unmarshal Marathon API response status [{}], entity: [{}], uri: [{}]", response.status.value, entity.data.utf8String, uri) } unmarshalled } } yield Resolved(lookup.serviceName, targets(appList, portName)) } }
Example 45
Source File: MultiDcSpec.scala From akka-management with Apache License 2.0 | 5 votes |
package akka.management.cluster import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.model.{ HttpRequest, StatusCodes } import akka.http.scaladsl.unmarshalling.Unmarshal import akka.management.scaladsl.ManagementRouteProviderSettings import akka.stream.ActorMaterializer import akka.testkit.SocketUtil import com.typesafe.config.ConfigFactory import org.scalatest.{ Matchers, WordSpec } import org.scalatest.concurrent.{ Eventually, ScalaFutures } import org.scalatest.time.{ Millis, Seconds, Span } class MultiDcSpec extends WordSpec with Matchers with ScalaFutures with ClusterHttpManagementJsonProtocol with Eventually { implicit val patience: PatienceConfig = PatienceConfig(timeout = Span(10, Seconds), interval = Span(50, Millis)) val config = ConfigFactory.parseString( """ |akka.actor.provider = "cluster" |akka.remote.log-remote-lifecycle-events = off |akka.remote.netty.tcp.hostname = "127.0.0.1" |#akka.loglevel = DEBUG """.stripMargin ) "Http cluster management" must { "allow multiple DCs" in { val Vector(httpPortA, portA, portB) = SocketUtil.temporaryServerAddresses(3, "127.0.0.1").map(_.getPort) val dcA = ConfigFactory.parseString( s""" |akka.management.http.hostname = "127.0.0.1" |akka.management.http.port = $httpPortA |akka.cluster.seed-nodes = ["akka.tcp://[email protected]:$portA"] |akka.cluster.multi-data-center.self-data-center = "DC-A" |akka.remote.netty.tcp.port = $portA """.stripMargin ) val dcB = ConfigFactory.parseString( s""" |akka.cluster.seed-nodes = ["akka.tcp://[email protected]:$portA"] |akka.cluster.multi-data-center.self-data-center = "DC-B" |akka.remote.netty.tcp.port = $portB """.stripMargin ) implicit val dcASystem = ActorSystem("MultiDcSystem", config.withFallback(dcA)) val dcBSystem = ActorSystem("MultiDcSystem", config.withFallback(dcB)) implicit val materializer = ActorMaterializer() val routeSettings = ManagementRouteProviderSettings(selfBaseUri = s"http://127.0.0.1:$httpPortA", readOnly = false) try { Http() .bindAndHandle(ClusterHttpManagementRouteProvider(dcASystem).routes(routeSettings), "127.0.0.1", httpPortA) .futureValue eventually { val response = Http().singleRequest(HttpRequest(uri = s"http://127.0.0.1:$httpPortA/cluster/members")).futureValue response.status should equal(StatusCodes.OK) val members = Unmarshal(response.entity).to[ClusterMembers].futureValue members.members.size should equal(2) members.members.map(_.status) should equal(Set("Up")) } } finally { dcASystem.terminate() dcBSystem.terminate() } } } }
Example 46
Source File: WolframServiceImpl.scala From lagom-on-kube with Apache License 2.0 | 5 votes |
package me.alexray.wolfram.impl import java.net.URLEncoder import akka.NotUsed import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.model.{HttpRequest, Uri} import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.Materializer import akka.util.ByteString import com.lightbend.lagom.scaladsl.api.ServiceCall import me.alexray.wolfram.api.WolframService import play.api.Configuration import scala.concurrent.{ExecutionContext, Future} class WolframServiceImpl(config: Configuration) (implicit system: ActorSystem, mat: Materializer, ec: ExecutionContext) extends WolframService { val appID = config.underlying.getString("wolfram.appid") val apiUrl = s"http://api.wolframalpha.com/v2/" override def query(q: String): ServiceCall[NotUsed, String] = ServiceCall { _ => val url = apiUrl + s"query?appid=$appID&input=" + URLEncoder.encode(q, "UTF-8") for { response <- Http().singleRequest(HttpRequest(uri = Uri(url))) if response.status.isSuccess() data <- Unmarshal(response).to[String] } yield data } override def simple(q: String): ServiceCall[NotUsed, Array[Byte]] = ServiceCall { _ => println(s"quetions = '$q'") val url = apiUrl + s"simple?appid=$appID&input=" + URLEncoder.encode(q, "UTF-8").replace("+", "%20") println(s"url = '$url'") for { response <- Http().singleRequest(HttpRequest(uri = Uri(url))) if response.status.isSuccess() bytes <- Unmarshal(response).to[ByteString] } yield { println(s"received image ${bytes.size} bytes long") bytes.toArray } } }
Example 47
Source File: AkkaHttpLambdaHandler.scala From scala-server-lambda with MIT License | 5 votes |
package io.github.howardjohn.lambda.akka import akka.actor.ActorSystem import akka.http.scaladsl.model.HttpHeader.ParsingResult import akka.http.scaladsl.model._ import akka.http.scaladsl.server.Route import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.ActorMaterializer import akka.stream.scaladsl.{Keep, Sink, Source} import io.github.howardjohn.lambda.ProxyEncoding._ import io.github.howardjohn.lambda.{LambdaHandler, ProxyEncoding} import scala.concurrent.duration.Duration import scala.concurrent.{Await, ExecutionContext, Future} class AkkaHttpLambdaHandler(route: Route)( implicit system: ActorSystem, materializer: ActorMaterializer, ec: ExecutionContext ) extends LambdaHandler { import AkkaHttpLambdaHandler._ override def handleRequest(request: ProxyRequest): ProxyResponse = Await.result(runRequest(proxyToAkkaRequest(request)), Duration.Inf) private def runRequest(request: HttpRequest): Future[ProxyResponse] = { val source = Source.single(request) val sink = Sink.head[HttpResponse] source .via(route) .toMat(sink)(Keep.right) .run() .flatMap(asProxyResponse) } private def proxyToAkkaRequest(request: ProxyRequest): HttpRequest = new HttpRequest( method = parseHttpMethod(request.httpMethod), uri = Uri(ProxyEncoding.reconstructPath(request)), headers = parseRequestHeaders(request.headers.getOrElse(Map.empty)), entity = parseEntity(request.headers.getOrElse(Map.empty), request.body), protocol = HttpProtocols.`HTTP/1.1` ) private def parseEntity(headers: Map[String, String], body: Option[String]): MessageEntity = { val defaultContentType = ContentTypes.`text/plain(UTF-8)` val contentType = ContentType .parse(headers.getOrElse("Content-Type", defaultContentType.value)) .getOrElse(defaultContentType) body match { case Some(b) => HttpEntity(contentType, b.getBytes) case None => HttpEntity.empty(contentType) } } private def asProxyResponse(resp: HttpResponse): Future[ProxyResponse] = Unmarshal(resp.entity) .to[String] .map { body => ProxyResponse( resp.status.intValue(), resp.headers.map(h => h.name -> h.value).toMap, body ) } } private object AkkaHttpLambdaHandler { private def parseRequestHeaders(headers: Map[String, String]): List[HttpHeader] = headers.map { case (k, v) => HttpHeader.parse(k, v) match { case ParsingResult.Ok(header, _) => header case ParsingResult.Error(err) => throw new RuntimeException(s"Failed to parse header $k:$v with error $err.") } }.toList private def parseHttpMethod(method: String) = method.toUpperCase match { case "CONNECT" => HttpMethods.CONNECT case "DELETE" => HttpMethods.DELETE case "GET" => HttpMethods.GET case "HEAD" => HttpMethods.HEAD case "OPTIONS" => HttpMethods.OPTIONS case "PATCH" => HttpMethods.PATCH case "POST" => HttpMethods.POST case "PUT" => HttpMethods.PUT case "TRACE" => HttpMethods.TRACE case other => HttpMethod.custom(other) } }
Example 48
Source File: GraphQlClientImpl.scala From graphcool-framework with Apache License 2.0 | 5 votes |
package cool.graph.graphql import akka.actor.ActorSystem import akka.http.scaladsl.HttpExt import akka.http.scaladsl.model.HttpHeader.ParsingResult.Ok import akka.http.scaladsl.model._ import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.ActorMaterializer import play.api.libs.json.Json import scala.concurrent.Future case class GraphQlClientImpl(uri: String, headers: Map[String, String], akkaHttp: HttpExt)( implicit system: ActorSystem, materializer: ActorMaterializer ) extends GraphQlClient { import system.dispatcher def sendQuery(query: String): Future[GraphQlResponse] = { val body = Json.obj("query" -> query) val entity = HttpEntity(ContentTypes.`application/json`, body.toString) val akkaHeaders = headers .flatMap { case (key, value) => HttpHeader.parse(key, value) match { case Ok(header, _) => Some(header) case _ => None } } .to[collection.immutable.Seq] val akkaRequest = HttpRequest( uri = uri, method = HttpMethods.POST, entity = entity, headers = akkaHeaders ) akkaHttp.singleRequest(akkaRequest).flatMap(convertResponse) } private def convertResponse(akkaResponse: HttpResponse): Future[GraphQlResponse] = { Unmarshal(akkaResponse).to[String].map { bodyString => GraphQlResponse(akkaResponse.status.intValue, bodyString) } } }
Example 49
Source File: EthereumGethSpout.scala From Raphtory with Apache License 2.0 | 5 votes |
package com.raphtory.examples.blockchain.spouts import java.net.InetAddress import java.util.NoSuchElementException import com.raphtory.core.components.Spout.SpoutTrait import com.raphtory.core.utils.Utils import com.raphtory.tests.EtherAPITest.baseRequest import com.raphtory.tests.EtherAPITest.currentBlock import com.raphtory.tests.EtherAPITest.request import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration.Duration import scala.concurrent.duration.MILLISECONDS import scala.concurrent.duration.NANOSECONDS import scala.concurrent.duration.SECONDS import scala.language.postfixOps import scala.sys.process._ import scalaj.http.Http import scalaj.http.HttpRequest import spray.json._ import akka.http.scaladsl.unmarshalling.Unmarshal import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._ import akka.stream.ActorMaterializer import spray.json.DefaultJsonProtocol._ import scala.concurrent.duration._ import scala.concurrent.Await case class EthResult(blockHash:Option[String],blockNumber:Option[String],from:Option[String],gas:Option[String],gasPrice:Option[String],hash:Option[String],input:Option[String],nonce:Option[String],r:Option[String],s:Option[String],to:Option[String],transactionIndex:Option[String],v:Option[String],value:Option[String]) case class EthTransaction(id:Option[String],jsonrpc:Option[String],result:EthResult) class EthereumGethSpout extends SpoutTrait { var currentBlock = System.getenv().getOrDefault("SPOUT_ETHEREUM_START_BLOCK_INDEX", "9014194").trim.toInt var highestBlock = System.getenv().getOrDefault("SPOUT_ETHEREUM_MAXIMUM_BLOCK_INDEX", "10026447").trim.toInt val nodeIP = System.getenv().getOrDefault("SPOUT_ETHEREUM_IP_ADDRESS", "127.0.0.1").trim val nodePort = System.getenv().getOrDefault("SPOUT_ETHEREUM_PORT", "8545").trim val baseRequest = requestBuilder() implicit val materializer = ActorMaterializer() implicit val EthFormat = jsonFormat14(EthResult) implicit val EthTransactionFormat = jsonFormat3(EthTransaction) if (nodeIP.matches(Utils.IPRegex)) println(s"Connecting to Ethereum RPC \n Address:$nodeIP \n Port:$nodePort") else println(s"Connecting to Ethereum RPC \n Address:${hostname2Ip(nodeIP)} \n Port:$nodePort") override protected def ProcessSpoutTask(message: Any): Unit = message match { case StartSpout => pullNextBlock() case "nextBlock" => pullNextBlock() } def pullNextBlock(): Unit = { if (currentBlock > highestBlock) return try { log.debug(s"Trying block $currentBlock") val transactionCountHex = executeRequest("eth_getBlockTransactionCountByNumber", "\"0x" + currentBlock.toHexString + "\"") val transactionCount = Integer.parseInt(transactionCountHex.fields("result").toString().drop(3).dropRight(1), 16) if(transactionCount>0){ var transactions = "[" for (i <- 0 until transactionCount) transactions = transactions + batchRequestBuilder("eth_getTransactionByBlockNumberAndIndex",s""""0x${currentBlock.toHexString}","0x${i.toHexString}"""")+"," val trasnactionBlock = executeBatchRequest(transactions.dropRight(1)+"]") val transList = trasnactionBlock.parseJson.convertTo[List[EthTransaction]] transList.foreach(t => { //try needed to ignore contracts //todo include them try{sendTuple(s"${t.result.blockNumber.get},${t.result.from.get},${t.result.to.get},${t.result.value.get}")} catch {case e:NoSuchElementException =>} }) } currentBlock += 1 AllocateSpoutTask(Duration(1, NANOSECONDS), "nextBlock") } catch { case e: NumberFormatException => AllocateSpoutTask(Duration(1, SECONDS), "nextBlock") case e: Exception => e.printStackTrace(); AllocateSpoutTask(Duration(1, SECONDS), "nextBlock") } } def batchRequestBuilder(command:String,params:String):String = s"""{"jsonrpc": "2.0", "id":"100", "method": "$command", "params": [$params]}""" def executeBatchRequest(data: String) = requestBatch(data).execute().body.toString def requestBatch(data: String): HttpRequest = baseRequest.postData(data) def requestBuilder() = if (nodeIP.matches(Utils.IPRegex)) Http("http://" + nodeIP + ":" + nodePort).header("content-type", "application/json") else Http("http://" + hostname2Ip(nodeIP) + ":" + nodePort).header("content-type", "application/json") def request(command: String, params: String = ""): HttpRequest = baseRequest.postData(s"""{"jsonrpc": "2.0", "id":"100", "method": "$command", "params": [$params]}""") def executeRequest(command: String, params: String = "") = request(command, params).execute().body.toString.parseJson.asJsObject def hostname2Ip(hostname: String): String = InetAddress.getByName(hostname).getHostAddress() }
Example 50
Source File: Gateway.scala From reactive-microservices with MIT License | 5 votes |
import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.client.RequestBuilding import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._ import akka.http.scaladsl.model.StatusCodes._ import akka.http.scaladsl.model.{HttpRequest, HttpResponse} import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.FlowMaterializer import akka.stream.scaladsl.{Sink, Source} import java.io.IOException import scala.concurrent.{ExecutionContext, Future} case class InternalLoginRequest(identityId: Long, authMethod: String = "codecard") case class InternalReloginRequest(tokenValue: String, authMethod: String = "codecard") class Gateway(implicit actorSystem: ActorSystem, materializer: FlowMaterializer, ec: ExecutionContext) extends JsonProtocols with Config { private val identityManagerConnectionFlow = Http().outgoingConnection(identityManagerHost, identityManagerPort) private val tokenManagerConnectionFlow = Http().outgoingConnection(tokenManagerHost, tokenManagerPort) private def requestIdentityManager(request: HttpRequest): Future[HttpResponse] = { Source.single(request).via(identityManagerConnectionFlow).runWith(Sink.head) } private def requestTokenManager(request: HttpRequest): Future[HttpResponse] = { Source.single(request).via(tokenManagerConnectionFlow).runWith(Sink.head) } def requestToken(tokenValue: String): Future[Either[String, Token]] = { requestTokenManager(RequestBuilding.Get(s"/tokens/$tokenValue")).flatMap { response => response.status match { case Success(_) => Unmarshal(response.entity).to[Token].map(Right(_)) case NotFound => Future.successful(Left("Token expired or not found")) case _ => Future.failed(new IOException(s"Token request failed with status ${response.status} and error ${response.entity}")) } } } def requestNewIdentity(): Future[Identity] = { requestIdentityManager(RequestBuilding.Post("/identities")).flatMap { response => response.status match { case Success(_) => Unmarshal(response.entity).to[Identity] case _ => Future.failed(new IOException(s"Identity request failed with status ${response.status} and error ${response.entity}")) } } } def requestLogin(identityId: Long): Future[Token] = { val loginRequest = InternalLoginRequest(identityId) requestTokenManager(RequestBuilding.Post("/tokens", loginRequest)).flatMap { response => response.status match { case Success(_) => Unmarshal(response.entity).to[Token] case _ => Future.failed(new IOException(s"Login request failed with status ${response.status} and error ${response.entity}")) } } } def requestRelogin(tokenValue: String): Future[Option[Token]] = { requestTokenManager(RequestBuilding.Patch("/tokens", InternalReloginRequest(tokenValue))).flatMap { response => response.status match { case Success(_) => Unmarshal(response.entity).to[Token].map(Option(_)) case NotFound => Future.successful(None) case _ => Future.failed(new IOException(s"Relogin request failed with status ${response.status} and error ${response.entity}")) } } } }
Example 51
Source File: Gateway.scala From reactive-microservices with MIT License | 5 votes |
import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.client.RequestBuilding import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._ import akka.http.scaladsl.model.StatusCodes._ import akka.http.scaladsl.model.{HttpRequest, HttpResponse} import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.FlowMaterializer import akka.stream.scaladsl.{Sink, Source} import java.io.IOException import scala.concurrent.{ExecutionContext, Future} case class InternalLoginRequest(identityId: Long, authMethod: String = "password") case class InternalReloginRequest(tokenValue: String, authMethod: String = "password") class Gateway(implicit actorSystem: ActorSystem, materializer: FlowMaterializer, ec: ExecutionContext) extends JsonProtocols with Config { private val identityManagerConnectionFlow = Http().outgoingConnection(identityManagerHost, identityManagerPort) private val tokenManagerConnectionFlow = Http().outgoingConnection(tokenManagerHost, tokenManagerPort) private def requestIdentityManager(request: HttpRequest): Future[HttpResponse] = { Source.single(request).via(identityManagerConnectionFlow).runWith(Sink.head) } private def requestTokenManager(request: HttpRequest): Future[HttpResponse] = { Source.single(request).via(tokenManagerConnectionFlow).runWith(Sink.head) } def requestToken(tokenValue: String): Future[Either[String, Token]] = { requestTokenManager(RequestBuilding.Get(s"/tokens/$tokenValue")).flatMap { response => response.status match { case Success(_) => Unmarshal(response.entity).to[Token].map(Right(_)) case NotFound => Future.successful(Left("Token expired or not found")) case _ => Future.failed(new IOException(s"Token request failed with status ${response.status} and error ${response.entity}")) } } } def requestNewIdentity(): Future[Identity] = { requestIdentityManager(RequestBuilding.Post("/identities")).flatMap { response => response.status match { case Success(_) => Unmarshal(response.entity).to[Identity] case _ => Future.failed(new IOException(s"Identity request failed with status ${response.status} and error ${response.entity}")) } } } def requestLogin(identityId: Long): Future[Token] = { val loginRequest = InternalLoginRequest(identityId) requestTokenManager(RequestBuilding.Post("/tokens", loginRequest)).flatMap { response => response.status match { case Success(_) => Unmarshal(response.entity).to[Token] case _ => Future.failed(new IOException(s"Login request failed with status ${response.status} and error ${response.entity}")) } } } def requestRelogin(tokenValue: String): Future[Option[Token]] = { requestTokenManager(RequestBuilding.Patch("/tokens", InternalReloginRequest(tokenValue))).flatMap { response => response.status match { case Success(_) => Unmarshal(response.entity).to[Token].map(Option(_)) case NotFound => Future.successful(None) case _ => Future.failed(new IOException(s"Relogin request failed with status ${response.status} and error ${response.entity}")) } } } }
Example 52
Source File: Gateway.scala From reactive-microservices with MIT License | 5 votes |
import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.client.RequestBuilding import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._ import akka.http.scaladsl.model.StatusCodes._ import akka.http.scaladsl.model.{HttpRequest, HttpResponse} import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.FlowMaterializer import akka.stream.scaladsl.{Sink, Source} import com.restfb.DefaultFacebookClient import com.restfb.types.User import java.io.IOException import scala.concurrent.{blocking, ExecutionContext, Future} import scala.util.Try case class InternalLoginRequest(identityId: Long, authMethod: String = "fb") case class InternalReloginRequest(tokenValue: String, authMethod: String = "fb") class Gateway(implicit actorSystem: ActorSystem, materializer: FlowMaterializer, ec: ExecutionContext) extends JsonProtocols with Config { private val identityManagerConnectionFlow = Http().outgoingConnection(identityManagerHost, identityManagerPort) private val tokenManagerConnectionFlow = Http().outgoingConnection(tokenManagerHost, tokenManagerPort) private def requestIdentityManager(request: HttpRequest): Future[HttpResponse] = { Source.single(request).via(identityManagerConnectionFlow).runWith(Sink.head) } private def requestTokenManager(request: HttpRequest): Future[HttpResponse] = { Source.single(request).via(tokenManagerConnectionFlow).runWith(Sink.head) } def requestToken(tokenValue: String): Future[Either[String, Token]] = { requestTokenManager(RequestBuilding.Get(s"/tokens/$tokenValue")).flatMap { response => response.status match { case Success(_) => Unmarshal(response.entity).to[Token].map(Right(_)) case NotFound => Future.successful(Left("Token expired or not found")) case _ => Future.failed(new IOException(s"Token request failed with status ${response.status} and error ${response.entity}")) } } } def requestNewIdentity(): Future[Identity] = { requestIdentityManager(RequestBuilding.Post("/identities")).flatMap { response => response.status match { case Success(_) => Unmarshal(response.entity).to[Identity] case _ => Future.failed(new IOException(s"Identity request failed with status ${response.status} and error ${response.entity}")) } } } def requestLogin(identityId: Long): Future[Token] = { val loginRequest = InternalLoginRequest(identityId) requestTokenManager(RequestBuilding.Post("/tokens", loginRequest)).flatMap { response => response.status match { case Success(_) => Unmarshal(response.entity).to[Token] case _ => Future.failed(new IOException(s"Login request failed with status ${response.status} and error ${response.entity}")) } } } def requestRelogin(tokenValue: String): Future[Option[Token]] = { requestTokenManager(RequestBuilding.Patch("/tokens", InternalReloginRequest(tokenValue))).flatMap { response => response.status match { case Success(_) => Unmarshal(response.entity).to[Token].map(Option(_)) case NotFound => Future.successful(None) case _ => Future.failed(new IOException(s"Relogin request failed with status ${response.status} and error ${response.entity}")) } } } def getFbUserDetails(accessToken: String): Try[User] = { Try { blocking { val client = new DefaultFacebookClient(accessToken) client.fetchObject("me", classOf[User]) } } } }