Update naming to allow for the easy addition of a HTTP client upgrader. (#983)

Motivation:

To make the web socket upgrader naming clearer, particularly once we add a client version.

Modifications:

Rename WebSocketUpgrader too WebSocketServerUpgrader.

Result:

Improved clarity of naming on the web socket upgrader.
This commit is contained in:
Liam Flynn 2019-05-02 11:02:48 +01:00 committed by Cory Benfield
parent 846bc4f2f1
commit 993a3b7521
7 changed files with 37 additions and 33 deletions

View File

@ -2,7 +2,7 @@
//
// This source file is part of the SwiftNIO open source project
//
// Copyright (c) 2017-2018 Apple Inc. and the SwiftNIO project authors
// Copyright (c) 2017-2019 Apple Inc. and the SwiftNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
@ -28,7 +28,7 @@ public enum HTTPServerUpgradeEvents {
}
/// An object that implements `ProtocolUpgrader` knows how to handle HTTP upgrade to
/// An object that implements `HTTPServerProtocolUpgrader` knows how to handle HTTP upgrade to
/// a protocol.
public protocol HTTPServerProtocolUpgrader {
/// The protocol this upgrader knows how to support.
@ -186,7 +186,7 @@ public final class HTTPServerUpgradeHandler: ChannelInboundHandler, RemovableCha
return context.eventLoop.makeSucceededFuture(nil)
}
guard let upgrader = upgraders[proto.lowercased()] else {
guard let upgrader = self.upgraders[proto.lowercased()] else {
return self.handleUpgradeForProtocol(context: context, protocolIterator: protocolIterator, request: request, allHeaderNames: allHeaderNames, connectionHeader: connectionHeader)
}

View File

@ -18,6 +18,9 @@ import NIOHTTP1
private let magicWebSocketGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
@available(*, deprecated, renamed: "NIOWebSocketServerUpgrader")
public typealias WebSocketUpgrader = NIOWebSocketServerUpgrader
/// Errors that can be thrown by `NIOWebSocket` during protocol upgrade.
public struct NIOWebSocketUpgradeError: Error, Equatable {
private enum ActualError {
@ -51,14 +54,14 @@ fileprivate extension HTTPHeaders {
/// A `HTTPServerProtocolUpgrader` that knows how to do the WebSocket upgrade dance.
///
/// Users may frequently want to offer multiple websocket endpoints on the same port. For this
/// reason, this `WebSocketUpgrader` only knows how to do the required parts of the upgrade and to
/// reason, this `WebServerSocketUpgrader` only knows how to do the required parts of the upgrade and to
/// complete the handshake. Users are expected to provide a callback that examines the HTTP headers
/// (including the path) and determines whether this is a websocket upgrade request that is acceptable
/// to them.
///
/// This upgrader assumes that the `HTTPServerUpgradeHandler` will appropriately mutate the pipeline to
/// remove the HTTP `ChannelHandler`s.
public final class WebSocketUpgrader: HTTPServerProtocolUpgrader {
public final class NIOWebSocketServerUpgrader: HTTPServerProtocolUpgrader {
/// RFC 6455 specs this as the required entry in the Upgrade header.
public let supportedProtocol: String = "websocket"
@ -72,7 +75,7 @@ public final class WebSocketUpgrader: HTTPServerProtocolUpgrader {
private let maxFrameSize: Int
private let automaticErrorHandling: Bool
/// Create a new `WebSocketUpgrader`.
/// Create a new `NIOWebSocketServerUpgrader`.
///
/// - parameters:
/// - automaticErrorHandling: Whether the pipeline should automatically handle protocol
@ -95,7 +98,7 @@ public final class WebSocketUpgrader: HTTPServerProtocolUpgrader {
}
/// Create a new `WebSocketUpgrader`.
/// Create a new `NIOWebSocketServerUpgrader`.
///
/// - parameters:
/// - maxFrameSize: The maximum frame size the decoder is willing to tolerate from the

View File

@ -202,7 +202,7 @@ private final class WebSocketTimeHandler: ChannelInboundHandler {
let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
let upgrader = WebSocketUpgrader(shouldUpgrade: { (channel: Channel, head: HTTPRequestHead) in channel.eventLoop.makeSucceededFuture(HTTPHeaders()) },
let upgrader = NIOWebSocketServerUpgrader(shouldUpgrade: { (channel: Channel, head: HTTPRequestHead) in channel.eventLoop.makeSucceededFuture(HTTPHeaders()) },
upgradePipelineHandler: { (channel: Channel, _: HTTPRequestHead) in
channel.pipeline.addHandler(WebSocketTimeHandler())
})

View File

@ -63,9 +63,9 @@ import XCTest
testCase(HTTPServerClientTest.allTests),
testCase(HTTPServerPipelineHandlerTest.allTests),
testCase(HTTPServerProtocolErrorHandlerTest.allTests),
testCase(HTTPServerUpgradeTestCase.allTests),
testCase(HTTPTest.allTests),
testCase(HTTPTypesTest.allTests),
testCase(HTTPUpgradeTestCase.allTests),
testCase(HappyEyeballsTest.allTests),
testCase(HeapTests.allTests),
testCase(IdleStateHandlerTest.allTests),

View File

@ -12,7 +12,7 @@
//
//===----------------------------------------------------------------------===//
//
// HTTPUpgradeTests+XCTest.swift
// HTTPServerUpgradeTests+XCTest.swift
//
import XCTest
@ -22,9 +22,9 @@ import XCTest
/// Do NOT edit this file directly as it will be regenerated automatically when needed.
///
extension HTTPUpgradeTestCase {
extension HTTPServerUpgradeTestCase {
static var allTests : [(String, (HTTPUpgradeTestCase) -> () throws -> Void)] {
static var allTests : [(String, (HTTPServerUpgradeTestCase) -> () throws -> Void)] {
return [
("testUpgradeWithoutUpgrade", testUpgradeWithoutUpgrade),
("testUpgradeAfterInitialRequest", testUpgradeAfterInitialRequest),

View File

@ -2,7 +2,7 @@
//
// This source file is part of the SwiftNIO open source project
//
// Copyright (c) 2017-2018 Apple Inc. and the SwiftNIO project authors
// Copyright (c) 2017-2019 Apple Inc. and the SwiftNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
@ -18,7 +18,7 @@ import Dispatch
@testable import NIOHTTP1
extension ChannelPipeline {
func assertDoesNotContainUpgrader() throws {
fileprivate func assertDoesNotContainUpgrader() throws {
try self.assertDoesNotContain(handlerType: HTTPServerUpgradeHandler.self)
}
@ -33,11 +33,11 @@ extension ChannelPipeline {
}
}
func assertContainsUpgrader() throws {
fileprivate func assertContainsUpgrader() throws {
try self.assertContains(handlerType: HTTPServerUpgradeHandler.self)
}
func assertContains<Handler: ChannelHandler>(handlerType: Handler.Type) throws {
fileprivate func assertContains<Handler: ChannelHandler>(handlerType: Handler.Type) throws {
do {
_ = try self.context(handlerType: handlerType).wait()
} catch ChannelPipelineError.notFound {
@ -47,7 +47,7 @@ extension ChannelPipeline {
// Waits up to 1 second for the upgrader to be removed by polling the pipeline
// every 50ms checking for the handler.
func waitForUpgraderToBeRemoved() throws {
fileprivate func waitForUpgraderToBeRemoved() throws {
for _ in 0..<20 {
do {
_ = try self.context(handlerType: HTTPServerUpgradeHandler.self).wait()
@ -335,7 +335,7 @@ private extension ByteBuffer {
}
}
class HTTPUpgradeTestCase: XCTestCase {
class HTTPServerUpgradeTestCase: XCTestCase {
func testUpgradeWithoutUpgrade() throws {
let (group, server, client, connectedServer) = try setUpTestWithAutoremoval(upgraders: [ExplodingUpgrader(forProtocol: "myproto")],
extraHandlers: []) { (_: ChannelHandlerContext) in
@ -481,6 +481,7 @@ class HTTPUpgradeTestCase: XCTestCase {
XCTAssertNoThrow(try group.syncShutdownGracefully())
}
// This request is missing a 'Kafkaesque' connection header.
let request = "OPTIONS * HTTP/1.1\r\nHost: localhost\r\nConnection: upgrade\r\nUpgrade: myproto\r\nKafkaesque: true\r\n\r\n"
XCTAssertNoThrow(try client.writeAndFlush(NIOAny(ByteBuffer.forString(request))).wait())

View File

@ -114,7 +114,7 @@ private class WebSocketRecorderHandler: ChannelInboundHandler {
}
class EndToEndTests: XCTestCase {
func createTestFixtures(upgraders: [WebSocketUpgrader]) -> (loop: EmbeddedEventLoop, serverChannel: EmbeddedChannel, clientChannel: EmbeddedChannel) {
func createTestFixtures(upgraders: [NIOWebSocketServerUpgrader]) -> (loop: EmbeddedEventLoop, serverChannel: EmbeddedChannel, clientChannel: EmbeddedChannel) {
let loop = EmbeddedEventLoop()
let serverChannel = EmbeddedChannel(loop: loop)
let upgradeConfig = (upgraders: upgraders as [HTTPServerProtocolUpgrader], completionHandler: { (context: ChannelHandlerContext) in } )
@ -129,7 +129,7 @@ class EndToEndTests: XCTestCase {
}
func testBasicUpgradeDance() throws {
let basicUpgrader = WebSocketUpgrader(shouldUpgrade: { (channel, head) in channel.eventLoop.makeSucceededFuture(HTTPHeaders()) },
let basicUpgrader = NIOWebSocketServerUpgrader(shouldUpgrade: { (channel, head) in channel.eventLoop.makeSucceededFuture(HTTPHeaders()) },
upgradePipelineHandler: { (channel, req) in channel.eventLoop.makeSucceededFuture(()) })
let (loop, server, client) = createTestFixtures(upgraders: [basicUpgrader])
defer {
@ -151,7 +151,7 @@ class EndToEndTests: XCTestCase {
}
func testUpgradeWithProtocolName() throws {
let basicUpgrader = WebSocketUpgrader(shouldUpgrade: { (channel, head) in channel.eventLoop.makeSucceededFuture(HTTPHeaders()) },
let basicUpgrader = NIOWebSocketServerUpgrader(shouldUpgrade: { (channel, head) in channel.eventLoop.makeSucceededFuture(HTTPHeaders()) },
upgradePipelineHandler: { (channel, req) in channel.eventLoop.makeSucceededFuture(()) })
let (loop, server, client) = createTestFixtures(upgraders: [basicUpgrader])
defer {
@ -170,7 +170,7 @@ class EndToEndTests: XCTestCase {
}
func testCanRejectUpgrade() throws {
let basicUpgrader = WebSocketUpgrader(shouldUpgrade: { (channel, head) in channel.eventLoop.makeSucceededFuture(nil) },
let basicUpgrader = NIOWebSocketServerUpgrader(shouldUpgrade: { (channel, head) in channel.eventLoop.makeSucceededFuture(nil) },
upgradePipelineHandler: { (channel, req) in
XCTFail("Should not have called")
return channel.eventLoop.makeSucceededFuture(())
@ -207,7 +207,7 @@ class EndToEndTests: XCTestCase {
var acceptPromise: EventLoopPromise<HTTPHeaders?>? = nil
var upgradeComplete = false
let basicUpgrader = WebSocketUpgrader(shouldUpgrade: { (channel, head) in
let basicUpgrader = NIOWebSocketServerUpgrader(shouldUpgrade: { (channel, head) in
acceptPromise = channel.eventLoop.makePromise()
return acceptPromise!.futureResult
},
@ -246,7 +246,7 @@ class EndToEndTests: XCTestCase {
}
func testRequiresVersion13() throws {
let basicUpgrader = WebSocketUpgrader(shouldUpgrade: { (channel, head) in channel.eventLoop.makeSucceededFuture(HTTPHeaders()) },
let basicUpgrader = NIOWebSocketServerUpgrader(shouldUpgrade: { (channel, head) in channel.eventLoop.makeSucceededFuture(HTTPHeaders()) },
upgradePipelineHandler: { (channel, req) in channel.eventLoop.makeSucceededFuture(()) })
let (loop, server, client) = createTestFixtures(upgraders: [basicUpgrader])
defer {
@ -274,7 +274,7 @@ class EndToEndTests: XCTestCase {
}
func testRequiresVersionHeader() throws {
let basicUpgrader = WebSocketUpgrader(shouldUpgrade: { (channel, head) in channel.eventLoop.makeSucceededFuture(HTTPHeaders()) },
let basicUpgrader = NIOWebSocketServerUpgrader(shouldUpgrade: { (channel, head) in channel.eventLoop.makeSucceededFuture(HTTPHeaders()) },
upgradePipelineHandler: { (channel, req) in channel.eventLoop.makeSucceededFuture(()) })
let (loop, server, client) = createTestFixtures(upgraders: [basicUpgrader])
defer {
@ -302,7 +302,7 @@ class EndToEndTests: XCTestCase {
}
func testRequiresKeyHeader() throws {
let basicUpgrader = WebSocketUpgrader(shouldUpgrade: { (channel, head) in channel.eventLoop.makeSucceededFuture(HTTPHeaders()) },
let basicUpgrader = NIOWebSocketServerUpgrader(shouldUpgrade: { (channel, head) in channel.eventLoop.makeSucceededFuture(HTTPHeaders()) },
upgradePipelineHandler: { (channel, req) in channel.eventLoop.makeSucceededFuture(()) })
let (loop, server, client) = createTestFixtures(upgraders: [basicUpgrader])
defer {
@ -330,7 +330,7 @@ class EndToEndTests: XCTestCase {
}
func testUpgradeMayAddCustomHeaders() throws {
let upgrader = WebSocketUpgrader(shouldUpgrade: { (channel, head) in
let upgrader = NIOWebSocketServerUpgrader(shouldUpgrade: { (channel, head) in
var hdrs = HTTPHeaders()
hdrs.add(name: "TestHeader", value: "TestValue")
return channel.eventLoop.makeSucceededFuture(hdrs)
@ -353,8 +353,8 @@ class EndToEndTests: XCTestCase {
}
func testMayRegisterMultipleWebSocketEndpoints() throws {
func buildHandler(path: String) -> WebSocketUpgrader {
return WebSocketUpgrader(shouldUpgrade: { (channel, head) in
func buildHandler(path: String) -> NIOWebSocketServerUpgrader {
return NIOWebSocketServerUpgrader(shouldUpgrade: { (channel, head) in
guard head.uri == "/\(path)" else { return channel.eventLoop.makeSucceededFuture(nil) }
var hdrs = HTTPHeaders()
hdrs.add(name: "Target", value: path)
@ -384,7 +384,7 @@ class EndToEndTests: XCTestCase {
func testSendAFewFrames() throws {
let recorder = WebSocketRecorderHandler()
let basicUpgrader = WebSocketUpgrader(shouldUpgrade: { (channel, head) in channel.eventLoop.makeSucceededFuture(HTTPHeaders()) },
let basicUpgrader = NIOWebSocketServerUpgrader(shouldUpgrade: { (channel, head) in channel.eventLoop.makeSucceededFuture(HTTPHeaders()) },
upgradePipelineHandler: { (channel, req) in
channel.pipeline.addHandler(recorder)
@ -422,7 +422,7 @@ class EndToEndTests: XCTestCase {
}
func testMaxFrameSize() throws {
let basicUpgrader = WebSocketUpgrader(maxFrameSize: 16, shouldUpgrade: { (channel, head) in channel.eventLoop.makeSucceededFuture(HTTPHeaders()) },
let basicUpgrader = NIOWebSocketServerUpgrader(maxFrameSize: 16, shouldUpgrade: { (channel, head) in channel.eventLoop.makeSucceededFuture(HTTPHeaders()) },
upgradePipelineHandler: { (channel, req) in
return channel.eventLoop.makeSucceededFuture(())
})
@ -447,7 +447,7 @@ class EndToEndTests: XCTestCase {
func testAutomaticErrorHandling() throws {
let recorder = WebSocketRecorderHandler()
let basicUpgrader = WebSocketUpgrader(shouldUpgrade: { (channel, head) in channel.eventLoop.makeSucceededFuture(HTTPHeaders()) },
let basicUpgrader = NIOWebSocketServerUpgrader(shouldUpgrade: { (channel, head) in channel.eventLoop.makeSucceededFuture(HTTPHeaders()) },
upgradePipelineHandler: { (channel, req) in
channel.pipeline.addHandler(recorder)
@ -490,7 +490,7 @@ class EndToEndTests: XCTestCase {
func testNoAutomaticErrorHandling() throws {
let recorder = WebSocketRecorderHandler()
let basicUpgrader = WebSocketUpgrader(automaticErrorHandling: false,
let basicUpgrader = NIOWebSocketServerUpgrader(automaticErrorHandling: false,
shouldUpgrade: { (channel, head) in channel.eventLoop.makeSucceededFuture(HTTPHeaders()) },
upgradePipelineHandler: { (channel, req) in
channel.pipeline.addHandler(recorder)