2014-04-24 4 views
0

Я пытаюсь создать ScalaInterceptor, который ищет заголовок X-Forwarded-Proto, поэтому в основном, если он в производстве или за прокси-сервером, тогда Play! автоматическая переадресация на SSL.Использование ScalaInterceptors для захвата HTTPS в игре! 2,2?

У меня возникли проблемы с получением этого кода для компиляции, и я также не уверен, будет ли это работать с плагином SecureSocial. Существуют определенные причины, по которым мы не устанавливаем SSL = true в SecureSocial.conf, что я не буду здесь заниматься.

Вот что у меня в Global.scala

def WithHttpsRedirect[A](action: Action[A]): Action[A] = { 
    Action(action.parser) { request => 
     val result = action(request) 
     request.headers.get("X-Forwarded-Proto").collect { 
     case "https" => 
      result 

     case "http" => 
      val url = "https://"+request.host+request.uri 
      Redirect(url) 

     } getOrElse { 
     result 
     } 
    } 
    } 

    override def onRouteRequest(request: RequestHeader): Option[Handler] = { 
    super.onRouteRequest(request).map { handler => 
     handler match { 
     case a: Action[_] => WithHttpsRedirect(a) 
     case _ => handler 
     } 
    } 
    } 

Я получаю ошибку компилятора после getOrElse:

[error] found : scala.concurrent.Future[play.api.mvc.SimpleResult] 
[error] required: play.api.mvc.Result 
[error]   result 
[error]  ^

Ваша помощь очень ценится!

ответ

0

Изменено мой метод атаки, и вместо того, чтобы реализовать фильтр вместо переопределения onRouteRequest:

В Global.scala:

object Global extends WithFilters(HttpsFilter) with GlobalSettings

затем HttpsFilter.scala:

import play.api.mvc.Results._ 
import play.api.mvc.{SimpleResult, RequestHeader, Filter} 
import scala.concurrent._ 
import ExecutionContext.Implicits.global 

object HttpsFilter extends Filter { 

    def apply(next: (RequestHeader) => Future[SimpleResult])(request: RequestHeader): Future[SimpleResult] = { 
    request.headers.get("X-Forwarded-Proto").collect { 
     case "https" => 
     next(request) 

     case "http" => 
     val url = "https://"+request.host+request.uri 
     Future{ Redirect(url) } 

    } getOrElse { 
     next(request) 
    } 
    } 

} 
0

Заменить:

Action(action.parser) { request => 

с:

Action.async(action.parser) { request => 

Вы MADE необходимо также заменить:

Redirect(url) 

с:

Future.successful(Redirect(url)) 
+0

Я на самом деле просто создал расширенный фильтр, я отправлю его :) – crockpotveggies