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
      }
    }
  }
}
Другие вопросы по тегам