增加对将 HTTP1 连接升级到 WebSocket 的支持。
使用闭包设置 WebSocket 升级,该闭包要么返回包含响应头和 WebSocket 处理程序的 .upgrade
,要么返回 .dontUpgrade
let app = Application(
router: router,
server: .http1WebSocketUpgrade { request, channel, logger in
// upgrade if request path is "/ws"
guard request.path == "/ws" else { return .dontUpgrade }
// The upgrade response includes the headers to include in the response and
// the WebSocket handler
return .upgrade([:]) { inbound, outbound, context in
for try await packet in inbound {
// send "Received" for every packet we receive
try await outbound.write(.text("Received"))
}
}
}
)
app.runService()
或者,也可以使用 Router
。使用路由器意味着您可以添加中间件来处理初始升级请求,然后再对其进行处理,例如,用于验证请求。
let wsRouter = Router(context: BasicWebSocketRequestContext.self)
wsRouter.middlewares.add(BasicAuthenticator())
// An upgrade only occurs if a WebSocket path is matched
wsRouter.ws("/ws") { request, context in
// allow upgrade
.upgrade()
} onUpgrade: { inbound, outbound, context in
for try await packet in inbound {
// send "Received" for every packet we receive
try await outbound.write(.text("Received"))
}
}
let app = Application(
router: router,
server: .http1WebSocketUpgrade(webSocketRouter: wsRouter)
)
app.runService()
您可以在此处找到 HummingbirdWebSocket 的文档。hummingbird-examples 存储库包含该库不同用法的示例。