From 8057b72ba245c57a4fde7b9798c02721e8769de3 Mon Sep 17 00:00:00 2001 From: Vladimir Inozemtsev Date: Mon, 15 Jun 2020 01:23:46 +0500 Subject: [PATCH] attemp to fix linked issue to similar path --- Ambassador/Router.swift | 8 ++++- AmbassadorTests/RouterTests.swift | 51 +++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/Ambassador/Router.swift b/Ambassador/Router.swift index ef07181..c101984 100644 --- a/Ambassador/Router.swift +++ b/Ambassador/Router.swift @@ -57,7 +57,13 @@ open class Router: WebApp { } private func matchRoute(to searchPath: String) -> (WebApp, [String])? { - for (path, route) in routes { + if let handler = routes[searchPath] { + return (handler, [searchPath]) + } + let sortedRoutes = routes.sorted { (a, b) -> Bool in + a.key.count > b.key.count + } + for (path, route) in sortedRoutes { let regex = try! NSRegularExpression(pattern: path, options: []) let matches = regex.matches( in: searchPath, diff --git a/AmbassadorTests/RouterTests.swift b/AmbassadorTests/RouterTests.swift index da0547c..30aacc8 100644 --- a/AmbassadorTests/RouterTests.swift +++ b/AmbassadorTests/RouterTests.swift @@ -58,6 +58,57 @@ class RouterTests: XCTestCase { XCTAssertEqual(receivedData.last?.count, 0) } + func test2Paths() { + let router = Router() + router["/path/to/1"] = DataResponse() { environ -> Data in + return Data("first".utf8) + } + + router["/path/to"] = DataResponse() { environ -> Data in + return Data("second".utf8) + } + + var receivedStatus: [String] = [] + let startResponse = { (status: String, headers: [(String, String)]) in + receivedStatus.append(status) + } + + var receivedData: [Data] = [] + let sendBody = { (data: Data) in + receivedData.append(data) + } + let environ: [String: Any] = [ + "REQUEST_METHOD": "GET", + "SCRIPT_NAME": "", + "PATH_INFO": "/", + ] + router.app( + environ, + startResponse: startResponse, + sendBody: sendBody + ) + XCTAssertEqual(receivedStatus.count, 1) + XCTAssertEqual(receivedStatus.last, "404 Not found") + XCTAssertEqual(receivedData.count, 1) + XCTAssertEqual(receivedData.last?.count, 0) + + let environ2: [String: Any] = [ + "REQUEST_METHOD": "GET", + "SCRIPT_NAME": "", + "PATH_INFO": "/path/to/1", + ] + router.app( + environ2, + startResponse: startResponse, + sendBody: sendBody + ) + XCTAssertEqual(receivedStatus.count, 2) + XCTAssertEqual(receivedStatus.last, "200 OK") + XCTAssertEqual(receivedData.count, 3) + XCTAssertEqual(String(bytes: receivedData[1], encoding: String.Encoding.utf8), "first") + XCTAssertEqual(receivedData.last?.count, 0) + } + func testRegularExpressionRouting() { let router = Router() var receivedCaptures: [String]?