diff --git a/akka-http-tests/src/test/java/akka/http/javadsl/server/directives/AuthenticationDirectivesTest.java b/akka-http-tests/src/test/java/akka/http/javadsl/server/directives/AuthenticationDirectivesTest.java index 24471c1ec0..4875ae435e 100644 --- a/akka-http-tests/src/test/java/akka/http/javadsl/server/directives/AuthenticationDirectivesTest.java +++ b/akka-http-tests/src/test/java/akka/http/javadsl/server/directives/AuthenticationDirectivesTest.java @@ -7,6 +7,8 @@ package akka.http.javadsl.server.directives; import org.junit.Test; import scala.Option; import scala.concurrent.Future; + +import akka.http.javadsl.server.*; import akka.http.javadsl.model.HttpRequest; import akka.http.javadsl.model.headers.Authorization; import akka.http.javadsl.testkit.*; diff --git a/akka-http/src/main/scala/akka/http/impl/server/RouteImplementation.scala b/akka-http/src/main/scala/akka/http/impl/server/RouteImplementation.scala index 7a70e44555..9639a0de33 100644 --- a/akka-http/src/main/scala/akka/http/impl/server/RouteImplementation.scala +++ b/akka-http/src/main/scala/akka/http/impl/server/RouteImplementation.scala @@ -119,6 +119,12 @@ private[http] object RouteImplementation extends Directives with server.RouteCon case Conditional(eTag, lastModified, children) ⇒ conditional(eTag.asScala, lastModified.asScala).apply(apply(RouteAlternatives(children))) + case HandleExceptions(handler, children) ⇒ + val pf: akka.http.scaladsl.server.ExceptionHandler = akka.http.scaladsl.server.ExceptionHandler { + case e: RuntimeException ⇒ apply(handler.handle(e)) + } + handleExceptions(pf).apply(apply(RouteAlternatives(children))) + case o: OpaqueRoute ⇒ (ctx ⇒ o.handle(new RequestContextImpl(ctx)).asInstanceOf[RouteResultImpl].underlying) diff --git a/akka-http/src/main/scala/akka/http/impl/server/RouteStructure.scala b/akka-http/src/main/scala/akka/http/impl/server/RouteStructure.scala index b1a1902b68..87bdf49be6 100644 --- a/akka-http/src/main/scala/akka/http/impl/server/RouteStructure.scala +++ b/akka-http/src/main/scala/akka/http/impl/server/RouteStructure.scala @@ -40,6 +40,8 @@ private[http] object RouteStructure { case class Conditional(entityTag: EntityTag, lastModified: DateTime, children: immutable.Seq[Route]) extends DirectiveRoute + case class HandleExceptions(handler: ExceptionHandler, children: immutable.Seq[Route]) extends DirectiveRoute + abstract class OpaqueRoute(extractions: RequestVal[_]*) extends Route { def handle(ctx: RequestContext): RouteResult } diff --git a/akka-http/src/main/scala/akka/http/javadsl/server/directives/BasicDirectives.scala b/akka-http/src/main/scala/akka/http/javadsl/server/directives/BasicDirectives.scala index 187066ab78..1184a27a00 100644 --- a/akka-http/src/main/scala/akka/http/javadsl/server/directives/BasicDirectives.scala +++ b/akka-http/src/main/scala/akka/http/javadsl/server/directives/BasicDirectives.scala @@ -4,8 +4,10 @@ package akka.http.javadsl.server.directives -import java.lang.reflect.Method import scala.annotation.varargs +import java.lang.reflect.Method + +import akka.http.javadsl.model.{ StatusCode, HttpResponse } import akka.http.javadsl.server._ import akka.http.impl.server.RouteStructure._ import akka.http.impl.server._ @@ -26,6 +28,22 @@ abstract class BasicDirectives { def handle(ctx: RequestContext): RouteResult = ctx.complete(text) } + /** + * A route that completes the request with a static text + */ + def complete(response: HttpResponse): Route = + new OpaqueRoute() { + def handle(ctx: RequestContext): RouteResult = ctx.complete(response) + } + + /** + * A route that completes the request with a status code. + */ + def completeWithStatus(code: StatusCode): Route = + new OpaqueRoute() { + def handle(ctx: RequestContext): RouteResult = ctx.completeWithStatus(code) + } + /** * A route that completes the request using the given marshaller and value. */ diff --git a/akka-http/src/main/scala/akka/http/javadsl/server/directives/FileAndResourceDirectives.scala b/akka-http/src/main/scala/akka/http/javadsl/server/directives/FileAndResourceDirectives.scala index a2d28e7dc7..1dd35c99b7 100644 --- a/akka-http/src/main/scala/akka/http/javadsl/server/directives/FileAndResourceDirectives.scala +++ b/akka-http/src/main/scala/akka/http/javadsl/server/directives/FileAndResourceDirectives.scala @@ -72,7 +72,7 @@ object FileAndResourceRoute { } } -abstract class FileAndResourceDirectives extends CodingDirectives { +abstract class FileAndResourceDirectives extends ExecutionDirectives { /** * Completes GET requests with the content of the given resource loaded from the default ClassLoader. * If the resource cannot be found or read the Route rejects the request.