diff options
author | Jakob Odersky <jakob@driver.xyz> | 2017-10-20 12:06:44 -0700 |
---|---|---|
committer | Jakob Odersky <jakob@driver.xyz> | 2017-10-20 12:06:44 -0700 |
commit | fa6716e0a3223fa0b15966f6bdfe5464e26d8fc2 (patch) | |
tree | f044cd06b8a2c19998270410e5b4405f0ecda313 /src/main/scala/xyz/driver/core/app | |
parent | 2af63e7fb8b15568adaf2d9f0a6b395d6719fd71 (diff) | |
download | driver-core-fa6716e0a3223fa0b15966f6bdfe5464e26d8fc2.tar.gz driver-core-fa6716e0a3223fa0b15966f6bdfe5464e26d8fc2.tar.bz2 driver-core-fa6716e0a3223fa0b15966f6bdfe5464e26d8fc2.zip |
Move rejection handler to companion objectv1.4.1
This change makes it possible to reference the custom rejection
handler from outside of a DriverApp instance. It is intended to be
used in pdsui-common which wraps rejections in JSON responses.
Diffstat (limited to 'src/main/scala/xyz/driver/core/app')
-rw-r--r-- | src/main/scala/xyz/driver/core/app/DriverApp.scala | 61 |
1 files changed, 33 insertions, 28 deletions
diff --git a/src/main/scala/xyz/driver/core/app/DriverApp.scala b/src/main/scala/xyz/driver/core/app/DriverApp.scala index b73f426..901d6e2 100644 --- a/src/main/scala/xyz/driver/core/app/DriverApp.scala +++ b/src/main/scala/xyz/driver/core/app/DriverApp.scala @@ -48,6 +48,7 @@ class DriverApp(appName: String, scheme: String = "http", port: Int = 8080, tracer: Tracer = NoTracer)(implicit actorSystem: ActorSystem, executionContext: ExecutionContext) { + import DriverApp._ implicit private lazy val materializer: ActorMaterializer = ActorMaterializer()(actorSystem) private lazy val http: HttpExt = Http()(actorSystem) @@ -73,34 +74,6 @@ class DriverApp(appName: String, private def extractHeader(request: HttpRequest)(headerName: String): Option[String] = request.headers.find(_.name().toLowerCase === headerName).map(_.value()) - private def allowOrigin(originHeader: Option[Origin]) = - `Access-Control-Allow-Origin`( - originHeader.fold[HttpOriginRange](HttpOriginRange.*)(h => HttpOriginRange(h.origins: _*))) - - protected implicit def rejectionHandler: RejectionHandler = - RejectionHandler - .newBuilder() - .handleAll[MethodRejection] { rejections => - 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`(rest.AllowedHeaders: _*), - `Access-Control-Expose-Headers`(rest.AllowedHeaders: _*) - )) { - complete(s"Supported methods: $names.") - } - }(ctx) - } ~ - complete(MethodNotAllowed -> s"HTTP method not allowed, supported methods: $names!") - } - .result() - protected def bindHttp(modules: Seq[Module]): Unit = { val serviceTypes = modules.flatMap(_.routeTypes) val swaggerService = swaggerOverride(serviceTypes) @@ -359,3 +332,35 @@ class DriverApp(appName: String, }) } } + +object DriverApp { + + private def allowOrigin(originHeader: Option[Origin]) = + `Access-Control-Allow-Origin`( + originHeader.fold[HttpOriginRange](HttpOriginRange.*)(h => HttpOriginRange(h.origins: _*))) + + implicit def rejectionHandler: RejectionHandler = + RejectionHandler + .newBuilder() + .handleAll[MethodRejection] { rejections => + 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`(rest.AllowedHeaders: _*), + `Access-Control-Expose-Headers`(rest.AllowedHeaders: _*) + )) { + complete(s"Supported methods: $names.") + } + }(ctx) + } ~ + complete(MethodNotAllowed -> s"HTTP method not allowed, supported methods: $names!") + } + .result() + +} |