Skip to content

Commit

Permalink
Media types can be overridden for both marshaller and unmarshaller (e…
Browse files Browse the repository at this point in the history
…xcept Jackson) (#186)
  • Loading branch information
nadavwr authored and hseeberger committed Dec 26, 2017
1 parent 1cf6f3e commit 1e71578
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 8 deletions.
Expand Up @@ -18,6 +18,7 @@ package de.heikoseeberger.akkahttpargonaut

import akka.http.scaladsl.marshalling.{ Marshaller, ToEntityMarshaller }
import akka.http.scaladsl.model.ContentTypeRange
import akka.http.scaladsl.model.MediaType
import akka.http.scaladsl.model.MediaTypes.`application/json`
import akka.http.scaladsl.unmarshalling.{ FromEntityUnmarshaller, Unmarshaller }
import akka.util.ByteString
Expand All @@ -39,6 +40,9 @@ object ArgonautSupport extends ArgonautSupport
trait ArgonautSupport {

def unmarshallerContentTypes: Seq[ContentTypeRange] =
mediaTypes.map(ContentTypeRange.apply)

def mediaTypes: Seq[MediaType.WithFixedCharset] =
List(`application/json`)

private val jsonStringUnmarshaller =
Expand All @@ -49,7 +53,8 @@ trait ArgonautSupport {
case (data, charset) => data.decodeString(charset.nioCharset.name)
}

private val jsonStringMarshaller = Marshaller.stringMarshaller(`application/json`)
private val jsonStringMarshaller =
Marshaller.oneOf(mediaTypes: _*)(Marshaller.stringMarshaller)

/**
* HTTP entity => `A`
Expand Down
Expand Up @@ -20,6 +20,7 @@ import java.io.{ ByteArrayOutputStream, IOException }

import akka.http.scaladsl.marshalling.{ Marshaller, ToEntityMarshaller }
import akka.http.scaladsl.model.ContentTypeRange
import akka.http.scaladsl.model.MediaType
import akka.http.scaladsl.model.MediaTypes.`application/json`
import akka.http.scaladsl.unmarshalling.{ FromEntityUnmarshaller, Unmarshaller }
import akka.util.ByteString
Expand All @@ -40,6 +41,9 @@ object AvroSupport extends AvroSupport
trait AvroSupport {

def unmarshallerContentTypes: Seq[ContentTypeRange] =
mediaTypes.map(ContentTypeRange.apply)

def mediaTypes: Seq[MediaType.WithFixedCharset] =
List(`application/json`)

private val jsonStringUnmarshaller =
Expand All @@ -50,7 +54,8 @@ trait AvroSupport {
case (data, charset) => data.decodeString(charset.nioCharset.name)
}

private val jsonStringMarshaller = Marshaller.stringMarshaller(`application/json`)
private val jsonStringMarshaller =
Marshaller.oneOf(mediaTypes: _*)(Marshaller.stringMarshaller)

/**
* HTTP entity => `A`
Expand Down
Expand Up @@ -17,7 +17,8 @@
package de.heikoseeberger.akkahttpcirce

import akka.http.scaladsl.marshalling.{ Marshaller, ToEntityMarshaller }
import akka.http.scaladsl.model.{ ContentTypeRange, HttpEntity }
import akka.http.scaladsl.model.{ ContentType, ContentTypeRange, HttpEntity }
import akka.http.scaladsl.model.MediaType
import akka.http.scaladsl.model.MediaTypes.`application/json`
import akka.http.scaladsl.unmarshalling.{ FromEntityUnmarshaller, Unmarshaller }
import akka.util.ByteString
Expand Down Expand Up @@ -68,6 +69,9 @@ trait ErrorAccumulatingCirceSupport extends BaseCirceSupport with ErrorAccumulat
trait BaseCirceSupport {

def unmarshallerContentTypes: Seq[ContentTypeRange] =
mediaTypes.map(ContentTypeRange.apply)

def mediaTypes: Seq[MediaType.WithFixedCharset] =
List(`application/json`)

/**
Expand All @@ -78,8 +82,10 @@ trait BaseCirceSupport {
implicit final def jsonMarshaller(
implicit printer: Printer = Printer.noSpaces
): ToEntityMarshaller[Json] =
Marshaller.withFixedContentType(`application/json`) { json =>
HttpEntity(`application/json`, printer.pretty(json))
Marshaller.oneOf(mediaTypes: _*) { mediaType =>
Marshaller.withFixedContentType(ContentType(mediaType)) { json =>
HttpEntity(`application/json`, printer.pretty(json))
}
}

/**
Expand Down
Expand Up @@ -20,6 +20,7 @@ import java.lang.reflect.InvocationTargetException

import akka.http.scaladsl.marshalling.{ Marshaller, ToEntityMarshaller }
import akka.http.scaladsl.model.ContentTypeRange
import akka.http.scaladsl.model.MediaType
import akka.http.scaladsl.model.MediaTypes.`application/json`
import akka.http.scaladsl.unmarshalling.{ FromEntityUnmarshaller, Unmarshaller }
import akka.util.ByteString
Expand Down Expand Up @@ -50,6 +51,9 @@ trait Json4sSupport {
import Json4sSupport._

def unmarshallerContentTypes: Seq[ContentTypeRange] =
mediaTypes.map(ContentTypeRange.apply)

def mediaTypes: Seq[MediaType.WithFixedCharset] =
List(`application/json`)

private val jsonStringUnmarshaller =
Expand All @@ -60,7 +64,8 @@ trait Json4sSupport {
case (data, charset) => data.decodeString(charset.nioCharset.name)
}

private val jsonStringMarshaller = Marshaller.stringMarshaller(`application/json`)
private val jsonStringMarshaller =
Marshaller.oneOf(mediaTypes: _*)(Marshaller.stringMarshaller)

/**
* HTTP entity => `A`
Expand Down
Expand Up @@ -18,6 +18,7 @@ package de.heikoseeberger.akkahttpplayjson

import akka.http.scaladsl.marshalling.{ Marshaller, ToEntityMarshaller }
import akka.http.scaladsl.model.ContentTypeRange
import akka.http.scaladsl.model.MediaType
import akka.http.scaladsl.model.MediaTypes.`application/json`
import akka.http.scaladsl.server.{ RejectionError, ValidationRejection }
import akka.http.scaladsl.unmarshalling.{ FromEntityUnmarshaller, Unmarshaller }
Expand All @@ -43,6 +44,9 @@ trait PlayJsonSupport {
import PlayJsonSupport._

def unmarshallerContentTypes: Seq[ContentTypeRange] =
mediaTypes.map(ContentTypeRange.apply)

def mediaTypes: Seq[MediaType.WithFixedCharset] =
List(`application/json`)

private val jsonStringUnmarshaller =
Expand All @@ -53,7 +57,8 @@ trait PlayJsonSupport {
case (data, charset) => data.decodeString(charset.nioCharset.name)
}

private val jsonStringMarshaller = Marshaller.stringMarshaller(`application/json`)
private val jsonStringMarshaller =
Marshaller.oneOf(mediaTypes: _*)(Marshaller.stringMarshaller)

/**
* HTTP entity => `A`
Expand Down
Expand Up @@ -18,6 +18,7 @@ package de.heikoseeberger.akkahttpupickle

import akka.http.scaladsl.marshalling.{ Marshaller, ToEntityMarshaller }
import akka.http.scaladsl.model.ContentTypeRange
import akka.http.scaladsl.model.MediaType
import akka.http.scaladsl.model.MediaTypes.`application/json`
import akka.http.scaladsl.unmarshalling.{ FromEntityUnmarshaller, Unmarshaller }
import akka.util.ByteString
Expand All @@ -36,6 +37,9 @@ object UpickleSupport extends UpickleSupport
trait UpickleSupport {

def unmarshallerContentTypes: Seq[ContentTypeRange] =
mediaTypes.map(ContentTypeRange.apply)

def mediaTypes: Seq[MediaType.WithFixedCharset] =
List(`application/json`)

private val jsonStringUnmarshaller =
Expand All @@ -46,7 +50,8 @@ trait UpickleSupport {
case (data, charset) => data.decodeString(charset.nioCharset.name)
}

private val jsonStringMarshaller = Marshaller.stringMarshaller(`application/json`)
private val jsonStringMarshaller =
Marshaller.oneOf(mediaTypes: _*)(Marshaller.stringMarshaller)

/**
* HTTP entity => `A`
Expand Down

0 comments on commit 1e71578

Please sign in to comment.