Преглед на файлове

added custom headers into .ok response

Yuri Goncharov преди 4 години
родител
ревизия
8ee4eb8b0e

+ 5 - 5
Xcode/Sources/DemoServer.swift

@@ -30,7 +30,7 @@ public func demoServer(_ publicDir: String) -> HttpServer {
         }
     }
 
-    server["/magic"] = { .ok(.htmlBody("You asked for " + $0.path)) }
+    server["/magic"] = { .ok(.htmlBody("You asked for " + $0.path), ["XXX-Custom-Header": "value"]) }
 
     server["/test/:param1/:param2"] = { request in
         scopes {
@@ -98,7 +98,7 @@ public func demoServer(_ publicDir: String) -> HttpServer {
             guard let name = multipart.name, let fileName = multipart.fileName else { continue }
             response += "Name: \(name) File name: \(fileName) Size: \(multipart.body.count)<br>"
         }
-        return HttpResponse.ok(.htmlBody(response))
+        return HttpResponse.ok(.htmlBody(response), ["XXX-Custom-Header": "value"])
     }
 
     server.GET["/login"] = scopes {
@@ -136,7 +136,7 @@ public func demoServer(_ publicDir: String) -> HttpServer {
 
     server.POST["/login"] = { request in
         let formFields = request.parseUrlencodedForm()
-        return HttpResponse.ok(.htmlBody(formFields.map({ "\($0.0) = \($0.1)" }).joined(separator: "<br>")))
+        return HttpResponse.ok(.htmlBody(formFields.map({ "\($0.0) = \($0.1)" }).joined(separator: "<br>")), ["XXX-Custom-Header": "value"])
     }
 
     server["/demo"] = scopes {
@@ -165,11 +165,11 @@ public func demoServer(_ publicDir: String) -> HttpServer {
     server["/long"] = { _ in
         var longResponse = ""
         for index in 0..<1000 { longResponse += "(\(index)),->" }
-        return .ok(.htmlBody(longResponse))
+        return .ok(.htmlBody(longResponse), ["XXX-Custom-Header": "value"])
     }
 
     server["/wildcard/*/test/*/:param"] = { request in
-        return .ok(.htmlBody(request.path))
+        return .ok(.htmlBody(request.path), ["XXX-Custom-Header": "value"])
     }
 
     server["/stream"] = { _ in

+ 6 - 3
Xcode/Sources/HttpResponse.swift

@@ -80,7 +80,7 @@ public enum HttpResponseBody {
 public enum HttpResponse {
 
     case switchProtocols([String: String], (Socket) -> Void)
-    case ok(HttpResponseBody), created, accepted
+    case ok(HttpResponseBody, [String: String]), created, accepted
     case movedPermanently(String)
     case movedTemporarily(String)
     case badRequest(HttpResponseBody?), unauthorized, forbidden, notFound, notAcceptable
@@ -133,7 +133,10 @@ public enum HttpResponse {
             for (key, value) in switchHeaders {
                 headers[key] = value
             }
-        case .ok(let body):
+        case .ok(let body, let customHeaders):
+            for (key, value) in customHeaders {
+                headers.updateValue(value, forKey: key)
+            }
             switch body {
             case .json: headers["Content-Type"] = "application/json"
             case .html, .htmlBody: headers["Content-Type"] = "text/html"
@@ -158,7 +161,7 @@ public enum HttpResponse {
 
     func content() -> (length: Int, write: ((HttpResponseBodyWriter) throws -> Void)?) {
         switch self {
-        case .ok(let body)             : return body.content()
+        case .ok(let body, _)             : return body.content()
         case .badRequest(let body)     : return body?.content() ?? (-1, nil)
         case .raw(_, _, _, let writer) : return (-1, writer)
         default                        : return (-1, nil)

+ 1 - 1
Xcode/Tests/PingServer.swift

@@ -17,7 +17,7 @@ extension HttpServer {
     class func pingServer() -> HttpServer {
         let server = HttpServer()
         server.GET["/ping"] = { request in
-            return HttpResponse.ok(.text("pong!"))
+            return HttpResponse.ok(.text("pong!"), [:])
         }
         return server
     }

+ 2 - 2
Xcode/Tests/ServerThreadingTests.swift

@@ -35,7 +35,7 @@ class ServerThreadingTests: XCTestCase {
         let queue = DispatchQueue(label: "com.swifter.threading")
         let hostURL: URL
 
-        server.GET[path] = { .ok(.htmlBody("You asked for " + $0.path)) }
+        server.GET[path] = { .ok(.htmlBody("You asked for " + $0.path), [:]) }
 
         do {
 
@@ -73,7 +73,7 @@ class ServerThreadingTests: XCTestCase {
     func testShouldHandleTheSameRequestConcurrently() {
 
         let path = "/a/:b/c"
-        server.GET[path] = { .ok(.htmlBody("You asked for " + $0.path)) }
+        server.GET[path] = { .ok(.htmlBody("You asked for " + $0.path), [:]) }
 
         var requestExpectation: XCTestExpectation? = expectation(description: "Should handle the request concurrently")
 

+ 9 - 9
Xcode/Tests/SwifterTestsHttpRouter.swift

@@ -26,7 +26,7 @@ class SwifterTestsHttpRouter: XCTestCase {
     func testHttpRouterSlashRoot() {
 
         router.register(nil, path: "/", handler: { _ in
-            return .ok(.htmlBody("OK"))
+            return .ok(.htmlBody("OK"), [:])
         })
 
         XCTAssertNotNil(router.route(nil, path: "/"))
@@ -35,7 +35,7 @@ class SwifterTestsHttpRouter: XCTestCase {
     func testHttpRouterSimplePathSegments() {
 
         router.register(nil, path: "/a/b/c/d", handler: { _ in
-            return .ok(.htmlBody("OK"))
+            return .ok(.htmlBody("OK"), [:])
         })
 
         XCTAssertNil(router.route(nil, path: "/"))
@@ -48,7 +48,7 @@ class SwifterTestsHttpRouter: XCTestCase {
     func testHttpRouterSinglePathSegmentWildcard() {
 
         router.register(nil, path: "/a/*/c/d", handler: { _ in
-            return .ok(.htmlBody("OK"))
+            return .ok(.htmlBody("OK"), [:])
         })
 
         XCTAssertNil(router.route(nil, path: "/"))
@@ -62,7 +62,7 @@ class SwifterTestsHttpRouter: XCTestCase {
     func testHttpRouterVariables() {
 
         router.register(nil, path: "/a/:arg1/:arg2/b/c/d/:arg3", handler: { _ in
-            return .ok(.htmlBody("OK"))
+            return .ok(.htmlBody("OK"), [:])
         })
 
         XCTAssertNil(router.route(nil, path: "/"))
@@ -76,7 +76,7 @@ class SwifterTestsHttpRouter: XCTestCase {
     func testHttpRouterMultiplePathSegmentWildcards() {
 
         router.register(nil, path: "/a/**/e/f/g", handler: { _ in
-            return .ok(.htmlBody("OK"))
+            return .ok(.htmlBody("OK"), [:])
         })
 
         XCTAssertNil(router.route(nil, path: "/"))
@@ -88,7 +88,7 @@ class SwifterTestsHttpRouter: XCTestCase {
     func testHttpRouterMultiplePathSegmentWildcardTail() {
 
         router.register(nil, path: "/a/b/**", handler: { _ in
-            return .ok(.htmlBody("OK"))
+            return .ok(.htmlBody("OK"), [:])
         })
 
         XCTAssertNil(router.route(nil, path: "/"))
@@ -100,11 +100,11 @@ class SwifterTestsHttpRouter: XCTestCase {
     func testHttpRouterEmptyTail() {
 
         router.register(nil, path: "/a/b/", handler: { _ in
-            return .ok(.htmlBody("OK"))
+            return .ok(.htmlBody("OK"), [:])
         })
 
         router.register(nil, path: "/a/b/:var", handler: { _ in
-            return .ok(.htmlBody("OK"))
+            return .ok(.htmlBody("OK"), [:])
         })
 
         XCTAssertNil(router.route(nil, path: "/"))
@@ -120,7 +120,7 @@ class SwifterTestsHttpRouter: XCTestCase {
     func testHttpRouterPercentEncodedPathSegments() {
 
         router.register(nil, path: "/a/<>/^", handler: { _ in
-            return .ok(.htmlBody("OK"))
+            return .ok(.htmlBody("OK"), [:])
         })
 
         XCTAssertNil(router.route(nil, path: "/"))