aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jakob@driver.xyz>2017-10-20 12:06:44 -0700
committerJakob Odersky <jakob@driver.xyz>2017-10-20 12:06:44 -0700
commitfa6716e0a3223fa0b15966f6bdfe5464e26d8fc2 (patch)
treef044cd06b8a2c19998270410e5b4405f0ecda313
parent2af63e7fb8b15568adaf2d9f0a6b395d6719fd71 (diff)
downloaddriver-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.
-rw-r--r--src/main/scala/xyz/driver/core/app/DriverApp.scala61
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()
+
+}