Skip to content

Commit

Permalink
Merge pull request #8 from vapor/options
Browse files Browse the repository at this point in the history
update options support
  • Loading branch information
loganwright authored Mar 7, 2017
2 parents cf6b6a4 + efe56ac commit 364dea0
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 5 deletions.
6 changes: 6 additions & 0 deletions Sources/Branches/Branch+Paths.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@ extension Branch {
}
}

extension Branch {
public var allSubBranches: [Branch] {
return subBranches.allBranches
}
}

extension Branch {
// The individual route leading to the calling branch
internal var route: String {
Expand Down
1 change: 1 addition & 0 deletions Sources/Routing/RouteBuilder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ extension RouteBuilder {
register(host: nil, method: method, path: path, responder: responder)
}

// FIXME: This function feels like it might not fit
public func add(
_ method: HTTP.Method,
_ path: String ...,
Expand Down
46 changes: 45 additions & 1 deletion Sources/Routing/Router+Responder.swift
Original file line number Diff line number Diff line change
@@ -1,11 +1,55 @@
import HTTP
import Branches
import Debugging

public var supportOptionsRequests = true

extension Router: Responder {
public func respond(to request: Request) throws -> Response {
guard let responder = route(request) else { throw RouterError.missingRoute(for: request) }
guard let responder = route(request) else { return try fallbackResponse(for: request) }
return try responder.respond(to: request)
}

private func fallbackResponse(for request: Request) throws -> Response {
guard supportOptionsRequests, request.method == .options else { throw RouterError.missingRoute(for: request) }
return options(for: request)
}

private func options(for request: Request) -> Response {
let opts = supportedMethods(for: request)
.map { $0.description }
.joined(separator: ", ")
return Response(status: .ok, headers: ["Allow": opts])
}

private func supportedMethods(for request: Request) -> [Method] {
let request = request.copy()
let host = self.host(for: request.uri.host)
let allOptions = host.allSubBranches
let allPossibleMethods = allOptions.map { Method($0.name) }
return allPossibleMethods.filter { method in
request.method = method
return route(request) != nil
}
}

private func host(for host: String) -> Branch<Responder> {
// FIXME: RM !
return base.fetch([host])!
}
}

extension Request {
public func copy() -> Request {
return Request(
method: method,
uri: uri,
version: version,
headers: headers,
body: body,
peerAddress: peerAddress
)
}
}

public enum RouterError: Debuggable {
Expand Down
2 changes: 1 addition & 1 deletion Tests/RoutingTests/RouteTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ class RouteTests: XCTestCase {
query: nil,
fragment: nil
)
let request = try Request(method: .get, uri: uri)
let request = Request(method: .get, uri: uri)
let response = try router.respond(to: request)
XCTAssertEqual(response.body.bytes?.string, path.prefix(3).joined(separator: ":"))
}
Expand Down
4 changes: 2 additions & 2 deletions Tests/RoutingTests/RouterTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ class RouterTests: XCTestCase {
let empties: [String] = ["", "/"]
try empties.forEach { emptypath in
let uri = URI(scheme: "http", host: "0.0.0.0", path: emptypath)
let request = try Request(method: .get, uri: uri)
let request = Request(method: .get, uri: uri)
let response = try router.respond(to: request)
XCTAssertEqual(response.body.bytes?.string, "Hello, Empty!")
}
Expand All @@ -157,7 +157,7 @@ class RouterTests: XCTestCase {
scheme: "",
host: ""
)
let request = try Request(method: .get, uri: uri)
let request = Request(method: .get, uri: uri)
let response = try router.respond(to: request)
XCTAssertEqual(response.body.bytes?.string, "Hello, World!")
}
Expand Down
2 changes: 1 addition & 1 deletion Tests/RoutingTests/Utilities.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import URI
extension Request {
convenience init(method: HTTP.Method, path: String, host: String = "0.0.0.0") {
let uri = URI(host: host, path: path)
try! self.init(method: method, uri: uri)
self.init(method: method, uri: uri)
}

enum BytesError: Error {
Expand Down

0 comments on commit 364dea0

Please sign in to comment.