Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Update Router/Server/ServerIO
  • Loading branch information
namolnad committed Jun 2, 2022
commit b5f01d96c422d84127b1f16c689ed58fc0e95290
8 changes: 4 additions & 4 deletions Xcode/Sources/HttpRouter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ open class HttpRouter {
var isEndOfRoute: Bool = false

/// The closure to handle the route
var handler: ((HttpRequest) -> HttpResponse)?
var handler: ((HttpRequest) async -> HttpResponse)?
}

private var rootNode = Node()
Expand All @@ -47,7 +47,7 @@ open class HttpRouter {
return result
}

public func register(_ method: String?, path: String, handler: ((HttpRequest) -> HttpResponse)?) {
public func register(_ method: String?, path: String, handler: ((HttpRequest) async -> HttpResponse)?) {
var pathSegments = stripQuery(path).split("/")
if let method = method {
pathSegments.insert(method, at: 0)
Expand All @@ -58,7 +58,7 @@ open class HttpRouter {
inflate(&rootNode, generator: &pathSegmentsGenerator).handler = handler
}

public func route(_ method: String?, path: String) -> ([String: String], (HttpRequest) -> HttpResponse)? {
public func route(_ method: String?, path: String) -> ([String: String], (HttpRequest) async -> HttpResponse)? {

return queue.sync {
if let method = method {
Expand Down Expand Up @@ -98,7 +98,7 @@ open class HttpRouter {
return currentNode
}

private func findHandler(_ node: inout Node, params: inout [String: String], generator: inout IndexingIterator<[String]>) -> ((HttpRequest) -> HttpResponse)? {
private func findHandler(_ node: inout Node, params: inout [String: String], generator: inout IndexingIterator<[String]>) -> ((HttpRequest) async -> HttpResponse)? {

var matchedRoutes = [Node]()
let pattern = generator.map { $0 }
Expand Down
6 changes: 3 additions & 3 deletions Xcode/Sources/HttpServer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ open class HttpServer: HttpServerIO {
public var DELETE, PATCH, HEAD, POST, GET, PUT: MethodRoute
public var delete, patch, head, post, get, put: MethodRoute

public subscript(path: String) -> ((HttpRequest) -> HttpResponse)? {
public subscript(path: String) -> ((HttpRequest) async -> HttpResponse)? {
get { return nil }
set {
router.register(nil, path: path, handler: newValue)
Expand All @@ -56,7 +56,7 @@ open class HttpServer: HttpServerIO {

public var middleware = [(HttpRequest) -> HttpResponse?]()

override open func dispatch(_ request: HttpRequest) -> ([String: String], (HttpRequest) -> HttpResponse) {
override open func dispatch(_ request: HttpRequest) -> ([String: String], (HttpRequest) async -> HttpResponse) {
for layer in middleware {
if let response = layer(request) {
return ([:], { _ in response })
Expand All @@ -74,7 +74,7 @@ open class HttpServer: HttpServerIO {
public struct MethodRoute {
public let method: String
public let router: HttpRouter
public subscript(path: String) -> ((HttpRequest) -> HttpResponse)? {
public subscript(path: String) -> ((HttpRequest) async -> HttpResponse)? {
get { return nil }
set {
router.register(method, path: path, handler: newValue)
Expand Down
45 changes: 23 additions & 22 deletions Xcode/Sources/HttpServerIO.swift
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@ open class HttpServerIO {
stop()
}

@available(macOS 10.10, *)
public func start(_ port: in_port_t = 8080, forceIPv4: Bool = false, priority: DispatchQoS.QoSClass = DispatchQoS.QoSClass.background) throws {
guard !self.operating else { return }
stop()
Expand Down Expand Up @@ -111,34 +110,36 @@ open class HttpServerIO {
self.state = .stopped
}

open func dispatch(_ request: HttpRequest) -> ([String: String], (HttpRequest) -> HttpResponse) {
open func dispatch(_ request: HttpRequest) -> ([String: String], (HttpRequest) async -> HttpResponse) {
return ([:], { _ in HttpResponse.notFound(nil) })
}

private func handleConnection(_ socket: Socket) {
let parser = HttpParser()
while self.operating, let request = try? parser.readHttpRequest(socket) {
let request = request
request.address = try? socket.peername()
let (params, handler) = self.dispatch(request)
request.params = params
let response = handler(request)
var keepConnection = parser.supportsKeepAlive(request.headers)
do {
if self.operating {
keepConnection = try self.respond(socket, response: response, keepAlive: keepConnection)
Task {
let parser = HttpParser()
while self.operating, let request = try? parser.readHttpRequest(socket) {
let request = request
request.address = try? socket.peername()
let (params, handler) = self.dispatch(request)
request.params = params
let response = await handler(request)
var keepConnection = parser.supportsKeepAlive(request.headers)
do {
if self.operating {
keepConnection = try self.respond(socket, response: response, keepAlive: keepConnection)
}
} catch {
print("Failed to send response: \(error)")
}
} catch {
print("Failed to send response: \(error)")
}
if let session = response.socketSession() {
delegate?.socketConnectionReceived(socket)
session(socket)
break
if let session = response.socketSession() {
delegate?.socketConnectionReceived(socket)
session(socket)
break
}
if !keepConnection { break }
}
if !keepConnection { break }
socket.close()
}
socket.close()
}

private struct InnerWriteContext: HttpResponseBodyWriter {
Expand Down