+htp add selectPreferredLanguage directive incl. docs

This commit is contained in:
Mathias 2015-11-27 12:11:02 +01:00
parent d036aee09f
commit 8fc02dd799
6 changed files with 132 additions and 3 deletions

View file

@ -5,11 +5,11 @@
package akka.http.scaladsl.server
package directives
import scala.concurrent.{ Await, Promise }
import scala.concurrent.duration._
import scala.util.Try
import akka.http.scaladsl.model._
import headers._
import HttpMethods._
import MediaTypes._
import Uri._
class MiscDirectivesSpec extends RoutingSpec {
@ -30,4 +30,63 @@ class MiscDirectivesSpec extends RoutingSpec {
} ~> check { responseAs[String] shouldEqual "1.2.3.4" }
}
}
"the selectPreferredLanguage directive" should {
"Accept-Language: de, en" test { selectFrom
selectFrom("de", "en") shouldEqual "de"
selectFrom("en", "de") shouldEqual "de"
}
"Accept-Language: en, de" test { selectFrom
selectFrom("de", "en") shouldEqual "en"
selectFrom("en", "de") shouldEqual "en"
}
"Accept-Language: en, de;q=.5" test { selectFrom
selectFrom("de", "en") shouldEqual "en"
selectFrom("en", "de") shouldEqual "en"
}
"Accept-Language: en;q=.5, de" test { selectFrom
selectFrom("de", "en") shouldEqual "de"
selectFrom("en", "de") shouldEqual "de"
}
"Accept-Language: en-US, en;q=.7, *;q=.1, de;q=.5" test { selectFrom
selectFrom("en", "en-US") shouldEqual "en-US"
selectFrom("de", "en") shouldEqual "en"
selectFrom("de", "hu") shouldEqual "de"
selectFrom("de-DE", "hu") shouldEqual "de-DE"
selectFrom("hu", "es") shouldEqual "hu"
selectFrom("es", "hu") shouldEqual "es"
}
"Accept-Language: en, *;q=.5, de;q=0" test { selectFrom
selectFrom("es", "de") shouldEqual "es"
selectFrom("de", "es") shouldEqual "es"
selectFrom("es", "en") shouldEqual "en"
}
"Accept-Language: en, *;q=0" test { selectFrom
selectFrom("es", "de") shouldEqual "es"
selectFrom("de", "es") shouldEqual "de"
selectFrom("es", "en") shouldEqual "en"
}
}
implicit class AddStringToIn(acceptLanguageHeaderString: String) {
def test(body: ((String*) String) Unit): Unit =
s"properly handle `$acceptLanguageHeaderString`" in {
val Array(name, value) = acceptLanguageHeaderString.split(':')
val acceptLanguageHeader = HttpHeader.parse(name.trim, value) match {
case HttpHeader.ParsingResult.Ok(h: `Accept-Language`, Nil) h
case result fail(result.toString)
}
body { availableLangs
val selected = Promise[String]()
val first = Language(availableLangs.head)
val more = availableLangs.tail.map(Language(_))
Get() ~> addHeader(acceptLanguageHeader) ~> {
selectPreferredLanguage(first, more: _*) { lang
complete(lang.toString)
}
} ~> check(selected.complete(Try(responseAs[String])))
Await.result(selected.future, 1.second)
}
}
}
}