From e1ace181e97506130810eb1e1e19c720bf4d490c Mon Sep 17 00:00:00 2001 From: vlad Date: Thu, 2 Feb 2017 20:57:14 -0500 Subject: Made rest directives change less disruptive --- src/main/scala/xyz/driver/core/app.scala | 10 ++--- src/main/scala/xyz/driver/core/rest.scala | 63 +++++++++++++++---------------- 2 files changed, 35 insertions(+), 38 deletions(-) diff --git a/src/main/scala/xyz/driver/core/app.scala b/src/main/scala/xyz/driver/core/app.scala index 54d08d4..5482b3b 100644 --- a/src/main/scala/xyz/driver/core/app.scala +++ b/src/main/scala/xyz/driver/core/app.scala @@ -16,7 +16,7 @@ import org.slf4j.LoggerFactory import spray.json.DefaultJsonProtocol import xyz.driver.core import xyz.driver.core.logging.{Logger, TypesafeScalaLogger} -import xyz.driver.core.rest.ServiceRequestContext.ContextHeaders +import xyz.driver.core.rest.ContextHeaders import xyz.driver.core.rest.Swagger import xyz.driver.core.stats.SystemStats import xyz.driver.core.time.Time @@ -69,7 +69,7 @@ object app { val _ = Future { http.bindAndHandle(route2HandlerFlow(handleExceptions(ExceptionHandler(exceptionHandler)) { ctx => - val trackingId = rest.ServiceRequestContext.extractTrackingId(ctx) + val trackingId = rest.extractTrackingId(ctx) log.audit(s"Received request ${ctx.request} with tracking id $trackingId") val contextWithTrackingId = @@ -91,20 +91,20 @@ object app { case is: IllegalStateException => ctx => - val trackingId = rest.ServiceRequestContext.extractTrackingId(ctx) + val trackingId = rest.extractTrackingId(ctx) log.debug(s"Request is not allowed to ${ctx.request.uri} ($trackingId)", is) complete(HttpResponse(BadRequest, entity = is.getMessage))(ctx) case cm: ConcurrentModificationException => ctx => - val trackingId = rest.ServiceRequestContext.extractTrackingId(ctx) + val trackingId = rest.extractTrackingId(ctx) log.audit(s"Concurrent modification of the resource ${ctx.request.uri} ($trackingId)", cm) complete( HttpResponse(Conflict, entity = "Resource was changed concurrently, try requesting a newer version"))(ctx) case t: Throwable => ctx => - val trackingId = rest.ServiceRequestContext.extractTrackingId(ctx) + val trackingId = rest.extractTrackingId(ctx) log.error(s"Request to ${ctx.request.uri} could not be handled normally ($trackingId)", t) complete(HttpResponse(InternalServerError, entity = t.getMessage))(ctx) } diff --git a/src/main/scala/xyz/driver/core/rest.scala b/src/main/scala/xyz/driver/core/rest.scala index 0c81869..fd6763e 100644 --- a/src/main/scala/xyz/driver/core/rest.scala +++ b/src/main/scala/xyz/driver/core/rest.scala @@ -32,46 +32,43 @@ object rest { contextHeaders.get(AuthProvider.AuthenticationTokenHeader).map(AuthToken.apply) } - object ServiceRequestContext { + object ContextHeaders { + val AuthenticationTokenHeader = "WWW-Authenticate" + val TrackingIdHeader = "X-Trace" - object ContextHeaders { - val AuthenticationTokenHeader = "WWW-Authenticate" - val TrackingIdHeader = "X-Trace" - - object LinkerD { - // https://linkerd.io/doc/0.7.4/linkerd/protocol-http/ - def isLinkerD(headerName: String) = headerName.startsWith("l5d-") - } + object LinkerD { + // https://linkerd.io/doc/0.7.4/linkerd/protocol-http/ + def isLinkerD(headerName: String) = headerName.startsWith("l5d-") } + } - import akka.http.scaladsl.server._ - import Directives._ + import akka.http.scaladsl.server._ + import Directives._ - def serviceContext: Directive1[ServiceRequestContext] = extract(ctx => extractServiceContext(ctx)) + def serviceContext: Directive1[ServiceRequestContext] = extract(ctx => extractServiceContext(ctx)) - def extractServiceContext(ctx: RequestContext): ServiceRequestContext = - ServiceRequestContext(extractTrackingId(ctx), extractContextHeaders(ctx)) + def extractServiceContext(ctx: RequestContext): ServiceRequestContext = + ServiceRequestContext(extractTrackingId(ctx), extractContextHeaders(ctx)) - def extractTrackingId(ctx: RequestContext): String = { - ctx.request.headers - .find(_.name == ContextHeaders.TrackingIdHeader) - .fold(java.util.UUID.randomUUID.toString)(_.value()) - } + def extractTrackingId(ctx: RequestContext): String = { + ctx.request.headers + .find(_.name == ContextHeaders.TrackingIdHeader) + .fold(java.util.UUID.randomUUID.toString)(_.value()) + } - def extractContextHeaders(ctx: RequestContext): Map[String, String] = { - ctx.request.headers.filter { h => - h.name === ContextHeaders.AuthenticationTokenHeader || h.name === ContextHeaders.TrackingIdHeader - // || ContextHeaders.LinkerD.isLinkerD(h.lowercaseName) - } map { header => - header.name -> header.value - } toMap - } + def extractContextHeaders(ctx: RequestContext): Map[String, String] = { + ctx.request.headers.filter { h => + h.name === ContextHeaders.AuthenticationTokenHeader || h.name === ContextHeaders.TrackingIdHeader + // || ContextHeaders.LinkerD.isLinkerD(h.lowercaseName) + } map { header => + header.name -> header.value + } toMap } - object AuthProvider { - val AuthenticationTokenHeader = ServiceRequestContext.ContextHeaders.AuthenticationTokenHeader - val SetAuthenticationTokenHeader = "set-authorization" - } + object AuthProvider { + val AuthenticationTokenHeader = ContextHeaders.AuthenticationTokenHeader + val SetAuthenticationTokenHeader = "set-authorization" + } trait AuthProvider[U <: User] { @@ -92,7 +89,7 @@ object rest { protected def userHasPermission(user: U, permission: Permission): Future[Boolean] def authorize(permissions: Permission*): Directive1[U] = { - ServiceRequestContext.serviceContext flatMap { ctx => + serviceContext flatMap { ctx => onComplete(authenticatedUser(ctx).run flatMap { userOption => userOption.traverse[Future, (U, Boolean)] { user => @@ -143,7 +140,7 @@ object rest { val requestTime = time.currentTime() val request = requestStub - .withHeaders(RawHeader(ServiceRequestContext.ContextHeaders.TrackingIdHeader, context.trackingId)) + .withHeaders(RawHeader(ContextHeaders.TrackingIdHeader, context.trackingId)) .withHeaders(context.contextHeaders.toSeq.map { h => RawHeader(h._1, h._2): HttpHeader }: _*) log.audit(s"Sending to ${request.uri} request $request with tracking id ${context.trackingId}") -- cgit v1.2.3