2016-08-03 6 views
1

Ich versuche eine Direktive zu schreiben, die Nicht-Ajax-Anfragen ablehnt. Der folgende Code funktioniert nicht offensichtlich:akka-http: Wie kann ich einen extrahierten Wert konsumieren/verbergen?

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 Probleme hier: pass ist Directive0 & headerValueByName ist Directive1 und headerValueByName ist Directive1 & ajaxDirective0 ist also es nicht kompiliert.)

Meine Frage ist: kann ich irgendwie einen lokal begrenzten Extrakt haben? Wie in header nicht entkommen ajax.


Ich weiß, dass ich den Antrag zugreifen kann den Header herausziehen, ohne headerValue* zu verwenden, so wenden Sie sich bitte mit, dass nicht beantworten.

Antwort

1

SecurityDirectives.authorizeAsync Lesen gab mir die Antwort:

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 
     } 
    } 
    } 
} 
Verwandte Themen