akka.http.scaladsl.model.MediaTypes Scala Examples
The following examples show how to use akka.http.scaladsl.model.MediaTypes.
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: ArchiveRoutes.scala From nexus-kg with Apache License 2.0 | 5 votes |
package ch.epfl.bluebrain.nexus.kg.routes import akka.http.scaladsl.model.StatusCodes.{Created, OK} import akka.http.scaladsl.model.headers.Accept import akka.http.scaladsl.model.{HttpEntity, MediaTypes} import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import ch.epfl.bluebrain.nexus.admin.client.types.Project import ch.epfl.bluebrain.nexus.iam.client.types._ import ch.epfl.bluebrain.nexus.kg.KgError.{InvalidOutputFormat, UnacceptedResponseContentType} import ch.epfl.bluebrain.nexus.kg.archives.Archive._ import ch.epfl.bluebrain.nexus.kg.config.AppConfig import ch.epfl.bluebrain.nexus.kg.directives.AuthDirectives.hasPermission import ch.epfl.bluebrain.nexus.kg.directives.PathDirectives._ import ch.epfl.bluebrain.nexus.kg.directives.ProjectDirectives._ import ch.epfl.bluebrain.nexus.kg.directives.QueryDirectives.outputFormat import ch.epfl.bluebrain.nexus.kg.marshallers.instances._ import ch.epfl.bluebrain.nexus.kg.resources._ import ch.epfl.bluebrain.nexus.kg.resources.syntax._ import ch.epfl.bluebrain.nexus.kg.routes.OutputFormat.Tar import ch.epfl.bluebrain.nexus.rdf.Iri.AbsoluteIri import io.circe.Json import kamon.instrumentation.akka.http.TracingDirectives.operationName import monix.eval.Task import monix.execution.Scheduler.Implicits.global class ArchiveRoutes private[routes] (archives: Archives[Task])( implicit acls: AccessControlLists, project: Project, caller: Caller, config: AppConfig ) { private val responseType = MediaTypes.`application/x-tar` def routes(id: AbsoluteIri): Route = { val resId = Id(project.ref, id) concat( // Create archive (put & pathEndOrSingleSlash) { operationName(s"/${config.http.prefix}/archives/{org}/{project}/{id}") { (hasPermission(write) & projectNotDeprecated) { entity(as[Json]) { source => complete(archives.create(resId, source).value.runWithStatus(Created)) } } } }, // Fetch archive (get & outputFormat(strict = true, Tar) & pathEndOrSingleSlash) { case Tar => getArchive(resId) case format: NonBinaryOutputFormat => getResource(resId)(format) case other => failWith(InvalidOutputFormat(other.toString)) } ) } private def getResource(resId: ResId)(implicit format: NonBinaryOutputFormat): Route = completeWithFormat(archives.fetch(resId).value.runWithStatus(OK)) private def getArchive(resId: ResId): Route = { parameter("ignoreNotFound".as[Boolean] ? false) { ignoreNotFound => onSuccess(archives.fetchArchive(resId, ignoreNotFound).value.runToFuture) { case Right(source) => headerValueByType[Accept](()) { accept => if (accept.mediaRanges.exists(_.matches(responseType))) complete(HttpEntity(responseType, source)) else failWith( UnacceptedResponseContentType( s"File Media Type '$responseType' does not match the Accept header value '${accept.mediaRanges.mkString(", ")}'" ) ) } case Left(err) => complete(err) } } } } object ArchiveRoutes { final def apply(archives: Archives[Task])( implicit acls: AccessControlLists, caller: Caller, project: Project, config: AppConfig ): ArchiveRoutes = new ArchiveRoutes(archives) }
Example 2
Source File: ControllerSpec.scala From akka-ddd-cqrs-es-example with MIT License | 5 votes |
package com.github.j5ik2o.bank.adaptor.util import akka.http.scaladsl.model.{ HttpEntity, MediaTypes } import akka.http.scaladsl.testkit.ScalatestRouteTest import akka.testkit.TestKitBase import akka.util.ByteString import com.github.j5ik2o.scalatestplus.db.{ MySQLdConfig, UserWithPassword } import com.wix.mysql.distribution.Version.v5_6_21 import io.circe.Encoder import io.circe.syntax._ import org.scalatest.concurrent.ScalaFutures import org.scalatest.prop.PropertyChecks import org.scalatest.time.{ Millis, Seconds, Span } import org.scalatest.{ BeforeAndAfterAll, FreeSpecLike, Matchers } import scala.concurrent.duration._ object ControllerSpec { implicit class JsonOps[A](val self: A) extends AnyVal { def toEntity(implicit enc: Encoder[A]): HttpEntity.Strict = HttpEntity(MediaTypes.`application/json`, ByteString(self.asJson.noSpaces)) } } abstract class ControllerSpec extends FreeSpecLike with PropertyChecks with Matchers with BeforeAndAfterAll with ScalaFutures with FlywayWithMySQLSpecSupport with ScalatestRouteTest with TestKitBase { override implicit val patienceConfig: PatienceConfig = PatienceConfig(timeout = Span(10, Seconds), interval = Span(200, Millis)) override def afterAll: Unit = cleanUp() override protected lazy val mySQLdConfig: MySQLdConfig = MySQLdConfig( version = v5_6_21, port = Some(12345), userWithPassword = Some(UserWithPassword("bank", "passwd")), timeout = Some((30 seconds) * sys.env.getOrElse("SBT_TEST_TIME_FACTOR", "1").toDouble) ) }
Example 3
Source File: MetricsEndpoints.scala From service-container with Apache License 2.0 | 5 votes |
package com.github.vonnagy.service.container.metrics import akka.actor.ActorSystem import akka.http.scaladsl.model.MediaTypes import akka.japi.Util._ import com.github.vonnagy.service.container.http.directives.CIDRDirectives import com.github.vonnagy.service.container.http.routing.RoutedEndpoints import scala.concurrent.ExecutionContext class MetricsEndpoints(implicit system: ActorSystem, executor: ExecutionContext) extends RoutedEndpoints()(system, executor) with CIDRDirectives { lazy val writer = new MetricsWriter(Metrics(system).metricRegistry) lazy val config = system.settings.config.getConfig("container.http") val route = path("metrics") { cidrFilter(immutableSeq(config.getStringList("cidr.allow")), immutableSeq(config.getStringList("cidr.deny"))) { get { acceptableMediaTypes(MediaTypes.`application/json`) { encodeResponse { complete(writer.getMetrics(true)) } } } } } }
Example 4
Source File: HealthEndpoints.scala From service-container with Apache License 2.0 | 5 votes |
package com.github.vonnagy.service.container.health import akka.actor.ActorSystem import akka.http.scaladsl.marshalling._ import akka.http.scaladsl.model.{MediaTypes, StatusCodes} import akka.http.scaladsl.server._ import akka.japi.Util.immutableSeq import com.github.vonnagy.service.container.http.DefaultMarshallers import com.github.vonnagy.service.container.http.directives.CIDRDirectives import com.github.vonnagy.service.container.http.routing.RoutedEndpoints import org.joda.time.DateTime import scala.concurrent.ExecutionContext import scala.util.{Failure, Success, Try} def handleHealth[T <: ContainerHealth](loadBalancer: Boolean)(implicit marshaller: ToEntityMarshaller[AnyRef]): PartialFunction[Try[ContainerHealth], Route] = { case Success(check) => check.state match { case HealthState.OK => complete(serialize(loadBalancer, check)) case HealthState.DEGRADED => complete(serialize(loadBalancer, check)) case HealthState.CRITICAL => complete(StatusCodes.ServiceUnavailable -> serialize(loadBalancer, check)) } case Failure(t) => log.error("An error occurred while fetching the system's health", t) complete(StatusCodes.InternalServerError, ContainerHealth(ContainerInfo.host, ContainerInfo.application, ContainerInfo.applicationVersion, ContainerInfo.containerVersion, DateTime.now, HealthState.CRITICAL, t.getMessage, Nil)) } }
Example 5
Source File: MetricsEndpointsSpec.scala From service-container with Apache License 2.0 | 5 votes |
package com.github.vonnagy.service.container.metrics import java.net.InetAddress import akka.http.scaladsl.model.headers.{Accept, `Remote-Address`} import akka.http.scaladsl.model.{ContentTypes, MediaTypes, RemoteAddress, StatusCodes} import com.github.vonnagy.service.container.Specs2RouteTest import com.github.vonnagy.service.container.http.routing.Rejection.NotFoundRejection import org.specs2.mutable.Specification class MetricsEndpointsSpec extends Specification with Specs2RouteTest { val endpoints = new MetricsEndpoints()(system, system.dispatcher) def remoteAddress(ip: String) = RemoteAddress(InetAddress.getByName(ip)) "The routing infrastructure should support" should { "a call to /metrics to be handled" in { Get("/metrics").withHeaders(`Remote-Address`(remoteAddress("127.0.0.1"))) ~> endpoints.route ~> check { handled must beTrue contentType === ContentTypes.`application/json` status must be equalTo (StatusCodes.OK) } } "a call to /metrics should return json" in { Get("/metrics").withHeaders(Accept(MediaTypes.`application/json`), `Remote-Address`(remoteAddress("127.0.0.1"))) ~> endpoints.route ~> check { handled must beTrue contentType === ContentTypes.`application/json` } } "a call to /metrics should return an error due to CIDR rules" in { Get("/metrics").withHeaders(Accept(MediaTypes.`application/json`), `Remote-Address`(remoteAddress("192.168.1.1"))) ~> endpoints.route ~> check { handled must beFalse rejections.size must beEqualTo(1) rejections.head must be equalTo(NotFoundRejection("The requested resource could not be found")) } } } }
Example 6
Source File: BaseDirectivesSpec.scala From service-container with Apache License 2.0 | 5 votes |
package com.github.vonnagy.service.container.http import akka.http.scaladsl.marshalling._ import akka.http.scaladsl.model.MediaTypes._ import akka.http.scaladsl.model.headers.Accept import akka.http.scaladsl.model.{MediaType, MediaTypes} import akka.http.scaladsl.server.{ContentNegotiator, Route, UnacceptedResponseContentTypeRejection} import com.github.vonnagy.service.container.Specs2RouteTest import org.specs2.mutable.Specification class BaseDirectivesSpec extends Specification with BaseDirectives with DefaultMarshallers with Specs2RouteTest { val `application/vnd.com.github.vonnagy.container.health-v1+json` = MediaType.custom("application/vnd.com.github.vonnagy.container.health-v1+json", false) "The base directives" should { "allow the use of the `acceptableMediaTypes` directive" in { import MediaTypes._ implicit val marsh: ToEntityMarshaller[Seq[String]] = jsonMarshaller implicit val vndMarsh: ToEntityMarshaller[String] = Marshaller.StringMarshaller.wrap(`application/vnd.com.github.vonnagy.container.health-v1+json`)(_.toString) val route: Route = path("app-json") { acceptableMediaTypes(`application/json`, `application/vnd.com.github.vonnagy.container.health-v1+json`) { complete(Seq()) } } ~ path("app-custom") { acceptableMediaTypes(`application/json`, `application/vnd.com.github.vonnagy.container.health-v1+json`) { complete("[]") } } Get("/app-json") .withHeaders(Accept(`application/json`, `application/vnd.com.github.vonnagy.container.health-v1+json`)) ~> route ~> check { responseAs[String] === "[]" mediaType === MediaTypes.`application/json` } Get("/app-custom") .withHeaders(Accept(`application/vnd.com.github.vonnagy.container.health-v1+json`, `application/json`)) ~> route ~> check { responseAs[String] === "[]" mediaType === `application/vnd.com.github.vonnagy.container.health-v1+json` } Get("/app-json").withHeaders(Accept(`text/plain`)) ~> route ~> check { rejection === UnacceptedResponseContentTypeRejection(Set(ContentNegotiator.Alternative(`application/json`), ContentNegotiator.Alternative(`application/vnd.com.github.vonnagy.container.health-v1+json`))) } } } "allow for the use of json response type" in { implicit val marsh: ToEntityMarshaller[Seq[String]] = jsonMarshaller Get() ~> { complete(Seq()) } ~> check { mediaType === `application/json` } } "allow for the use of plain response type" in { Get() ~> { complete("[]") } ~> check { mediaType === `text/plain` } } }
Example 7
Source File: RoutedServiceSpec.scala From service-container with Apache License 2.0 | 5 votes |
package com.github.vonnagy.service.container.http.routing import akka.actor._ import akka.http.scaladsl.model.{HttpEntity, MediaTypes, StatusCodes} import akka.http.scaladsl.server.{Directives, Route} import akka.testkit.{TestActorRef, TestProbe} import com.github.vonnagy.service.container.Specs2RouteTest import com.github.vonnagy.service.container.http.{DefaultMarshallers, RejectionResponse} import org.specs2.mutable.Specification class RoutedServiceSpec extends Specification with Directives with Specs2RouteTest { case class TestEntity(id: Int, name: String) val probe = new TestProbe(system) val httpAct = TestActorRef(Props(new Actor with RoutedService with DefaultMarshallers { def receive = routeReceive }), "http") val svc = httpAct.underlyingActor.asInstanceOf[RoutedService] def echoComplete[T]: T => Route = { x ⇒ complete(x.toString) } "The RoutedService" should { "allow for routes to be added after the system is already loaded" in { // This should create the actor and register the endpoints val r = new RoutedEndpoints { def route = { path("test2") { complete("test2") } } } probe.send(httpAct, AddRoute(r)) probe.expectMsg(RouteAdded) Get("/test2") ~> svc.buildRoute(svc.routes) ~> check { responseAs[String] must be equalTo "test2" } } "respond with UnprocessableEntity for requests resulting in a MalformedFormFieldRejection" in { implicit val unmarsh = svc.jsonUnmarshaller[TestEntity] implicit val rejMarsh = svc.jsonUnmarshaller[RejectionResponse] val postRoute = new RoutedEndpoints { def route = { post { path("test4") { entity(as[TestEntity]) { echoComplete } } } } } probe.send(httpAct, AddRoute(postRoute)) probe.expectMsg(RouteAdded) import svc.defaultJsonFormats val ent = TestEntity(100, "product") Post("/test4", HttpEntity(MediaTypes.`application/json`, svc.serialization.write(ent))) ~> handleRejections(svc.rejectionHandler)(svc.buildRoute(svc.routes)) ~> check { status === StatusCodes.UnprocessableEntity mediaType === MediaTypes.`application/json` responseAs[RejectionResponse] must not beNull } } "respond with RejectionResponse for requests that error out" in { implicit val rejMarsh = svc.jsonUnmarshaller[RejectionResponse] val postRoute = new RoutedEndpoints { def route = { get { path("test5") { ctx => throw new Exception("test") } } } } probe.send(httpAct, AddRoute(postRoute)) probe.expectMsg(RouteAdded) Get("/test5") ~> Route.seal(svc.buildRoute(svc.routes))(svc.routeSettings, exceptionHandler = svc.exceptionHandler, rejectionHandler = svc.rejectionHandler) ~> check { mediaType === MediaTypes.`application/json` responseAs[RejectionResponse] must not beNull } } } }
Example 8
Source File: HealthEndpointsSpec.scala From service-container with Apache License 2.0 | 5 votes |
package com.github.vonnagy.service.container.health import java.net.InetAddress import akka.http.scaladsl.model.headers.{Accept, `Remote-Address`} import akka.http.scaladsl.model.{ContentTypes, MediaTypes, RemoteAddress, StatusCodes} import com.github.vonnagy.service.container.Specs2RouteTest import com.github.vonnagy.service.container.http.routing.Rejection.NotFoundRejection import org.specs2.mutable.Specification import scala.concurrent.Future class HealthEndpointsSpec extends Specification with Specs2RouteTest { sequential val endpoints = new HealthEndpoints()(system, system.dispatcher) def remoteAddress(ip: String) = RemoteAddress(InetAddress.getByName(ip)) "The routing infrastructure" should { "support a call to /health" in { Get("/health").withHeaders(`Remote-Address`(remoteAddress("127.0.0.1"))) ~> endpoints.route ~> check { handled must beTrue contentType === ContentTypes.`application/json` status must be equalTo (StatusCodes.OK) } } "support a call to /health that should return json" in { Get("/health").withHeaders(Accept(MediaTypes.`application/json`), `Remote-Address`(remoteAddress("127.0.0.1"))) ~> endpoints.route ~> check { handled must beTrue mediaType === MediaTypes.`application/json` contentType === ContentTypes.`application/json` } } "a call to /health should return an error due to CIDR rules" in { Get("/health").withHeaders(Accept(MediaTypes.`application/json`), `Remote-Address`(remoteAddress("192.168.1.1"))) ~> endpoints.route ~> check { handled must beFalse rejections.size must beEqualTo(1) rejections.head must be equalTo(NotFoundRejection("The requested resource could not be found")) } } "support a call to /health/lb" in { Get("/health/lb").withHeaders(Accept(MediaTypes.`text/plain`), `Remote-Address`(remoteAddress("127.0.0.1"))) ~> endpoints.route ~> check { handled must beTrue mediaType === MediaTypes.`text/plain` responseAs[String].equals("UP") } } "support a call to health/lb that returns a status of `Ok` when a health check is marked as degraded" in { Health(system).addCheck(new HealthCheck { override def getHealth: Future[HealthInfo] = Future { HealthInfo("degraded", HealthState.DEGRADED, "") } }) Get("/health/lb").withHeaders(Accept(MediaTypes.`text/plain`), `Remote-Address`(remoteAddress("127.0.0.1"))) ~> endpoints.route ~> check { handled must beTrue mediaType === MediaTypes.`text/plain` status === StatusCodes.OK responseAs[String].equals("UP") } } "support a call to health/lb that returns a status of `ServiceUnavailable` when a health check is marked as critical" in { Health(system).addCheck(new HealthCheck { override def getHealth: Future[HealthInfo] = Future { HealthInfo("critical", HealthState.CRITICAL, "") } }) Get("/health/lb").withHeaders(Accept(MediaTypes.`text/plain`), `Remote-Address`(remoteAddress("127.0.0.1"))) ~> endpoints.route ~> check { //handled must beTrue mediaType === MediaTypes.`text/plain` status === StatusCodes.ServiceUnavailable responseAs[String].equals("DOWN") } } } }
Example 9
Source File: RestHttpSample.scala From service-container with Apache License 2.0 | 5 votes |
import akka.actor.ActorSystem import akka.http.scaladsl.marshalling._ import akka.http.scaladsl.model.MediaTypes import com.github.vonnagy.service.container.ContainerBuilder import com.github.vonnagy.service.container.http.routing._ import com.typesafe.config.ConfigFactory import scala.concurrent.ExecutionContext object RestHttpSample extends App { // Here we establish the container and build it while // applying extras. val service = new ContainerBuilder() // Add a config to override the host and port as well as setup SSL .withConfig(ConfigFactory.parseString( s""" container.http.ssl.enabled=off container.http.ssl.key-password="changeme" container.http.ssl.key-store="${getClass.getClassLoader.getResource("keystore").getPath}" container.http.ssl.key-store-password="changeme" container.http.ssl.trust-store="${getClass.getClassLoader.getResource("truststore").getPath}" container.http.ssl.trust-store-password="changeme" container.http.interface = "localhost" container.http.port = "9092" """.stripMargin)) // Add some endpoints .withRoutes(classOf[ProductEndpoints]).build service.start // A product entity case class Product(id: Option[Int], name: String) class ProductEndpoints(implicit system: ActorSystem, executor: ExecutionContext) extends RoutedEndpoints { // Import the default Json marshaller and un-marshaller implicit val marshaller: ToEntityMarshaller[AnyRef] = jsonMarshaller implicit val unmarshaller = jsonUnmarshaller[Product] val route = { pathPrefix("products") { pathEndOrSingleSlash { get { // This is a path like ``http://api.somecompany.com/products`` and will fetch all of the products complete(Seq(Product(Some(1001), "Widget 1"), Product(Some(1002), "Widget 2"))) } ~ post { // Simulate the creation of a product. This call is handled in-line and not through the per-request handler. entity(as[Product]) { product => complete(Product(Some(1001), product.name)) } } } ~ path(IntNumber) { productId => get { acceptableMediaTypes(MediaTypes.`application/json`) { // This is the path like ``http://api.somecompany.com/products/1001`` and will fetch the specified product // Push the handling to another context so that we don't block complete(Product(Some(productId), "Widget 1")) } } } } } } }
Example 10
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 11
Source File: CreateDonutTest.scala From learn-akka with Apache License 2.0 | 5 votes |
package com.allaboutscala.learn.akka.http import akka.http.scaladsl.model.{HttpEntity, HttpMethods, HttpRequest, MediaTypes} import akka.http.scaladsl.testkit.ScalatestRouteTest import akka.util.ByteString import com.allaboutscala.learn.akka.http.routes.DonutRoutes import org.scalatest.{Matchers, WordSpec} class CreateDonutTest extends WordSpec with Matchers with ScalatestRouteTest { val donutRoutes = new DonutRoutes().route() "Donut API" should { "Create a valid Donut when posting JSON to /create-donut path" in { 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)) httpPostCreateDonut ~> donutRoutes ~> check { status.isSuccess() shouldEqual true status.intValue() shouldEqual 201 status.reason shouldEqual "Created" } } } }
Example 12
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 13
Source File: UpdateApi.scala From iep-apps with Apache License 2.0 | 5 votes |
package com.netflix.atlas.aggregator import javax.inject.Inject import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.model.HttpEntity import akka.http.scaladsl.model.HttpResponse import akka.http.scaladsl.model.MediaTypes import akka.http.scaladsl.model.StatusCode import akka.http.scaladsl.model.StatusCodes import akka.http.scaladsl.server.Route import com.fasterxml.jackson.core.JsonParser import com.netflix.atlas.akka.CustomDirectives._ import com.netflix.atlas.akka.WebApi import com.netflix.atlas.core.validation.ValidationResult import com.netflix.atlas.eval.stream.Evaluator import com.typesafe.scalalogging.StrictLogging class UpdateApi @Inject()( evaluator: Evaluator, aggrService: AtlasAggregatorService ) extends WebApi with StrictLogging { import UpdateApi._ require(aggrService != null, "no binding for aggregate registry") def routes: Route = { endpointPath("api" / "v4" / "update") { post { parseEntity(customJson(p => processPayload(p, aggrService))) { response => complete(response) } } } } } object UpdateApi { private val decoder = PayloadDecoder.default private[aggregator] def processPayload( parser: JsonParser, service: AtlasAggregatorService ): HttpResponse = { val result = decoder.decode(parser, service) createResponse(result.numDatapoints, result.failures) } private val okResponse = { val entity = HttpEntity(MediaTypes.`application/json`, "{}") HttpResponse(StatusCodes.OK, entity = entity) } private def createErrorResponse(status: StatusCode, msg: FailureMessage): HttpResponse = { val entity = HttpEntity(MediaTypes.`application/json`, msg.toJson) HttpResponse(status, entity = entity) } private def createResponse(numDatapoints: Int, failures: List[ValidationResult]): HttpResponse = { if (failures.isEmpty) { okResponse } else { val numFailures = failures.size if (numDatapoints > numFailures) { // Partial failure val msg = FailureMessage.partial(failures, numFailures) createErrorResponse(StatusCodes.Accepted, msg) } else { // All datapoints dropped val msg = FailureMessage.error(failures, numFailures) createErrorResponse(StatusCodes.BadRequest, msg) } } } }
Example 14
Source File: ExplainApi.scala From iep-apps with Apache License 2.0 | 5 votes |
package com.netflix.atlas.druid import akka.actor.ActorRefFactory import akka.http.scaladsl.model.HttpEntity import akka.http.scaladsl.model.HttpResponse import akka.http.scaladsl.model.MediaTypes import akka.http.scaladsl.model.StatusCodes import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import akka.http.scaladsl.server.RouteResult import akka.pattern.ask import akka.util.Timeout import com.netflix.atlas.akka.CustomDirectives._ import com.netflix.atlas.akka.WebApi import com.netflix.atlas.druid.ExplainApi.ExplainRequest import com.netflix.atlas.eval.graph.Grapher import com.netflix.atlas.json.Json import com.netflix.atlas.webapi.GraphApi.DataRequest import com.typesafe.config.Config import scala.concurrent.duration._ class ExplainApi(config: Config, implicit val actorRefFactory: ActorRefFactory) extends WebApi { private val grapher: Grapher = Grapher(config) private val dbRef = actorRefFactory.actorSelection("/user/db") private implicit val ec = actorRefFactory.dispatcher override def routes: Route = { endpointPath("explain" / "v1" / "graph") { get { ctx => val graphCfg = grapher.toGraphConfig(ctx.request) dbRef .ask(ExplainRequest(DataRequest(graphCfg)))(Timeout(10.seconds)) .map { response => val json = Json.encode(response) val entity = HttpEntity(MediaTypes.`application/json`, json) RouteResult.Complete(HttpResponse(StatusCodes.OK, entity = entity)) } } } } } object ExplainApi { case class ExplainRequest(dataRequest: DataRequest) }
Example 15
Source File: StatsApi.scala From iep-apps with Apache License 2.0 | 5 votes |
package com.netflix.iep.lwc import akka.http.scaladsl.model.HttpEntity import akka.http.scaladsl.model.HttpResponse import akka.http.scaladsl.model.MediaTypes import akka.http.scaladsl.model.StatusCodes import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import com.netflix.atlas.akka.CustomDirectives._ import com.netflix.atlas.akka.WebApi import com.netflix.atlas.json.Json class StatsApi(evaluator: ExpressionsEvaluator) extends WebApi { override def routes: Route = { endpointPathPrefix("api" / "v1" / "stats") { get { val stats = Json.encode(evaluator.stats) val entity = HttpEntity(MediaTypes.`application/json`, stats) val response = HttpResponse(StatusCodes.OK, Nil, entity) complete(response) } } } }
Example 16
Source File: StatsApiSuite.scala From iep-apps with Apache License 2.0 | 5 votes |
package com.netflix.iep.lwc import akka.http.scaladsl.model.HttpResponse import akka.http.scaladsl.model.MediaTypes import akka.http.scaladsl.model.StatusCode import akka.http.scaladsl.model.StatusCodes import akka.http.scaladsl.testkit.RouteTestTimeout import akka.http.scaladsl.testkit.ScalatestRouteTest import com.netflix.atlas.akka.RequestHandler import com.netflix.atlas.core.model.Datapoint import com.netflix.atlas.json.Json import com.netflix.spectator.atlas.impl.Subscription import com.typesafe.config.ConfigFactory import org.scalatest.BeforeAndAfter import org.scalatest.funsuite.AnyFunSuite class StatsApiSuite extends AnyFunSuite with ScalatestRouteTest with BeforeAndAfter { import scala.jdk.CollectionConverters._ import scala.concurrent.duration._ private implicit val routeTestTimeout = RouteTestTimeout(5.second) private val config = ConfigFactory.load() private val evaluator = new ExpressionsEvaluator(config) private val endpoint = new StatsApi(evaluator) private val routes = RequestHandler.standardOptions(endpoint.routes) private def assertJsonContentType(response: HttpResponse): Unit = { assert(response.entity.contentType.mediaType === MediaTypes.`application/json`) } private def assertResponse(response: HttpResponse, expected: StatusCode): Unit = { assert(response.status === expected) assertJsonContentType(response) } before { evaluator.clear() } test("empty") { Get("/api/v1/stats") ~> routes ~> check { assertResponse(response, StatusCodes.OK) assert(responseAs[String] === "[]") } } test("has data") { // Add sample subscription val subs = List( new Subscription() .withId("1") .withExpression("name,ssCpuUser,:eq,:sum"), new Subscription() .withId("2") .withExpression("name,ssCpuSystem,:eq,:sum") ) evaluator.sync(subs.asJava) // Stats only get updated when data is sent val datapoints = List( Datapoint(Map("name" -> "ssCpuUser", "node" -> "i-1"), 60000, 42.0), Datapoint(Map("name" -> "ssCpuUser", "node" -> "i-2"), 60000, 44.0) ) evaluator.eval(60000, datapoints) // Query the data Get("/api/v1/stats") ~> routes ~> check { assertResponse(response, StatusCodes.OK) val stats = Json.decode[List[ExpressionsEvaluator.SubscriptionStats]](responseAs[String]) assert(stats.length === 1) assert(stats.head.updateCount.get() === 2) } } }
Example 17
Source File: PropertiesApi.scala From iep-apps with Apache License 2.0 | 5 votes |
package com.netflix.iep.archaius import java.io.StringWriter import java.util.Properties import akka.actor.ActorRefFactory import akka.http.scaladsl.model.HttpCharsets import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.model.HttpEntity import akka.http.scaladsl.model.HttpRequest import akka.http.scaladsl.model.HttpResponse import akka.http.scaladsl.model.MediaTypes import akka.http.scaladsl.model.StatusCodes import akka.http.scaladsl.server.Route import com.netflix.atlas.akka.CustomDirectives._ import com.netflix.atlas.akka.WebApi import com.netflix.atlas.json.Json import com.netflix.frigga.Names class PropertiesApi( val propContext: PropertiesContext, implicit val actorRefFactory: ActorRefFactory ) extends WebApi { def routes: Route = { endpointPath("api" / "v1" / "property") { get { parameter("asg") { asg => extractRequest { request => val cluster = Names.parseName(asg).getCluster if (propContext.initialized) { val props = propContext.getClusterProps(cluster) complete(encode(request, props)) } else { complete(HttpResponse(StatusCodes.ServiceUnavailable)) } } } } } } private def encode(request: HttpRequest, props: List[PropertiesApi.Property]): HttpResponse = { val useJson = request.headers.exists(h => h.is("accept") && h.value == "application/json") if (useJson) { HttpResponse( StatusCodes.OK, entity = HttpEntity(MediaTypes.`application/json`, Json.encode(props)) ) } else { val ps = new Properties props.foreach { p => ps.setProperty(p.key, p.value) } val writer = new StringWriter() ps.store(writer, s"count: ${ps.size}") writer.close() val entity = HttpEntity(MediaTypes.`text/plain`.toContentType(HttpCharsets.`UTF-8`), writer.toString) HttpResponse(StatusCodes.OK, entity = entity) } } } object PropertiesApi { case class Property(id: String, cluster: String, key: String, value: String, timestamp: Long) }
Example 18
Source File: PropertiesApiSuite.scala From iep-apps with Apache License 2.0 | 5 votes |
package com.netflix.iep.archaius import java.io.StringReader import java.util.Properties import akka.http.scaladsl.model.HttpResponse import akka.http.scaladsl.model.MediaTypes import akka.http.scaladsl.model.StatusCode import akka.http.scaladsl.model.StatusCodes import akka.http.scaladsl.model.headers._ import akka.http.scaladsl.testkit.RouteTestTimeout import akka.http.scaladsl.testkit.ScalatestRouteTest import com.netflix.atlas.akka.RequestHandler import com.netflix.atlas.json.Json import com.netflix.spectator.api.DefaultRegistry import com.netflix.spectator.api.ManualClock import org.scalatest.funsuite.AnyFunSuite class PropertiesApiSuite extends AnyFunSuite with ScalatestRouteTest { import scala.concurrent.duration._ implicit val routeTestTimeout = RouteTestTimeout(5.second) val clock = new ManualClock() val registry = new DefaultRegistry(clock) val propContext = new PropertiesContext(registry) val endpoint = new PropertiesApi(propContext, system) val routes = RequestHandler.standardOptions(endpoint.routes) private def assertJsonContentType(response: HttpResponse): Unit = { assert(response.entity.contentType.mediaType === MediaTypes.`application/json`) } private def assertResponse(response: HttpResponse, expected: StatusCode): Unit = { assert(response.status === expected) assertJsonContentType(response) } test("no asg") { Get("/api/v1/property") ~> routes ~> check { assert(response.status === StatusCodes.BadRequest) } } test("empty") { propContext.update(Nil) Get("/api/v1/property?asg=foo-main-v001") ~> addHeader(Accept(MediaTypes.`application/json`)) ~> routes ~> check { assertResponse(response, StatusCodes.OK) assert(responseAs[String] === "[]") } } test("properties response") { propContext.update( List( PropertiesApi.Property("foo-main::a", "foo-main", "a", "b", 12345L), PropertiesApi.Property("foo-main::1", "foo-main", "1", "2", 12345L), PropertiesApi.Property("bar-main::c", "bar-main", "c", "d", 12345L) ) ) Get("/api/v1/property?asg=foo-main-v001") ~> routes ~> check { assert(response.status === StatusCodes.OK) val props = new Properties props.load(new StringReader(responseAs[String])) assert(props.size === 2) assert(props.getProperty("a") === "b") assert(props.getProperty("1") === "2") } } test("json response") { propContext.update( List( PropertiesApi.Property("foo-main::a", "foo-main", "a", "b", 12345L) ) ) Get("/api/v1/property?asg=foo-main-v001") ~> addHeader(Accept(MediaTypes.`application/json`)) ~> routes ~> check { assertResponse(response, StatusCodes.OK) val props = Json.decode[List[PropertiesApi.Property]](responseAs[String]) assert(props === List(PropertiesApi.Property("foo-main::a", "foo-main", "a", "b", 12345L))) } } }
Example 19
Source File: JsonMarshallers.scala From scala-openrtb with Apache License 2.0 | 5 votes |
package com.powerspace.openrtb.akka.marshallers import akka.http.scaladsl.marshalling.{ToEntityMarshaller, ToResponseMarshaller} import akka.http.scaladsl.model.{ContentTypes, HttpEntity, HttpResponse, MediaTypes} import com.google.openrtb.{BidRequest, BidResponse} import io.circe.Encoder object JsonMarshallers { import akka.http.scaladsl.marshalling.Marshaller._ def bidRequestJsonMarshaller(implicit encoder: Encoder[BidRequest]): ToEntityMarshaller[BidRequest] = withFixedContentType(ContentTypes.`application/json`)( bidRequest => HttpEntity(MediaTypes.`application/json`, encoder.apply(bidRequest).toString) ) def bidResponseJsonMarshaller(implicit encoder: Encoder[BidResponse]): ToEntityMarshaller[BidResponse] = withFixedContentType(ContentTypes.`application/json`)( bidResponse => HttpEntity(MediaTypes.`application/json`, encoder.apply(bidResponse).toString) ) def bidRequestHttpJsonMarshaller(implicit encoder: Encoder[BidRequest]): ToResponseMarshaller[BidRequest] = withFixedContentType(ContentTypes.`application/json`)( bidRequest => HttpResponse() .withEntity(HttpEntity(MediaTypes.`application/json`, encoder.apply(bidRequest).toString)) ) def bidResponseHttpJsonMarshaller(implicit encoder: Encoder[BidResponse]): ToResponseMarshaller[BidResponse] = withFixedContentType(ContentTypes.`application/json`)( bidResponse => HttpResponse() .withEntity(HttpEntity(MediaTypes.`application/json`, encoder.apply(bidResponse).toString)) ) }
Example 20
Source File: application.scala From phobos with Apache License 2.0 | 5 votes |
package ru.tinkoff.phobos.akka_http.marshalling import akka.http.scaladsl.marshalling.{Marshaller, ToEntityMarshaller} import akka.http.scaladsl.model.{HttpCharsets, HttpEntity, MediaTypes} import akka.http.scaladsl.unmarshalling.{FromResponseUnmarshaller, Unmarshaller} import ru.tinkoff.phobos.decoding.XmlDecoder import ru.tinkoff.phobos.encoding.XmlEncoder object application { implicit def soapApplicationXmlMarshaller[T](implicit encoder: XmlEncoder[T]): ToEntityMarshaller[T] = Marshaller.withFixedContentType(MediaTypes.`application/xml` withCharset HttpCharsets.`UTF-8`) { body => HttpEntity(MediaTypes.`application/xml` withCharset HttpCharsets.`UTF-8`, encoder.encode(body)) } implicit def soapApplicationXmlUnmarshaller[T](implicit decoder: XmlDecoder[T]): FromResponseUnmarshaller[T] = Unmarshaller.messageUnmarshallerFromEntityUnmarshaller(Unmarshaller.stringUnmarshaller.map { str => decoder.decode(str).fold(err => throw err, identity) }) }
Example 21
Source File: StaticResource.scala From sumobot with Apache License 2.0 | 5 votes |
package com.sumologic.sumobot.http_frontend import akka.http.scaladsl.model.{ContentType, ContentTypes, HttpCharsets, MediaTypes} import org.apache.commons.io.IOUtils object StaticResource { private[http_frontend] val DefaultContentType = ContentTypes.`text/html(UTF-8)` case class ContentTypePair(extension: String, contentType: ContentType) private[http_frontend] val KnownContentTypes = Array( ContentTypePair(".html", ContentTypes.`text/html(UTF-8)`), ContentTypePair(".css", ContentType(MediaTypes.`text/css`, HttpCharsets.`UTF-8`)), ContentTypePair(".js", ContentType(MediaTypes.`application/javascript`, HttpCharsets.`UTF-8`)) ) } case class StaticResource(filename: String) { def contents: Array[Byte] = { val stream = getClass.getResourceAsStream(filename) val result = IOUtils.toByteArray(stream) stream.close() result } def contentType: ContentType = { val contentType = StaticResource.KnownContentTypes.find(contentType => filename.endsWith(contentType.extension)) .map(contentTypePair => contentTypePair.contentType) contentType.getOrElse(StaticResource.DefaultContentType) } }
Example 22
Source File: StaticResourceTest.scala From sumobot with Apache License 2.0 | 5 votes |
package com.sumologic.sumobot.http_frontend import akka.http.scaladsl.model.{ContentType, ContentTypes, HttpCharsets, MediaTypes} import com.sumologic.sumobot.test.annotated.SumoBotSpec class StaticResourceTest extends SumoBotSpec { "StaticResource" should { "return correct content type" when { "passing .html file" in { StaticResource("test.html").contentType should be(ContentTypes.`text/html(UTF-8)`) } "passing .css file" in { StaticResource("test.css").contentType should be(ContentType(MediaTypes.`text/css`, HttpCharsets.`UTF-8`)) } "passing unknown extension" in { StaticResource("test.unknown").contentType should be(ContentTypes.`text/html(UTF-8)`) } } } }
Example 23
Source File: AkkaBodyBuilder.scala From chronicler with Apache License 2.0 | 5 votes |
package com.github.fsanaulla.chronicler.akka.shared.handlers import java.nio.file.Path import akka.http.scaladsl.model.{HttpEntity, MediaTypes, RequestEntity} import akka.stream.scaladsl.FileIO import com.github.fsanaulla.chronicler.core.alias.ErrorOr import com.github.fsanaulla.chronicler.core.components.BodyBuilder import com.github.fsanaulla.chronicler.core.either import com.github.fsanaulla.chronicler.core.either.EitherOps import com.github.fsanaulla.chronicler.core.model.{Appender, InfluxWriter, Point} class AkkaBodyBuilder extends BodyBuilder[RequestEntity] with Appender { override def fromFile(filePath: Path, enc: String): RequestEntity = HttpEntity( MediaTypes.`application/octet-stream`, FileIO .fromPath(filePath) ) override def fromString(string: String): RequestEntity = HttpEntity(string) override def fromStrings(strings: Seq[String]): RequestEntity = HttpEntity(strings.mkString("\n")) override def fromPoint(point: Point): RequestEntity = HttpEntity(point.serialize) override def fromPoints(points: Seq[Point]): RequestEntity = HttpEntity(points.map(_.serialize).mkString("\n")) override def fromT[T](meas: String, t: T)(implicit wr: InfluxWriter[T]): ErrorOr[RequestEntity] = wr.write(t).mapRight(append(meas, _)) override def fromSeqT[T]( meas: String, ts: Seq[T] )(implicit wr: InfluxWriter[T] ): ErrorOr[RequestEntity] = either.seq(ts.map(wr.write)).mapRight(append(meas, _)) }
Example 24
Source File: S3Request.scala From rokku with Apache License 2.0 | 5 votes |
package com.ing.wbaa.rokku.proxy.data import akka.http.scaladsl.model.RemoteAddress.Unknown import akka.http.scaladsl.model.Uri.Path import akka.http.scaladsl.model.{ HttpMethod, MediaType, MediaTypes, RemoteAddress } import com.ing.wbaa.rokku.proxy.util.S3Utils import com.typesafe.scalalogging.LazyLogging case class S3Request( credential: AwsRequestCredential, s3BucketPath: Option[String], s3Object: Option[String], accessType: AccessType, clientIPAddress: RemoteAddress = Unknown, headerIPs: HeaderIPs = HeaderIPs(), mediaType: MediaType = MediaTypes.`text/plain` ) { def userIps: UserIps = UserIps(clientIPAddress, headerIPs) } object S3Request extends LazyLogging { def apply(credential: AwsRequestCredential, path: Path, httpMethod: HttpMethod, clientIPAddress: RemoteAddress, headerIPs: HeaderIPs, mediaType: MediaType): S3Request = { val pathString = path.toString() val s3path = S3Utils.getS3PathWithoutBucketName(pathString) val s3Object = S3Utils.getS3FullObjectPath(pathString) val accessType = httpMethod.value match { case "GET" => Read(httpMethod.value) case "HEAD" => Head(httpMethod.value) case "PUT" => Put(httpMethod.value) case "POST" => Post(httpMethod.value) case "DELETE" => Delete(httpMethod.value) case _ => logger.debug("HttpMethod not supported") NoAccess } S3Request(credential, s3path, s3Object, accessType, clientIPAddress, headerIPs, mediaType) } }
Example 25
Source File: S3RequestSpec.scala From rokku with Apache License 2.0 | 5 votes |
package com.ing.wbaa.rokku.proxy.data import akka.http.scaladsl.model.{ HttpMethods, MediaTypes, RemoteAddress, Uri } import org.scalatest.diagrams.Diagrams import org.scalatest.flatspec.AnyFlatSpec class S3RequestSpec extends AnyFlatSpec with Diagrams { val testCred = AwsRequestCredential(AwsAccessKey("ak"), Some(AwsSessionToken("st"))) "S3Request" should "parse an S3 request from an http Path and Method" in { val result = S3Request(testCred, Uri.Path("/demobucket"), HttpMethods.GET, RemoteAddress.Unknown, HeaderIPs(), MediaTypes.`text/plain`) assert(result == S3Request(testCred, Some("/demobucket"), None, Read("GET"))) } it should "parse an S3 request from an http Path with object and Method" in { val result = S3Request(testCred, Uri.Path("/demobucket/demoobject"), HttpMethods.GET, RemoteAddress.Unknown, HeaderIPs(), MediaTypes.`text/plain`) assert(result == S3Request(testCred, Some("/demobucket/demoobject"), Some("demoobject"), Read("GET"))) } it should "parse an S3 request from an http Path with subfolder and Method" in { val result = S3Request(testCred, Uri.Path("/demobucket/subfolder1/"), HttpMethods.GET, RemoteAddress.Unknown, HeaderIPs(), MediaTypes.`text/plain`) assert(result == S3Request(testCred, Some("/demobucket/subfolder1/"), None, Read("GET"))) } it should "parse none for bucket if path is only root" in { val result = S3Request(testCred, Uri.Path("/"), HttpMethods.GET, RemoteAddress.Unknown, HeaderIPs(), MediaTypes.`text/plain`) assert(result == S3Request(testCred, None, None, Read("GET"))) } it should "parse none for bucket if path is empty" in { val result = S3Request(testCred, Uri.Path(""), HttpMethods.GET, RemoteAddress.Unknown, HeaderIPs(), MediaTypes.`text/plain`) assert(result == S3Request(testCred, None, None, Read("GET"))) } it should "set access to write for anything but GET" in { val result = S3Request(testCred, Uri.Path("/demobucket"), HttpMethods.POST, RemoteAddress.Unknown, HeaderIPs(), MediaTypes.`text/plain`) assert(result == S3Request(testCred, Some("/demobucket"), None, Post("POST"))) } }
Example 26
Source File: FilterRecursiveListBucketHandlerSpec.scala From rokku with Apache License 2.0 | 5 votes |
package com.ing.wbaa.rokku.proxy.handler import akka.NotUsed import akka.actor.ActorSystem import akka.http.scaladsl.model.{ HttpMethods, MediaTypes, RemoteAddress, Uri } import akka.stream.scaladsl.{ Sink, Source } import akka.stream.{ ActorMaterializer, Materializer } import akka.util.ByteString import com.ing.wbaa.rokku.proxy.data._ import org.scalatest.diagrams.Diagrams import org.scalatest.wordspec.AsyncWordSpec import scala.concurrent.ExecutionContext class FilterRecursiveListBucketHandlerSpec extends AsyncWordSpec with Diagrams with FilterRecursiveListBucketHandler { implicit val system: ActorSystem = ActorSystem.create("test-system") override implicit val executionContext: ExecutionContext = system.dispatcher implicit val requestId: RequestId = RequestId("test") implicit def materializer: Materializer = ActorMaterializer()(system) def isUserAuthorizedForRequest(request: S3Request, user: User)(implicit id: RequestId): Boolean = { user match { case User(userName, _, _, _, _) if userName.value == "admin" => true case User(userName, _, _, _, _) if userName.value == "user1" => request match { case S3Request(_, s3BucketPath, _, _, _, _, _) => if (s3BucketPath.get.startsWith("/demobucket/user/user2")) false else true } case _ => true } } val listBucketXmlResponse: String = scala.io.Source.fromResource("listBucket.xml").mkString.stripMargin.trim val adminUser = User(UserRawJson("admin", Some(Set.empty[String]), "a", "s", None)) val user1 = User(UserRawJson("user1", Some(Set.empty[String]), "a", "s", None)) val s3Request = S3Request(AwsRequestCredential(AwsAccessKey(""), None), Uri.Path("/demobucket/user"), HttpMethods.GET, RemoteAddress.Unknown, HeaderIPs(), MediaTypes.`text/plain`) val data: Source[ByteString, NotUsed] = Source.single(ByteString.fromString(listBucketXmlResponse)) "List bucket object response" should { "returns all objects to admin" in { data.via(filterRecursiveListObjects(adminUser, s3Request)).map(_.utf8String).runWith(Sink.seq).map(x => { assert(x.mkString.stripMargin.equals(listBucketXmlResponse)) }) } val filteredXml: String = scala.io.Source.fromResource("filteredListBucket.xml").mkString.stripMargin.trim "returns filtered object for user 1" in { data.via(filterRecursiveListObjects(user1, s3Request)).map(_.utf8String).runWith(Sink.seq).map(x => { assert(x.mkString.stripMargin.replaceAll("[\n\r\\s]", "") .equals(filteredXml.replaceAll("[\n\r\\s]", ""))) }) } } }
Example 27
Source File: PrometheusMarshallers.scala From akka-http-metrics with Apache License 2.0 | 5 votes |
package fr.davit.akka.http.metrics.prometheus.marshalling import java.io.StringWriter import akka.http.scaladsl.marshalling.{Marshaller, ToEntityMarshaller} import akka.http.scaladsl.model.{ContentType, HttpCharsets, HttpEntity, MediaTypes} import fr.davit.akka.http.metrics.prometheus.PrometheusRegistry import io.prometheus.client.exporter.common.TextFormat trait PrometheusMarshallers { val PrometheusContentType: ContentType = { MediaTypes.`text/plain` withParams Map("version" -> "0.0.4") withCharset HttpCharsets.`UTF-8` } implicit val marshaller: ToEntityMarshaller[PrometheusRegistry] = { Marshaller.opaque { registry => val output = new StringWriter() try { TextFormat.write004(output, registry.underlying.metricFamilySamples) HttpEntity(output.toString).withContentType(PrometheusContentType) } finally { output.close() } } } } object PrometheusMarshallers extends PrometheusMarshallers
Example 28
package org.apache.openwhisk.standalone import akka.Done import akka.actor.ActorSystem import akka.http.scaladsl.model.Uri.Query import akka.http.scaladsl.model.headers.{Accept, Authorization, BasicHttpCredentials} import akka.http.scaladsl.model.{HttpHeader, HttpMethods, MediaTypes, Uri} import org.apache.openwhisk.core.database.PutException import org.apache.openwhisk.http.PoolingRestClient import spray.json._ import scala.concurrent.{ExecutionContext, Future} class Wsk(host: String, port: Int, authKey: String)(implicit system: ActorSystem) extends DefaultJsonProtocol { import PoolingRestClient._ private implicit val ec: ExecutionContext = system.dispatcher private val client = new PoolingRestClient("http", host, port, 10) private val baseHeaders: List[HttpHeader] = { val Array(username, password) = authKey.split(':') List(Authorization(BasicHttpCredentials(username, password)), Accept(MediaTypes.`application/json`)) } def updatePgAction(name: String, content: String): Future[Done] = { val js = actionJson(name, content) val params = Map("overwrite" -> "true") val uri = Uri(s"/api/v1/namespaces/_/actions/$name").withQuery(Query(params)) client.requestJson[JsObject](mkJsonRequest(HttpMethods.PUT, uri, js, baseHeaders)).map { case Right(_) => Done case Left(status) => throw PutException(s"Error creating action $name " + status) } } private def actionJson(name: String, code: String) = { s"""{ | "namespace": "_", | "name": "$name", | "exec": { | "kind": "nodejs:default", | "code": ${quote(code)} | }, | "annotations": [{ | "key": "provide-api-key", | "value": true | }, { | "key": "web-export", | "value": true | }, { | "key": "raw-http", | "value": false | }, { | "key": "final", | "value": true | }], | "parameters": [{ | "key": "__ignore_certs", | "value": true | }] |}""".stripMargin.parseJson.asJsObject } private def quote(code: String) = { JsString(code).compactPrint } }
Example 29
Source File: BuiltInErrors.scala From endpoints4s with MIT License | 5 votes |
package endpoints4s.akkahttp.server import akka.http.scaladsl.marshalling.Marshaller import akka.http.scaladsl.model.{HttpEntity, MediaTypes} import endpoints4s.{Invalid, algebra} trait BuiltInErrors extends algebra.BuiltInErrors { this: EndpointsWithCustomErrors => def clientErrorsResponseEntity: ResponseEntity[Invalid] = Marshaller.withFixedContentType(MediaTypes.`application/json`) { invalid => HttpEntity( MediaTypes.`application/json`, endpoints4s.ujson.codecs.invalidCodec.encode(invalid) ) } def serverErrorResponseEntity: ResponseEntity[Throwable] = clientErrorsResponseEntity.compose(throwable => Invalid(throwable.getMessage)) }
Example 30
Source File: JsonEntities.scala From endpoints4s with MIT License | 5 votes |
package endpoints4s.akkahttp.server import akka.http.scaladsl.marshalling.{Marshaller, ToEntityMarshaller} import akka.http.scaladsl.model.{HttpEntity, MediaTypes} import akka.http.scaladsl.server.{Directive1, Directives} import akka.http.scaladsl.unmarshalling.{ FromEntityUnmarshaller, FromRequestUnmarshaller, Unmarshaller } import endpoints4s.{Codec, Decoder, Encoder, Invalid, Valid, Validated, algebra} trait JsonEntitiesFromEncodersAndDecoders extends algebra.JsonEntities with EndpointsWithCustomErrors { type JsonRequest[A] = Decoder[String, A] type JsonResponse[A] = Encoder[A, String] def jsonRequest[A](implicit decoder: Decoder[String, A]): RequestEntity[A] = JsonEntities.decodeJsonRequest(this)(decoder) def jsonResponse[A](implicit encoder: Encoder[A, String]): ResponseEntity[A] = JsonEntities.encodeJsonResponse(encoder) } private object JsonEntities { def decodeJsonRequest[A]( endpoints: EndpointsWithCustomErrors )(decoder: Decoder[String, A]): Directive1[A] = { implicit val fromEntityUnmarshaller: FromEntityUnmarshaller[Validated[A]] = Unmarshaller.stringUnmarshaller .forContentTypes(MediaTypes.`application/json`) .map(data => decoder.decode(data)) Directives.entity[Validated[A]](implicitly).flatMap { case Valid(a) => Directives.provide(a) case inv: Invalid => endpoints.handleClientErrors(inv) } } def encodeJsonResponse[A]( encoder: Encoder[A, String] ): ToEntityMarshaller[A] = Marshaller.withFixedContentType(MediaTypes.`application/json`) { value => HttpEntity(MediaTypes.`application/json`, encoder.encode(value)) } }
Example 31
Source File: HttpClientTransformers.scala From wix-http-testkit with MIT License | 5 votes |
package com.wix.e2e.http.client.transformers import java.io.File import akka.http.scaladsl.model.{ContentType, ContentTypes, HttpCharsets, MediaTypes} import com.wix.e2e.http.client.transformers.internals._ trait HttpClientTransformers extends HttpClientRequestUrlTransformers with HttpClientRequestHeadersTransformers with HttpClientRequestBodyTransformers with HttpClientRequestTransformersOps object HttpClientTransformers extends HttpClientTransformers trait HttpClientContentTypes { val TextPlain = ContentTypes.`text/plain(UTF-8)` val JsonContent = ContentTypes.`application/json` val XmlContent = ContentType(MediaTypes.`application/xml`, HttpCharsets.`UTF-8`) val BinaryStream = ContentTypes.`application/octet-stream` val FormUrlEncoded = ContentTypes.`application/x-www-form-urlencoded` } object HttpClientContentTypes extends HttpClientContentTypes sealed trait RequestPart case class PlainRequestPart(body: String, contentType: ContentType = TextPlain) extends RequestPart case class BinaryRequestPart(body: Array[Byte], contentType: ContentType = BinaryStream, filename: Option[String] = None) extends RequestPart case class FileRequestPart(file: File, contentType: ContentType = BinaryStream, filename: Option[String] = None) extends RequestPart case class FileNameRequestPart(filepath: String, contentType: ContentType = BinaryStream, filename: Option[String] = None) extends RequestPart
Example 32
Source File: FileDirective.scala From akka-http-file-server with Apache License 2.0 | 5 votes |
package akkahttp import java.io.File import akka.http.scaladsl.model.{HttpEntity, MediaTypes, Multipart} import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server._ import akka.stream.Materializer import akka.stream.io.{SynchronousFileSink, SynchronousFileSource} import scala.concurrent.{ExecutionContext, Future} object FileDirective { //form field name type Name = String case class FileInfo(fileName: String, targetFile: String, length: Long) private def uploadFileImpl(implicit mat: Materializer, ec: ExecutionContext): Directive1[Future[Map[Name, FileInfo]]] = { Directive[Tuple1[Future[Map[Name, FileInfo]]]] { inner => entity(as[Multipart.FormData]) { (formdata: Multipart.FormData) => val fileNameMap = formdata.parts.mapAsync(1) { p => if (p.filename.isDefined) { val targetPath = File.createTempFile(s"userfile_${p.name}_${p.filename.getOrElse("")}", "") val written = p.entity.dataBytes.runWith(SynchronousFileSink(targetPath)) written.map(written => Map(p.name -> FileInfo(p.filename.get, targetPath.getAbsolutePath, written))) } else { Future(Map.empty[Name, FileInfo]) } }.runFold(Map.empty[Name, FileInfo])((set, value) => set ++ value) inner(Tuple1(fileNameMap)) } } } def uploadFile: Directive1[Map[Name, FileInfo]] = { Directive[Tuple1[Map[Name, FileInfo]]] { inner => extractMaterializer {implicit mat => extractExecutionContext {implicit ec => uploadFileImpl(mat, ec) { filesFuture => ctx => { filesFuture.map(map => inner(Tuple1(map))).flatMap(route => route(ctx)) } } } } } } def downloadFile(file: String): Route = { val f = new File(file) val responseEntity = HttpEntity( MediaTypes.`application/octet-stream`, f.length, SynchronousFileSource(f, chunkSize = 262144)) complete(responseEntity) } }
Example 33
Source File: PhoneBookWebService.scala From udash-demos with GNU General Public License v3.0 | 5 votes |
package io.udash.demos.rest.api import akka.http.scaladsl.marshalling._ import akka.http.scaladsl.model.{HttpEntity, MediaTypes, StatusCodes} import com.avsystem.commons.serialization.GenCodec import io.udash.demos.rest.model._ import io.udash.demos.rest.services.{ContactService, InMemoryContactService, InMemoryPhoneBookService, PhoneBookService} import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.{RequestContext, Route} import akka.http.scaladsl.unmarshalling.{FromEntityUnmarshaller, Unmarshaller} import com.avsystem.commons.serialization.json.{JsonStringInput, JsonStringOutput} trait PhoneBookWebServiceSpec { private val staticsDir = "frontend/target/UdashStatics/WebContent" val phoneBookService: PhoneBookService val contactService: ContactService implicit def optionMarshaller[T](implicit codec: GenCodec[T]): ToResponseMarshaller[Option[T]] = gencodecMarshaller[Option[T]](GenCodec.optionCodec(codec)) implicit def gencodecMarshaller[T](implicit codec: GenCodec[T]): ToEntityMarshaller[T] = Marshaller.withFixedContentType(MediaTypes.`application/json`) { value => HttpEntity(MediaTypes.`application/json`, JsonStringOutput.write(value)) } implicit def gencodecUnmarshaller[T](implicit codec: GenCodec[T]): FromEntityUnmarshaller[T] = Unmarshaller.stringUnmarshaller.forContentTypes(MediaTypes.`application/json`).map{ data => JsonStringInput.read[T](data) } private def completeIfNonEmpty[T](ctx: RequestContext)(opt: Option[T])(implicit rm: ToResponseMarshaller[T]) = opt match { case Some(v) => complete(v)(ctx) case None => complete(StatusCodes.NotFound)(ctx) } val route: Route = { pathPrefix("scripts"){ getFromDirectory(s"$staticsDir/scripts") } ~ pathPrefix("assets"){ getFromDirectory(s"$staticsDir/assets") } ~ pathPrefix("api") { pathPrefix("book") { pathPrefix(Segment) { segment => val bookId = PhoneBookId(segment.toInt) pathPrefix("contacts") { pathPrefix("count") { get { entity(as[Contact]) { contact => complete { contactService.create(contact) } } } } } ~ get { getFromFile(s"$staticsDir/index.html") } } } class PhoneBookWebService() extends PhoneBookWebServiceSpec { override val phoneBookService: PhoneBookService = InMemoryPhoneBookService override val contactService: ContactService = InMemoryContactService }
Example 34
Source File: AuthRouteTest.scala From akka-http-rest with MIT License | 5 votes |
package me.archdev.http.routes import akka.http.scaladsl.model.{HttpEntity, MediaTypes} import akka.http.scaladsl.server.Route import me.archdev.BaseServiceTest import me.archdev.restapi.core.auth.AuthService import me.archdev.restapi.http.routes.AuthRoute import org.mockito.Mockito._ import scala.concurrent.Future class AuthRouteTest extends BaseServiceTest { "AuthRoute" when { "POST /auth/signIn" should { "return 200 and token if sign in successful" in new Context { when(authService.signIn("test", "test")).thenReturn(Future.successful(Some("token"))) val requestEntity = HttpEntity(MediaTypes.`application/json`, s"""{"login": "test", "password": "test"}""") Post("/auth/signIn", requestEntity) ~> authRoute ~> check { responseAs[String] shouldBe "\"token\"" status.intValue() shouldBe 200 } } "return 400 if signIn unsuccessful" in new Context { when(authService.signIn("test", "test")).thenReturn(Future.successful(None)) val requestEntity = HttpEntity(MediaTypes.`application/json`, s"""{"login": "test", "password": "test"}""") Post("/auth/signIn", requestEntity) ~> authRoute ~> check { status.intValue() shouldBe 400 } } } "POST /auth/signUp" should { "return 201 and token" in new Context { when(authService.signUp("test", "test", "test")).thenReturn(Future.successful("token")) val requestEntity = HttpEntity(MediaTypes.`application/json`, s"""{"username": "test", "email": "test", "password": "test"}""") Post("/auth/signUp", requestEntity) ~> authRoute ~> check { responseAs[String] shouldBe "\"token\"" status.intValue() shouldBe 201 } } } } trait Context { val authService: AuthService = mock[AuthService] val authRoute: Route = new AuthRoute(authService).route } }
Example 35
Source File: ArchiveRoutes.scala From nexus with Apache License 2.0 | 5 votes |
package ch.epfl.bluebrain.nexus.kg.routes import akka.http.scaladsl.model.StatusCodes.{Created, OK} import akka.http.scaladsl.model.headers.Accept import akka.http.scaladsl.model.{HttpEntity, MediaTypes} import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import ch.epfl.bluebrain.nexus.admin.client.types.Project import ch.epfl.bluebrain.nexus.iam.acls.Acls import ch.epfl.bluebrain.nexus.iam.realms.Realms import ch.epfl.bluebrain.nexus.iam.types.Caller import ch.epfl.bluebrain.nexus.iam.types.Identity.Subject import ch.epfl.bluebrain.nexus.kg.KgError.{InvalidOutputFormat, UnacceptedResponseContentType} import ch.epfl.bluebrain.nexus.kg.archives.Archive._ import ch.epfl.bluebrain.nexus.kg.directives.PathDirectives._ import ch.epfl.bluebrain.nexus.kg.directives.ProjectDirectives._ import ch.epfl.bluebrain.nexus.kg.directives.QueryDirectives.outputFormat import ch.epfl.bluebrain.nexus.kg.marshallers.instances._ import ch.epfl.bluebrain.nexus.kg.resources._ import ch.epfl.bluebrain.nexus.kg.resources.syntax._ import ch.epfl.bluebrain.nexus.kg.routes.OutputFormat.Tar import ch.epfl.bluebrain.nexus.rdf.Iri.AbsoluteIri import ch.epfl.bluebrain.nexus.rdf.Iri.Path._ import ch.epfl.bluebrain.nexus.service.config.ServiceConfig import ch.epfl.bluebrain.nexus.service.directives.AuthDirectives import io.circe.Json import kamon.instrumentation.akka.http.TracingDirectives.operationName import monix.eval.Task import monix.execution.Scheduler.Implicits.global class ArchiveRoutes private[routes] (archives: Archives[Task], acls: Acls[Task], realms: Realms[Task])(implicit project: Project, caller: Caller, config: ServiceConfig ) extends AuthDirectives(acls, realms) { private val responseType = MediaTypes.`application/x-tar` private val projectPath = project.organizationLabel / project.label implicit private val subject: Subject = caller.subject def routes(id: AbsoluteIri): Route = { val resId = Id(project.ref, id) concat( // Create archive (put & pathEndOrSingleSlash) { operationName(s"/${config.http.prefix}/archives/{org}/{project}/{id}") { (authorizeFor(projectPath, write) & projectNotDeprecated) { entity(as[Json]) { source => complete(archives.create(resId, source).value.runWithStatus(Created)) } } } }, // Fetch archive (get & outputFormat(strict = true, Tar) & pathEndOrSingleSlash) { case Tar => getArchive(resId) case format: NonBinaryOutputFormat => getResource(resId)(format) case other => failWith(InvalidOutputFormat(other.toString)) } ) } private def getResource(resId: ResId)(implicit format: NonBinaryOutputFormat): Route = completeWithFormat(archives.fetch(resId).value.runWithStatus(OK)) private def getArchive(resId: ResId): Route = { (parameter("ignoreNotFound".as[Boolean] ? false) & extractCallerAcls(anyProject)) { (ignoreNotFound, acls) => onSuccess(archives.fetchArchive(resId, ignoreNotFound)(acls, caller).value.runToFuture) { case Right(source) => headerValueByType[Accept](()) { accept => if (accept.mediaRanges.exists(_.matches(responseType))) complete(HttpEntity(responseType, source)) else failWith( UnacceptedResponseContentType( s"File Media Type '$responseType' does not match the Accept header value '${accept.mediaRanges.mkString(", ")}'" ) ) } case Left(err) => complete(err) } } } }
Example 36
Source File: AttributesComputation.scala From nexus with Apache License 2.0 | 5 votes |
package ch.epfl.bluebrain.nexus.storage.attributes import java.nio.file.{Files, Path} import java.security.MessageDigest import akka.http.scaladsl.model.HttpCharsets.`UTF-8` import akka.http.scaladsl.model.MediaTypes.{`application/octet-stream`, `application/x-tar`} import akka.http.scaladsl.model.{ContentType, MediaType, MediaTypes} import akka.stream.Materializer import akka.stream.scaladsl.{Keep, Sink} import akka.util.ByteString import cats.effect.Effect import cats.implicits._ import ch.epfl.bluebrain.nexus.storage.File.{Digest, FileAttributes} import ch.epfl.bluebrain.nexus.storage.StorageError.InternalError import ch.epfl.bluebrain.nexus.storage._ import org.apache.commons.io.FilenameUtils import scala.concurrent.{ExecutionContext, Future} import scala.util.{Failure, Success, Try} trait AttributesComputation[F[_], Source] { implicit def akkaAttributes[F[_]](implicit ec: ExecutionContext, mt: Materializer, F: Effect[F] ): AttributesComputation[F, AkkaSource] = (path: Path, algorithm: String) => { if (!Files.exists(path)) F.raiseError(InternalError(s"Path not found '$path'")) else Try(MessageDigest.getInstance(algorithm)) match { case Success(msgDigest) => val isDir = Files.isDirectory(path) val source = if (isDir) folderSource(path) else fileSource(path) source .alsoToMat(sinkSize)(Keep.right) .toMat(sinkDigest(msgDigest)) { (bytesF, digestF) => (bytesF, digestF).mapN { case (bytes, digest) => FileAttributes(path.toAkkaUri, bytes, digest, detectMediaType(path, isDir)) } } .run() .to[F] case Failure(_) => F.raiseError(InternalError(s"Invalid algorithm '$algorithm'.")) } } }
Example 37
Source File: AkkaHttpClientSpec.scala From aws-spi-akka-http with Apache License 2.0 | 5 votes |
package com.github.matsluni.akkahttpspi import akka.http.scaladsl.model.HttpHeader.ParsingResult.Ok import akka.http.scaladsl.model.{HttpHeader, MediaTypes} import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec class AkkaHttpClientSpec extends AnyWordSpec with Matchers { "AkkaHttpClient" should { "parse custom content type" in { val contentTypeStr = "application/xml" val contentType = AkkaHttpClient.tryCreateCustomContentType(contentTypeStr) contentType.mediaType should be (MediaTypes.`application/xml`) } "remove 'ContentType' and 'ContentLength' header from headers" in { val Ok(contentType, pErr1) = HttpHeader.parse("Content-Type", "application/xml") val Ok(contentLength, pErr2) = HttpHeader.parse("Content-Length", "123") val filteredHeaders = AkkaHttpClient.filterContentTypeAndContentLengthHeader(contentType :: contentLength :: Nil) pErr1 should have size 0 pErr2 should have size 0 filteredHeaders should have size 0 } } }
Example 38
Source File: AkkaHttpHelpers.scala From akka-viz with MIT License | 5 votes |
package akkaviz.server import akka.http.scaladsl.marshalling.{Marshal, Marshaller} import akka.http.scaladsl.model.HttpEntity.ChunkStreamPart import akka.http.scaladsl.model.{HttpEntity, HttpResponse, MediaTypes} import akka.http.scaladsl.server.{Directives, StandardRoute} import akka.stream.scaladsl.{Flow, Source} import scala.concurrent.ExecutionContext trait AkkaHttpHelpers { def asJsonArray[T](implicit m: Marshaller[T, String], ec: ExecutionContext): Flow[T, HttpEntity.ChunkStreamPart, _] = { Flow.apply[T] .mapAsync[String](4)(t => Marshal(t).to[String]) .scan[Option[ChunkStreamPart]](None) { case (None, s: String) => Some(ChunkStreamPart(s)) case (_, s: String) => Some(ChunkStreamPart(s",${s}")) }.mapConcat(_.toList) .prepend(Source.single(ChunkStreamPart("["))) .concat(Source.single(ChunkStreamPart("]"))) } def completeAsJson[T](source: Source[T, _])(implicit m: Marshaller[T, String], ec: ExecutionContext): StandardRoute = { Directives.complete(HttpResponse( entity = HttpEntity.Chunked(MediaTypes.`application/json`, source.via(asJsonArray)) )) } } object AkkaHttpHelpers extends AkkaHttpHelpers
Example 39
Source File: ArchiveSupport.scala From akka-viz with MIT License | 5 votes |
package akkaviz.server import akka.http.scaladsl.marshalling.Marshaller import akka.http.scaladsl.marshalling.Marshalling.WithFixedContentType import akka.http.scaladsl.model.MediaTypes import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.Route import akka.stream.scaladsl.{Flow, Source} import akkaviz.config.Config import akkaviz.persistence.{PersistenceSources, ReceivedRecord} import akkaviz.rest import com.datastax.driver.core.utils.UUIDs import org.reactivestreams.Publisher import scala.concurrent.ExecutionContext.Implicits.global trait ArchiveSupport { def isArchiveEnabled: Boolean def receivedOf(ref: String): Source[ReceivedRecord, _] def receivedBetween(ref: String, ref2: String): Source[ReceivedRecord, _] def archiveRouting: Route = get { pathPrefix("messages") { if (isArchiveEnabled) { path("of" / Segment) { ref => AkkaHttpHelpers.completeAsJson(receivedOf(ref).via(receivedRecordToRestReceived)) } ~ path("between" / Segment / Segment) { (ref, ref2) => AkkaHttpHelpers.completeAsJson(receivedBetween(ref, ref2).via(receivedRecordToRestReceived)) } } else { reject } } } private[this] implicit val receivedRecordMarshaller: Marshaller[rest.Received, String] = Marshaller.strict { received => WithFixedContentType(MediaTypes.`application/json`, () => upickle.default.write(received)) } private[this] def receivedRecordToRestReceived = Flow[ReceivedRecord].map { rr => rest.Received(rr.millis, rr.direction, rr.first, rr.second, rr.data) } }
Example 40
Source File: AkkaHttpHelpersTest.scala From akka-viz with MIT License | 5 votes |
package akkaviz.server import akka.actor.ActorSystem import akka.http.scaladsl.marshalling.Marshaller import akka.http.scaladsl.marshalling.Marshalling.WithFixedContentType import akka.http.scaladsl.model.MediaTypes import akka.http.scaladsl.testkit.ScalatestRouteTest import akka.stream.ActorMaterializer import akka.stream.scaladsl._ import akka.stream.testkit.scaladsl._ import org.scalatest.concurrent.ScalaFutures import org.scalatest.{FunSuite, Matchers} import scala.concurrent.duration._ class AkkaHttpHelpersTest extends FunSuite with Matchers with ScalaFutures with ScalatestRouteTest { import AkkaHttpHelpers._ override implicit val patienceConfig: PatienceConfig = PatienceConfig(10.seconds) private[this] implicit val system: ActorSystem = ActorSystem() private[this] implicit val materializer = ActorMaterializer()(system) private[this] implicit val marshaller = Marshaller.strict[Int, String] { received => WithFixedContentType(MediaTypes.`application/json`, () => String.valueOf(received)) } test("Should work for empty Source") { whenReady(Source.empty[Int].via(asJsonArray).map(_.data.utf8String).runReduce(_ + _)) { _ shouldBe "[]" } } test("Should work for single element in Source") { whenReady(Source.single(1).via(asJsonArray).map(_.data.utf8String).runReduce(_ + _)) { _ shouldBe "[1]" } } test("Should work for multiple elements element in Source") { whenReady(Source(List(1, 2, 3)).via(asJsonArray).map(_.data.utf8String).runReduce(_ + _)) { _ shouldBe "[1,2,3]" } } test("asJsonArray is incremental") { val (pub, sub) = TestSource.probe[Int] .via(asJsonArray) .map(_.data().utf8String) .toMat(TestSink.probe[String])(Keep.both) .run() pub.sendNext(1) sub.request(10) sub.expectNext("[") pub.sendNext(2) sub.expectNext("1") pub.sendNext(3) sub.expectNext(",2") pub.sendComplete() sub.expectNext(",3") sub.expectNext("]") sub.expectComplete() } test("completeAsJson works properly") { val source = Source(List(1, 2, 3)) Get() ~> completeAsJson(source) ~> check { chunks should have size (5) responseAs[String] shouldEqual "[1,2,3]" } } }
Example 41
Source File: SprayJsonSupport.scala From mist with Apache License 2.0 | 5 votes |
package io.hydrosphere.mist.master.interfaces import scala.language.implicitConversions import akka.http.scaladsl.marshalling.{ ToEntityMarshaller, Marshaller } import akka.http.scaladsl.unmarshalling.{ FromEntityUnmarshaller, Unmarshaller } import akka.http.scaladsl.model.{ MediaTypes, HttpCharsets } import spray.json._ trait SprayJsonSupport { implicit def sprayJsonUnmarshallerConverter[T](reader: RootJsonReader[T]): FromEntityUnmarshaller[T] = sprayJsonUnmarshaller(reader) implicit def sprayJsonUnmarshaller[T](implicit reader: RootJsonReader[T]): FromEntityUnmarshaller[T] = sprayJsValueUnmarshaller.map(jsonReader[T].read) implicit def sprayJsValueUnmarshaller: FromEntityUnmarshaller[JsValue] = Unmarshaller.byteStringUnmarshaller.mapWithCharset { (data, charset) ⇒ val input = if (charset == HttpCharsets.`UTF-8`) ParserInput(data.toArray) else ParserInput(data.decodeString(charset.nioCharset.name)) // FIXME: identify charset by instance, not by name! JsonParser(input) } implicit def sprayJsonMarshallerConverter[T](writer: RootJsonWriter[T])(implicit printer: JsonPrinter = PrettyPrinter): ToEntityMarshaller[T] = sprayJsonMarshaller[T](writer, printer) implicit def sprayJsonMarshaller[T](implicit writer: RootJsonWriter[T], printer: JsonPrinter = PrettyPrinter): ToEntityMarshaller[T] = sprayJsValueMarshaller compose writer.write implicit def sprayJsValueMarshaller(implicit printer: JsonPrinter = PrettyPrinter): ToEntityMarshaller[JsValue] = Marshaller.StringMarshaller.wrap(MediaTypes.`application/json`)(printer) } object SprayJsonSupport extends SprayJsonSupport
Example 42
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 43
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 } } }