2016-08-03 1 views
1

J'essaye d'écrire une directive qui rejette des demandes non-ajax. Le code ci-dessous ne fonctionne évidemment pas:akka-http: Comment puis-je consommer/masquer une valeur extraite?

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 problèmes ici: pass est Directive0 & headerValueByName est Directive1 et headerValueByName est Directive1 & ajax est Directive0 Il ne compile pas.)

Ma question est: puis-je avoir un extrait local? Comme dans, header n'échappe pas ajax.


Je sais que je peux accéder à la demande de tirer la tête hors, sans utiliser headerValue*, alors s'il vous plaît ne pas répondre à cela.

Répondre

1

lecture SecurityDirectives.authorizeAsync m'a donné la réponse:

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