diff options
author | Zach Smith <zach@driver.xyz> | 2018-01-18 16:55:36 -0800 |
---|---|---|
committer | Zach Smith <zach@driver.xyz> | 2018-02-20 10:34:22 -0800 |
commit | e207352038e171e899695c895108fcca833ef70b (patch) | |
tree | ce6bb1d3c371bc1ed8337ae179cacc3078e6143d | |
parent | d534ce2309052329506b31b17ae137950757890f (diff) | |
download | driver-core-e207352038e171e899695c895108fcca833ef70b.tar.gz driver-core-e207352038e171e899695c895108fcca833ef70b.tar.bz2 driver-core-e207352038e171e899695c895108fcca833ef70b.zip |
Respond with correct cors headers for all rejections
-rw-r--r-- | src/main/scala/xyz/driver/core/app/DriverApp.scala | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/src/main/scala/xyz/driver/core/app/DriverApp.scala b/src/main/scala/xyz/driver/core/app/DriverApp.scala index df80c3d..bc9d634 100644 --- a/src/main/scala/xyz/driver/core/app/DriverApp.scala +++ b/src/main/scala/xyz/driver/core/app/DriverApp.scala @@ -223,6 +223,25 @@ class DriverApp( } object DriverApp { + def defaultCorsHeaders: Directive0 = { + optionalHeaderValueByType[Origin](()) flatMap { originHeader => + respondWithHeaders( + List[HttpHeader]( + allowOrigin(originHeader), + `Access-Control-Allow-Headers`(AllowedHeaders: _*), + `Access-Control-Expose-Headers`(AllowedHeaders: _*) + )) + } + } + + def corsAllowedMethodHeaders(methods: scala.collection.immutable.Seq[HttpMethod]): Directive0 = { + respondWithHeaders( + List[HttpHeader]( + Allow(methods), + `Access-Control-Allow-Methods`(methods) + )) + } + implicit def rejectionHandler: RejectionHandler = RejectionHandler .newBuilder() @@ -230,20 +249,19 @@ object DriverApp { val methods = rejections map (_.supported) lazy val names = methods map (_.name) mkString ", " - options { ctx => - optionalHeaderValueByType[Origin](()) { originHeader => - respondWithHeaders(List[HttpHeader]( - Allow(methods), - `Access-Control-Allow-Methods`(methods), - allowOrigin(originHeader), - `Access-Control-Allow-Headers`(AllowedHeaders: _*), - `Access-Control-Expose-Headers`(AllowedHeaders: _*) - )) { + options { + defaultCorsHeaders { + corsAllowedMethodHeaders(methods) { complete(s"Supported methods: $names.") } - }(ctx) + } } ~ complete(MethodNotAllowed -> s"HTTP method not allowed, supported methods: $names!") } + .handleAll[Rejection] { rejections => + defaultCorsHeaders { + RejectionHandler.default(rejections).getOrElse(reject) + } + } .result() } |