|
|
@@ -6,9 +6,9 @@
|
|
|
|
|
|
import Foundation
|
|
|
|
|
|
-class HttpServer
|
|
|
+public class HttpServer
|
|
|
{
|
|
|
- typealias Handler = HttpRequest -> HttpResponse
|
|
|
+ public typealias Handler = HttpRequest -> HttpResponse
|
|
|
|
|
|
var handlers: [(expression: NSRegularExpression, handler: Handler)] = []
|
|
|
var clientSockets: Set<CInt> = []
|
|
|
@@ -18,7 +18,10 @@ class HttpServer
|
|
|
let matchingOptions = NSMatchingOptions(rawValue: 0)
|
|
|
let expressionOptions = NSRegularExpressionOptions(rawValue: 0)
|
|
|
|
|
|
- subscript (path: String) -> Handler? {
|
|
|
+ public init(){
|
|
|
+ }
|
|
|
+
|
|
|
+ public subscript (path: String) -> Handler? {
|
|
|
get {
|
|
|
return nil
|
|
|
}
|
|
|
@@ -34,9 +37,9 @@ class HttpServer
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- func routes() -> [String] { return handlers.map { $0.0.pattern } }
|
|
|
+ public func routes() -> [String] { return handlers.map { $0.0.pattern } }
|
|
|
|
|
|
- func start(listenPort: in_port_t = 8080, error: NSErrorPointer = nil) -> Bool {
|
|
|
+ public func start(listenPort: in_port_t = 8080, error: NSErrorPointer = nil) -> Bool {
|
|
|
stop()
|
|
|
if let socket = Socket.tcpForListen(listenPort, error: error) {
|
|
|
self.acceptSocket = socket
|
|
|
@@ -73,13 +76,13 @@ class HttpServer
|
|
|
return false
|
|
|
}
|
|
|
|
|
|
- func findHandler(url:String) -> (NSRegularExpression, Handler)? {
|
|
|
+ public func findHandler(url:String) -> (NSRegularExpression, Handler)? {
|
|
|
return self.handlers.filter {
|
|
|
$0.0.numberOfMatchesInString(url, options: self.matchingOptions, range: HttpServer.asciiRange(url)) > 0
|
|
|
}.first
|
|
|
}
|
|
|
|
|
|
- func captureExpressionGroups(expression: NSRegularExpression, value: String) -> [String] {
|
|
|
+ public func captureExpressionGroups(expression: NSRegularExpression, value: String) -> [String] {
|
|
|
var capturedGroups = [String]()
|
|
|
if let result = expression.firstMatchInString(value, options: matchingOptions, range: HttpServer.asciiRange(value)) {
|
|
|
let nsValue: NSString = value
|
|
|
@@ -92,7 +95,7 @@ class HttpServer
|
|
|
return capturedGroups
|
|
|
}
|
|
|
|
|
|
- func stop() {
|
|
|
+ public func stop() {
|
|
|
Socket.release(acceptSocket)
|
|
|
acceptSocket = -1
|
|
|
HttpServer.lock(self.clientSocketsLock) {
|
|
|
@@ -103,17 +106,17 @@ class HttpServer
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- class func asciiRange(value: String) -> NSRange {
|
|
|
+ public class func asciiRange(value: String) -> NSRange {
|
|
|
return NSMakeRange(0, value.lengthOfBytesUsingEncoding(NSASCIIStringEncoding))
|
|
|
}
|
|
|
|
|
|
- class func lock(handle: AnyObject, closure: () -> ()) {
|
|
|
+ public class func lock(handle: AnyObject, closure: () -> ()) {
|
|
|
objc_sync_enter(handle)
|
|
|
closure()
|
|
|
objc_sync_exit(handle)
|
|
|
}
|
|
|
|
|
|
- class func respond(socket: CInt, response: HttpResponse, keepAlive: Bool) {
|
|
|
+ public class func respond(socket: CInt, response: HttpResponse, keepAlive: Bool) {
|
|
|
Socket.writeUTF8(socket, string: "HTTP/1.1 \(response.statusCode()) \(response.reasonPhrase())\r\n")
|
|
|
if let body = response.body() {
|
|
|
Socket.writeASCII(socket, string: "Content-Length: \(body.length)\r\n")
|