diff --git a/Sources/Vapor/Responder/DefaultResponder.swift b/Sources/Vapor/Responder/DefaultResponder.swift index 349a3567ad..d16aaaac90 100644 --- a/Sources/Vapor/Responder/DefaultResponder.swift +++ b/Sources/Vapor/Responder/DefaultResponder.swift @@ -12,7 +12,10 @@ internal struct DefaultResponder: Responder { /// Creates a new `ApplicationResponder` public init(routes: Routes, middleware: [Middleware] = []) { - let router = TrieRouter(CachedRoute.self) + let options = routes.caseInsenstive ? + Set(arrayLiteral: TrieRouter.ConfigurationOption.caseInsensitive) : [] + let router = TrieRouter(CachedRoute.self, options: options) + for route in routes.all { // Make a copy of the route to cache middleware chaining. let cached = CachedRoute( diff --git a/Sources/Vapor/Routing/Routes.swift b/Sources/Vapor/Routing/Routes.swift index 63bd978009..5f5b58e518 100644 --- a/Sources/Vapor/Routing/Routes.swift +++ b/Sources/Vapor/Routing/Routes.swift @@ -3,6 +3,9 @@ public final class Routes: RoutesBuilder, CustomStringConvertible { /// Default value used by `HTTPBodyStreamStrategy.collect` when `maxSize` is `nil`. public var defaultMaxBodySize: ByteCount + /// Default routing behavior of `DefaultResponder` is case-sensitive; configure to `true` prior to + /// Application start handle `Constant` `PathComponents` in a case-insensitive manner. + public var caseInsenstive: Bool public var description: String { return self.all.description @@ -11,6 +14,7 @@ public final class Routes: RoutesBuilder, CustomStringConvertible { public init() { self.all = [] self.defaultMaxBodySize = "16kb" + self.caseInsenstive = false } public func add(_ route: Route) { diff --git a/Tests/VaporTests/RouteTests.swift b/Tests/VaporTests/RouteTests.swift index d83de880f1..2b8c67a8f0 100644 --- a/Tests/VaporTests/RouteTests.swift +++ b/Tests/VaporTests/RouteTests.swift @@ -56,6 +56,25 @@ final class RouteTests: XCTestCase { XCTAssertEqual(res.body.string, "foo") } } + + func testInsensitiveRoutes() throws { + let app = Application(.testing) + defer { app.shutdown() } + + app.routes.caseInsenstive = true + + app.routes.get("foo") { req -> String in + return "foo" + } + + try app.testable().test(.GET, "/foo") { res in + XCTAssertEqual(res.status, .ok) + XCTAssertEqual(res.body.string, "foo") + }.test(.GET, "/FOO") { res in + XCTAssertEqual(res.status, .ok) + XCTAssertEqual(res.body.string, "foo") + } + } func testAnyResponse() throws { let app = Application(.testing)