diff options
author | vlad <vlad@driver.xyz> | 2017-08-22 18:21:29 -0700 |
---|---|---|
committer | vlad <vlad@driver.xyz> | 2017-08-22 18:21:29 -0700 |
commit | a8685a0df2705e320cf5f0ba780878bb972e59bb (patch) | |
tree | 93880a6d1f99449eb20a8e8f0ba9c3197a774415 /src | |
parent | 311209b81f6224d55c3de28c5ed043168f9a31b8 (diff) | |
download | driver-core-a8685a0df2705e320cf5f0ba780878bb972e59bb.tar.gz driver-core-a8685a0df2705e320cf5f0ba780878bb972e59bb.tar.bz2 driver-core-a8685a0df2705e320cf5f0ba780878bb972e59bb.zip |
CORS for failed responsesv0.16.5
Diffstat (limited to 'src')
-rw-r--r-- | src/main/scala/xyz/driver/core/app.scala | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/src/main/scala/xyz/driver/core/app.scala b/src/main/scala/xyz/driver/core/app.scala index a64093a..b5ac4d0 100644 --- a/src/main/scala/xyz/driver/core/app.scala +++ b/src/main/scala/xyz/driver/core/app.scala @@ -230,28 +230,45 @@ object app { case is: IllegalStateException => ctx => - MDC.put("trackingId", rest.extractTrackingId(ctx.request)) log.warn(s"Request is not allowed to ${ctx.request.method} ${ctx.request.uri}", is) - complete(HttpResponse(BadRequest, entity = is.getMessage))(ctx) + errorResponse(ctx, BadRequest, message = is.getMessage, is)(ctx) case cm: ConcurrentModificationException => ctx => - MDC.put("trackingId", rest.extractTrackingId(ctx.request)) log.warn(s"Concurrent modification of the resource ${ctx.request.method} ${ctx.request.uri}", cm) - complete( - HttpResponse(Conflict, entity = "Resource was changed concurrently, try requesting a newer version"))(ctx) + errorResponse(ctx, Conflict, "Resource was changed concurrently, try requesting a newer version", cm)(ctx) - case sex: SQLException => + case se: SQLException => ctx => - MDC.put("trackingId", rest.extractTrackingId(ctx.request)) - log.warn(s"Database exception for the resource ${ctx.request.method} ${ctx.request.uri}", sex) - complete(HttpResponse(InternalServerError, entity = "Data access error"))(ctx) + log.warn(s"Database exception for the resource ${ctx.request.method} ${ctx.request.uri}", se) + errorResponse(ctx, InternalServerError, "Data access error", se)(ctx) case t: Throwable => ctx => - MDC.put("trackingId", rest.extractTrackingId(ctx.request)) log.warn(s"Request to ${ctx.request.method} ${ctx.request.uri} could not be handled normally", t) - complete(HttpResponse(InternalServerError, entity = t.getMessage))(ctx) + errorResponse(ctx, InternalServerError, t.getMessage, t)(ctx) + } + + protected def errorResponse[T <: Throwable](ctx: RequestContext, + statusCode: StatusCode, + message: String, + exception: T): Route = { + + val trackingId = rest.extractTrackingId(ctx.request) + val tracingHeader = RawHeader(ContextHeaders.TrackingIdHeader, rest.extractTrackingId(ctx.request)) + + MDC.put("trackingId", trackingId) + + optionalHeaderValueByType[Origin](()) { originHeader => + val responseHeaders = List[HttpHeader](tracingHeader, + allowOrigin(originHeader), + `Access-Control-Allow-Headers`(allowedHeaders: _*), + `Access-Control-Expose-Headers`(allowedHeaders: _*)) + + respondWithHeaders(responseHeaders) { + complete(HttpResponse(statusCode, entity = message)) + } + } } protected def versionRoute(version: String, gitHash: String, startupTime: Time): Route = { |