diff --git a/.gitignore b/.gitignore index 2c22487..58e96ea 100644 --- a/.gitignore +++ b/.gitignore @@ -34,8 +34,10 @@ playground.xcworkspace # Swift Package Manager # # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. -# Packages/ +Packages/ .build/ +*.xcodeproj +Package.pins # CocoaPods # diff --git a/Package.swift b/Package.swift new file mode 100644 index 0000000..01edb8e --- /dev/null +++ b/Package.swift @@ -0,0 +1,12 @@ +// swift-tools-version:3.1 + +import PackageDescription + +let package = Package( + name: "DGPerfectMiddleware", + dependencies: [ + .Package(url: "https://github.com/PerfectlySoft/Perfect-HTTP.git", + majorVersion: 2, + minor: 1) + ] +) diff --git a/Sources/MiddlewareHandler.swift b/Sources/MiddlewareHandler.swift new file mode 100644 index 0000000..7cb0597 --- /dev/null +++ b/Sources/MiddlewareHandler.swift @@ -0,0 +1,49 @@ +import PerfectHTTP + +public typealias Middleware = (MiddlewareContext) -> () + +public class MiddlewareContext { + + public let request: HTTPRequest + public let response: HTTPResponse + public let middlewares: [Middleware] + + public fileprivate(set) var shared: [String: Any] + + public fileprivate(set) var current: Int + + public init(request: HTTPRequest, response: HTTPResponse, middlewares: [Middleware]) { + self.request = request + self.response = response + self.shared = [String: Any]() + self.middlewares = middlewares + self.current = 0 + } + + public func next(err: Error? = nil) { + guard err == nil else { + return + } + if self.current < self.middlewares.count { + let cur = self.current + self.current = cur + 1 + self.middlewares[cur](self) + } + } + + deinit { + print("deinit") + } +} + +open class MiddlewareHandler { + + private init() {} + + public static func all(_ middlewares: [Middleware]) -> RequestHandler { + return { request, response in + MiddlewareContext(request: request, response: response, middlewares: middlewares).next() + } + } +} + diff --git a/Tests/DGPerfectMiddlewareTests/DGPerfectMiddlewareTests.swift b/Tests/DGPerfectMiddlewareTests/DGPerfectMiddlewareTests.swift new file mode 100644 index 0000000..150505c --- /dev/null +++ b/Tests/DGPerfectMiddlewareTests/DGPerfectMiddlewareTests.swift @@ -0,0 +1,15 @@ +import XCTest +@testable import DGPerfectMiddleware + +class DGPerfectMiddlewareTests: XCTestCase { + func testExample() { + + + + } + + + static var allTests = [ + ("testExample", testExample), + ] +} diff --git a/Tests/LinuxMain.swift b/Tests/LinuxMain.swift new file mode 100644 index 0000000..99c95b2 --- /dev/null +++ b/Tests/LinuxMain.swift @@ -0,0 +1,6 @@ +import XCTest +@testable import DGPerfectMiddlewareTests + +XCTMain([ + testCase(DGPerfectMiddlewareTests.allTests), +])