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:
parent
846bc4f2f1
commit
993a3b7521
|
@ -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)
|
||||
}
|
||||
|
|
@ -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
|
|
@ -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())
|
||||
})
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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),
|
|
@ -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())
|
||||
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue