Skip to content
This repository was archived by the owner on Apr 7, 2022. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
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
17 changes: 13 additions & 4 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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))
4 changes: 4 additions & 0 deletions Sources/HTTP/Exports.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
@_exported import Core
@_exported import NIO
@_exported import NIOHTTP1
#if os(Linux)
@_exported import NIOOpenSSL
#else
@_exported import NIOTransportServices
#endif
5 changes: 5 additions & 0 deletions Sources/HTTP/Responder/HTTPScheme.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
}
Expand Down
8 changes: 7 additions & 1 deletion Sources/HTTP/Responder/HTTPServer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,13 @@ public final class HTTPServer {
on worker: Worker,
onError: @escaping (Error) -> () = { _ in }
) -> Future<HTTPServer> 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))
Expand Down
4 changes: 4 additions & 0 deletions Sources/HTTPPerformance/main.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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()