|
@@ -9,9 +9,11 @@ import Foundation
|
|
|
|
|
|
|
|
|
|
|
|
|
public func websocket(
|
|
public func websocket(
|
|
|
- _ text: ((WebSocketSession, String) -> Void)?,
|
|
|
|
|
- _ binary: ((WebSocketSession, [UInt8]) -> Void)?,
|
|
|
|
|
- _ pong: ((WebSocketSession, [UInt8]) -> Void)?) -> ((HttpRequest) -> HttpResponse) {
|
|
|
|
|
|
|
+ text: ((WebSocketSession, String) -> Void)? = nil,
|
|
|
|
|
+ binary: ((WebSocketSession, [UInt8]) -> Void)? = nil,
|
|
|
|
|
+ pong: ((WebSocketSession, [UInt8]) -> Void)? = nil,
|
|
|
|
|
+ connected: ((WebSocketSession) -> Void)? = nil,
|
|
|
|
|
+ disconnected: ((WebSocketSession) -> Void)? = nil) -> ((HttpRequest) -> HttpResponse) {
|
|
|
return { r in
|
|
return { r in
|
|
|
guard r.hasTokenForHeader("upgrade", token: "websocket") else {
|
|
guard r.hasTokenForHeader("upgrade", token: "websocket") else {
|
|
|
return .badRequest(.text("Invalid value of 'Upgrade' header: \(r.headers["upgrade"] ?? "unknown")"))
|
|
return .badRequest(.text("Invalid value of 'Upgrade' header: \(r.headers["upgrade"] ?? "unknown")"))
|
|
@@ -105,6 +107,8 @@ public func websocket(
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ connected?(session)
|
|
|
|
|
+
|
|
|
do {
|
|
do {
|
|
|
try read()
|
|
try read()
|
|
|
} catch let error {
|
|
} catch let error {
|
|
@@ -126,6 +130,8 @@ public func websocket(
|
|
|
// If an error occurs, send the close handshake.
|
|
// If an error occurs, send the close handshake.
|
|
|
session.writeCloseFrame()
|
|
session.writeCloseFrame()
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ disconnected?(session)
|
|
|
}
|
|
}
|
|
|
guard let secWebSocketAccept = String.toBase64((secWebSocketKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").sha1()) else {
|
|
guard let secWebSocketAccept = String.toBase64((secWebSocketKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").sha1()) else {
|
|
|
return HttpResponse.internalServerError
|
|
return HttpResponse.internalServerError
|