app/util/CORSable.scala (19 lines of code) (raw):
package util
import com.gu.pandahmac.HMACAuthActions
import play.api.mvc.{Action, AnyContent, BodyParser, ControllerComponents, 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 = action.executionContext
}