app/util/CORSable.scala (16 lines of code) (raw):

package util import play.api.mvc.{Action, BodyParser, Request, Result} import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.{ExecutionContext, Future} case class CORSable[A](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("Access-Control-Allow-Origin" -> origin, "Access-Control-Allow-Credentials" -> "true") } else { Nil } } action(request).map(_.withHeaders(headers.getOrElse(Nil) :_*)) } lazy val parser: BodyParser[A] = action.parser override def executionContext: ExecutionContext = action.executionContext }