diff --git a/Sources/LeafErrorMiddleware/LeafErrorMiddleware.swift b/Sources/LeafErrorMiddleware/LeafErrorMiddleware.swift index 33c237e..aa1c75b 100644 --- a/Sources/LeafErrorMiddleware/LeafErrorMiddleware.swift +++ b/Sources/LeafErrorMiddleware/LeafErrorMiddleware.swift @@ -3,10 +3,18 @@ import Vapor /// Captures all errors and transforms them into an internal server error. public final class LeafErrorMiddleware: Middleware { + public enum ErrorType: Int { + case all + case notFound + case serverError + } + let contextGenerator: ((HTTPStatus, Error, Request) -> EventLoopFuture) + let errorType: ErrorType - public init(contextGenerator: @escaping ((HTTPStatus, Error, Request) -> EventLoopFuture)) { + public init(contextGenerator: @escaping ((HTTPStatus, Error, Request) -> EventLoopFuture), errorType: ErrorType = .all) { self.contextGenerator = contextGenerator + self.errorType = errorType } /// See `Middleware.respond` @@ -34,11 +42,13 @@ public final class LeafErrorMiddleware: Middleware { default: return self.handleError(for: request, status: .internalServerError, error: error) } + }.flatMapError { error in + return next.respond(to: request) } } private func handleError(for req: Request, status: HTTPStatus, error: Error) -> EventLoopFuture { - if status == .notFound { + if (self.errorType == .all || self.errorType == .notFound) && status == .notFound { return contextGenerator(status, error, req).flatMap { context in return req.view.render("404", context).encodeResponse(for: req).map { res in res.status = status @@ -47,8 +57,10 @@ public final class LeafErrorMiddleware: Middleware { }.flatMapError { newError in return self.renderServerErrorPage(for: status, request: req, error: newError) } + } else if self.errorType == .all || self.errorType == .serverError { + return renderServerErrorPage(for: status, request: req, error: error) } - return renderServerErrorPage(for: status, request: req, error: error) + return req.eventLoop.makeFailedFuture(error) } private func renderServerErrorPage(for status: HTTPStatus, request: Request, error: Error) -> EventLoopFuture { @@ -58,7 +70,7 @@ public final class LeafErrorMiddleware: Middleware { res.status = status return res } - }.flatMapError { error -> EventLoopFuture in + }.flatMapError { error -> EventLoopFuture in let body = "

Internal Error

There was an internal error. Please try again later.

" request.logger.error("Failed to render custom error page - \(error)") return body.encodeResponse(for: request).map { res in