akka-http: Как я могу использовать / скрыть извлеченное значение?
Я пытаюсь написать директиву, которая отклоняет не-AJAX-запросы. Код ниже не работает, очевидно:
import akka.http.scaladsl.model.HttpHeader
import akka.http.scaladsl.server.Directive0
import akka.http.scaladsl.server.directives.BasicDirectives
import akka.http.scaladsl.server.directives.HeaderDirectives
import akka.http.scaladsl.server.directives.RouteDirectives
trait AjaxDirectives extends BasicDirectives with HeaderDirectives with RouteDirectives {
private val valid = "XMLHttpRequest"
def ajax(): Directive0 = {
headerValueByName("X-Requested-With") { header ⇒
if (header == valid) {
pass
} else {
reject
}
}
}
}
(2 проблемы здесь: pass
является Directive0
& headerValueByName
является Directive1
, а также headerValueByName
является Directive1
& ajax
является Directive0
, Так что не компилируется)
У меня вопрос: можно ли как-нибудь получить экстракт с локальной областью действия? Как в, header
не убегает ajax
,
Я знаю, что могу получить доступ к запросу, чтобы вытащить заголовок, не используя headerValue*
пожалуйста, не отвечайте с этим.
1 ответ
Чтение SecurityDirectives.authorizeAsync
дал мне ответ:
import akka.http.scaladsl.model.HttpHeader
import akka.http.scaladsl.server.Directive0
import akka.http.scaladsl.server.directives.BasicDirectives
import akka.http.scaladsl.server.directives.HeaderDirectives
import akka.http.scaladsl.server.directives.RouteDirectives
trait AjaxDirectives extends BasicDirectives with HeaderDirectives with RouteDirectives {
private val headerName = "X-Requested-With"
private val valid = "XMLHttpRequest"
def ajax(): Directive0 = {
headerValueByName(headerName).flatMap { header ⇒
if (header == valid) {
pass
} else {
reject
}
}
}
}