|
|
@@ -17,10 +17,8 @@ public class HttpServerIO {
|
|
|
private var listenSocket: Socket = Socket(socketFileDescriptor: -1)
|
|
|
private var clientSockets: Set<Socket> = []
|
|
|
private let clientSocketsLock = Lock()
|
|
|
-
|
|
|
- public typealias MiddlewareCallback = (HttpRequest) -> HttpResponse?
|
|
|
-
|
|
|
- public var middleware = [MiddlewareCallback]()
|
|
|
+
|
|
|
+ public var middleware = Array<(HttpRequest) -> HttpResponse?>()
|
|
|
|
|
|
@available(OSX 10.10, *)
|
|
|
public func start(_ listenPort: in_port_t = 8080, forceIPv4: Bool = false) throws {
|
|
|
@@ -100,9 +98,16 @@ public class HttpServerIO {
|
|
|
|
|
|
private struct InnerWriteContext: HttpResponseBodyWriter {
|
|
|
let socket: Socket
|
|
|
+
|
|
|
+ func write(_ file: File) {
|
|
|
+ var offset: off_t = 0
|
|
|
+ let _ = sendfile(fileno(file.pointer), socket.socketFileDescriptor, 0, &offset, nil, 0)
|
|
|
+ }
|
|
|
+
|
|
|
func write(_ data: [UInt8]) {
|
|
|
write(ArraySlice(data))
|
|
|
}
|
|
|
+
|
|
|
func write(_ data: ArraySlice<UInt8>) {
|
|
|
do {
|
|
|
try socket.writeUInt8(data)
|
|
|
@@ -143,9 +148,29 @@ public class HttpServerIO {
|
|
|
#if os(Linux)
|
|
|
|
|
|
import Glibc
|
|
|
+
|
|
|
+struct sf_hdtr { }
|
|
|
+
|
|
|
+func sendfile(_ source: Int32, _ target: Int32, _: off_t, _: UnsafeMutablePointer<off_t>!, _: UnsafeMutablePointer<sf_hdtr>!, _: Int32) -> Int32 {
|
|
|
+ var buffer = [UInt8](repeating: 0, count: 1024)
|
|
|
+ while true {
|
|
|
+ let readResult = read(source, &buffer, buffer.count)
|
|
|
+ guard readResult > 0 else {
|
|
|
+ return Int32(readResult)
|
|
|
+ }
|
|
|
+ var writeCounter = 0
|
|
|
+ while writeCounter < readResult {
|
|
|
+ let writeResult = write(target, &buffer + writeCounter, readResult - writeCounter)
|
|
|
+ guard writeResult > 0 else {
|
|
|
+ return Int32(writeResult)
|
|
|
+ }
|
|
|
+ writeCounter = writeCounter + writeResult
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
public class Lock {
|
|
|
-
|
|
|
+
|
|
|
private var mutex = pthread_mutex_t()
|
|
|
|
|
|
init() { pthread_mutex_init(&mutex, nil) }
|