Skip to content

Commit

Permalink
Handle query parameters in FileMiddleware redirects (#3077)
Browse files Browse the repository at this point in the history
bug: fix redirection with query parameters.

fix: redirect to entire path

refactor: updating redirection path without string manipulation.

Co-authored-by: kirkH <kirk@passivelogic.com>
Co-authored-by: Gwynne Raskind <gwynne@vapor.codes>
  • Loading branch information
3 people committed Oct 11, 2023
1 parent 61c8104 commit 288d73a
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 2 deletions.
6 changes: 4 additions & 2 deletions Sources/Vapor/Middleware/FileMiddleware.swift
Expand Up @@ -61,9 +61,11 @@ public final class FileMiddleware: Middleware {
if isDir.boolValue {
guard absPath.hasSuffix("/") else {
switch directoryAction.kind {
case .redirect:
case .redirect:
var redirectUrl = request.url
redirectUrl.path += "/"
return request.eventLoop.future(
request.redirect(to: request.url.path + "/", redirectType: .permanent)
request.redirect(to: redirectUrl.string, redirectType: .permanent)
)
case .none:
return next.respond(to: request)
Expand Down
25 changes: 25 additions & 0 deletions Tests/VaporTests/FileTests.swift
Expand Up @@ -373,6 +373,31 @@ final class FileTests: XCTestCase {
}
}

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

let path = #file.split(separator: "/").dropLast().joined(separator: "/")
app.middleware.use(
FileMiddleware(
publicDirectory: "/" + path,
defaultFile: "index.html",
directoryAction: .redirect
)
)

try app.test(.GET, "Utilities?vaporTest=test") { res in
XCTAssertEqual(res.status, .movedPermanently)
XCTAssertEqual(res.headers.first(name: .location), "/Utilities/?vaporTest=test")
}.test(.GET, "Utilities/SubUtilities?vaporTest=test") { res in
XCTAssertEqual(res.status, .movedPermanently)
XCTAssertEqual( res.headers.first(name: .location), "/Utilities/SubUtilities/?vaporTest=test")
}.test(.GET, "Utilities/SubUtilities?vaporTest=test#vapor") { res in
XCTAssertEqual(res.status, .movedPermanently)
XCTAssertEqual( res.headers.first(name: .location), "/Utilities/SubUtilities/?vaporTest=test#vapor")
}
}

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

0 comments on commit 288d73a

Please sign in to comment.