From 49dfa1da1fadabe92413bafee3bd01d4156a6fdb Mon Sep 17 00:00:00 2001 From: tanner0101 Date: Tue, 14 Aug 2018 14:25:57 -0400 Subject: [PATCH] NIO transport services test integration --- Package.swift | 17 +++++++++++++---- Sources/HTTP/Exports.swift | 4 ++++ Sources/HTTP/Responder/HTTPScheme.swift | 5 +++++ Sources/HTTP/Responder/HTTPServer.swift | 8 +++++++- Sources/HTTPPerformance/main.swift | 4 ++++ 5 files changed, 33 insertions(+), 5 deletions(-) diff --git a/Package.swift b/Package.swift index be7f0de7..29d5e691 100644 --- a/Package.swift +++ b/Package.swift @@ -12,13 +12,22 @@ let package = Package( // Event-driven network application framework for high performance protocol servers & clients, non-blocking. .package(url: "https://github.com/apple/swift-nio.git", from: "1.4.0"), - - // Bindings to OpenSSL-compatible libraries for TLS support in SwiftNIO - .package(url: "https://github.com/apple/swift-nio-ssl.git", from: "1.0.1"), ], targets: [ - .target(name: "HTTP", dependencies: ["Async", "Bits", "Core", "Debugging", "NIO", "NIOOpenSSL", "NIOHTTP1"]), .testTarget(name: "HTTPTests", dependencies: ["HTTP"]), .target(name: "HTTPPerformance", dependencies: ["HTTP"]), ] ) + +var dependencies: [Target.Dependency] = ["Async", "Bits", "Core", "Debugging", "NIO", "NIOHTTP1"] + +#if os(Linux) +// Bindings to OpenSSL-compatible libraries for TLS support in SwiftNIO +package.dependencies.append(.package(url: "https://github.com/apple/swift-nio-ssl.git", from: "1.0.1")) +dependencies.append("NIOOpenSSL") +#else +// Extensions for SwiftNIO to support Apple platforms as first-class citizens. +package.dependencies.append(.package(url: "https://github.com/apple/swift-nio-transport-services.git", from: "0.1.0")) +dependencies.append("NIOTransportServices") +#endif +package.targets.append(.target(name: "HTTP", dependencies: dependencies)) diff --git a/Sources/HTTP/Exports.swift b/Sources/HTTP/Exports.swift index cff4815a..788067d0 100644 --- a/Sources/HTTP/Exports.swift +++ b/Sources/HTTP/Exports.swift @@ -1,4 +1,8 @@ @_exported import Core @_exported import NIO @_exported import NIOHTTP1 +#if os(Linux) @_exported import NIOOpenSSL +#else +@_exported import NIOTransportServices +#endif diff --git a/Sources/HTTP/Responder/HTTPScheme.swift b/Sources/HTTP/Responder/HTTPScheme.swift index 36285b08..ed490d7b 100644 --- a/Sources/HTTP/Responder/HTTPScheme.swift +++ b/Sources/HTTP/Responder/HTTPScheme.swift @@ -9,10 +9,15 @@ public struct HTTPScheme { public static var https: HTTPScheme { return .init(443) { channel in return Future.flatMap(on: channel.eventLoop) { + #if os(Linux) let tlsConfiguration = TLSConfiguration.forClient(certificateVerification: .none) let sslContext = try SSLContext(configuration: tlsConfiguration) let tlsHandler = try OpenSSLClientHandler(context: sslContext) return channel.pipeline.add(handler: tlsHandler) + #else + #warning("Add support for Network.framework TLS") + return .done(on: channel.eventLoop) + #endif } } } diff --git a/Sources/HTTP/Responder/HTTPServer.swift b/Sources/HTTP/Responder/HTTPServer.swift index c9a3b0e2..519ff89f 100644 --- a/Sources/HTTP/Responder/HTTPServer.swift +++ b/Sources/HTTP/Responder/HTTPServer.swift @@ -41,7 +41,13 @@ public final class HTTPServer { on worker: Worker, onError: @escaping (Error) -> () = { _ in } ) -> Future where R: HTTPServerResponder { - let bootstrap = ServerBootstrap(group: worker) + #if os(Linux) + let bootstrapType = ServerBootstrap.self + #else + let bootstrapType = NIOTSListenerBootstrap.self + #endif + + let bootstrap = bootstrapType.init(group: worker as! NIOTSEventLoopGroup) // Specify backlog and enable SO_REUSEADDR for the server itself .serverChannelOption(ChannelOptions.backlog, value: Int32(backlog)) .serverChannelOption(ChannelOptions.socket(SocketOptionLevel(SOL_SOCKET), SO_REUSEADDR), value: reuseAddress ? SocketOptionValue(1) : SocketOptionValue(0)) diff --git a/Sources/HTTPPerformance/main.swift b/Sources/HTTPPerformance/main.swift index 04f5b19b..01f7b562 100644 --- a/Sources/HTTPPerformance/main.swift +++ b/Sources/HTTPPerformance/main.swift @@ -12,8 +12,12 @@ struct EchoResponder: HTTPServerResponder { } print("Server starting on http://\(hostname):\(port)") +#if os(Linux) let group = MultiThreadedEventLoopGroup(numberOfThreads: System.coreCount) defer { try! group.syncShutdownGracefully() } +#else +let group = NIOTSEventLoopGroup(loopCount: System.coreCount, defaultQoS: .default) +#endif let server = try HTTPServer.start(hostname: hostname, port: port, responder: EchoResponder(), on: group).wait() try server.onClose.wait()