app/helpers/CORSable.scala (22 lines of code) (raw):
package helpers
import play.api.mvc._
import scala.concurrent.{ExecutionContext, Future}
import scala.concurrent.ExecutionContext.Implicits.global
/* Must allow cross origin requests for the templating service */
case class CORSable[A](execContext: ExecutionContext, origins: String*)(action: Action[A]) extends Action[A] {
def apply(request: Request[A]): Future[Result] = {
val headers = request.headers.get("Origin").map { origin =>
if(origins.contains(origin)) {
List(CORSable.CORS_ALLOW_ORIGIN -> origin, CORSable.CORS_CREDENTIALS -> "true")
} else { Nil }
}
action(request).map(_.withHeaders(headers.getOrElse(Nil) :_*))
}
lazy val parser = action.parser
def executionContext: ExecutionContext = execContext
}
object CORSable {
val CORS_ALLOW_ORIGIN = "Access-Control-Allow-Origin"
val CORS_CREDENTIALS = "Access-Control-Allow-Credentials"
val CORS_ALLOW_METHODS = "Access-Control-Allow-Methods"
val CORS_ALLOW_HEADERS = "Access-Control-Allow-Headers"
}