Skip to content

Commit

Permalink
allow prepending middleware (#2647)
Browse files Browse the repository at this point in the history
  • Loading branch information
jaredh159 committed Jul 12, 2021
1 parent f94f0bf commit f6a422c
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 12 deletions.
13 changes: 12 additions & 1 deletion Sources/Vapor/Middleware/MiddlewareConfiguration.swift
Expand Up @@ -4,6 +4,12 @@ public struct Middlewares {
/// The configured middleware.
private var storage: [Middleware]


public enum Position {
case beginning
case end
}

/// Create a new, empty `MiddlewareConfig`.
public init() {
self.storage = []
Expand All @@ -18,8 +24,13 @@ public struct Middlewares {
/// - warning: Ensure the `Middleware` is thread-safe when using this method.
/// Otherwise, use the type-based method and register the `Middleware`
/// using factory method to `Services`.
public mutating func use(_ middleware: Middleware) {
public mutating func use(_ middleware: Middleware, at position: Position = .end) {
switch position {
case .end:
self.storage.append(middleware)
case .beginning:
self.storage.insert(middleware, at: 0)
}
}

/// Resolves the configured middleware for a given container
Expand Down
44 changes: 33 additions & 11 deletions Tests/VaporTests/MiddlewareTests.swift
@@ -1,22 +1,23 @@
import XCTVapor

final class MiddlewareTests: XCTestCase {
func testMiddlewareOrder() throws {
final class OrderMiddleware: Middleware {
static var order: [String] = []
let pos: String
init(_ pos: String) {
self.pos = pos
}
func respond(to req: Request, chainingTo next: Responder) -> EventLoopFuture<Response> {
OrderMiddleware.order.append(pos)
return next.respond(to: req)
}
final class OrderMiddleware: Middleware {
static var order: [String] = []
let pos: String
init(_ pos: String) {
self.pos = pos
}
func respond(to req: Request, chainingTo next: Responder) -> EventLoopFuture<Response> {
OrderMiddleware.order.append(pos)
return next.respond(to: req)
}
}

func testMiddlewareOrder() throws {
let app = Application(.testing)
defer { app.shutdown() }

OrderMiddleware.order = []
app.grouped(
OrderMiddleware("a"), OrderMiddleware("b"), OrderMiddleware("c")
).get("order") { req -> String in
Expand All @@ -30,6 +31,27 @@ final class MiddlewareTests: XCTestCase {
}
}

func testPrependingMiddleware() throws {
let app = Application(.testing)
defer { app.shutdown() }

OrderMiddleware.order = []
app.middleware.use(OrderMiddleware("b"));
app.middleware.use(OrderMiddleware("c"));
app.middleware.use(OrderMiddleware("a"), at: .beginning);
app.middleware.use(OrderMiddleware("d"), at: .end);

app.get("order") { req -> String in
return "done"
}

try app.testable().test(.GET, "/order") { res in
XCTAssertEqual(res.status, .ok)
XCTAssertEqual(OrderMiddleware.order, ["a", "b", "c", "d"])
XCTAssertEqual(res.body.string, "done")
}
}

func testCORSMiddlewareVariedByRequestOrigin() throws {
let app = Application(.testing)
defer { app.shutdown() }
Expand Down

0 comments on commit f6a422c

Please sign in to comment.