diff --git a/akka-http-core/src/main/scala/akka/http/scaladsl/model/HttpCharset.scala b/akka-http-core/src/main/scala/akka/http/scaladsl/model/HttpCharset.scala index 8a5f7d86c9..870857e561 100644 --- a/akka-http-core/src/main/scala/akka/http/scaladsl/model/HttpCharset.scala +++ b/akka-http-core/src/main/scala/akka/http/scaladsl/model/HttpCharset.scala @@ -70,6 +70,7 @@ final case class HttpCharset private[http] (override val value: String)(val alia } def withQValue(qValue: Float): HttpCharsetRange = HttpCharsetRange(this, qValue.toFloat) + override def toRange: HttpCharsetRange = HttpCharsetRange(this) /** Java API */ def getAliases: JIterable[String] = { diff --git a/akka-http-tests/src/test/scala/akka/http/scaladsl/marshalling/ContentNegotiationSpec.scala b/akka-http-tests/src/test/scala/akka/http/scaladsl/marshalling/ContentNegotiationSpec.scala index 0be87e5d98..2145ee3ac3 100644 --- a/akka-http-tests/src/test/scala/akka/http/scaladsl/marshalling/ContentNegotiationSpec.scala +++ b/akka-http-tests/src/test/scala/akka/http/scaladsl/marshalling/ContentNegotiationSpec.scala @@ -53,6 +53,13 @@ class ContentNegotiationSpec extends FreeSpec with Matchers { accept(`text/plain` withCharset `UTF-8`) should reject } + "manually created Accept-Charset: UTF-16" in testHeaders(headers.`Accept-Charset`(Vector(HttpCharsets.`UTF-16`.toRange))) { accept ⇒ + accept(`text/plain`) should select(`text/plain`, `UTF-16`) + + // FIXME: reenable, currently fails because of #17984 + // accept(`text/plain` withCharset `UTF-8`) should reject + } + "Accept-Charset: UTF-16, UTF-8" test { accept ⇒ accept(`text/plain`) should select(`text/plain`, `UTF-8`) accept(`text/plain` withCharset `UTF-16`) should select(`text/plain`, `UTF-16`) diff --git a/akka-http/src/main/scala/akka/http/scaladsl/marshalling/Marshal.scala b/akka-http/src/main/scala/akka/http/scaladsl/marshalling/Marshal.scala index b246797a38..e8fb1f5f24 100644 --- a/akka-http/src/main/scala/akka/http/scaladsl/marshalling/Marshal.scala +++ b/akka-http/src/main/scala/akka/http/scaladsl/marshalling/Marshal.scala @@ -62,7 +62,7 @@ class Marshal[A](val value: A) { if (qValueCS(`UTF-8`) == 1f) withCharset(`UTF-8`) // prefer UTF-8 if fully accepted else charsetRanges match { // pick the charset which the highest q-value (head of charsetRanges) if it isn't explicitly rejected - case (HttpCharsetRange.One(cs, qValue)) :: _ if qValue > 0f ⇒ withCharset(cs) + case (HttpCharsetRange.One(cs, qValue)) +: _ if qValue > 0f ⇒ withCharset(cs) case _ ⇒ acc }