这个想法是能够在路由器服务上对 websocket 端点进行单元测试。使用 a 测试任何其他类型的端点都相当容易Request
,但我想不出一种轻松测试 websocket 响应的方法,因为使用 a 访问端点Request
会给你一个 501 错误,因为你没有任何相应的套接字握手。
这是我正在使用的路由器
def router(averages: IO[SomeAverages]): HttpRoutes[F] =
HttpRoutes.of[F] {
case GET -> Root =>
val toClient: Stream[F, WebSocketFrame] = {
Stream
.awakeEvery[F](5.seconds)
.map(_ => {
val avg = averages.unsafeRunSync
WebSocketFrame.Text(avg.toString)
})
}
val fromClient: Pipe[F, WebSocketFrame, Unit] = _.evalMap {
case WebSocketFrame.Text(t, _) => F.delay(println(t))
case f => F.delay(println(s"Unknown type: $f"))
}
WebSocketBuilder[F].build(toClient, fromClient)
}
这个想法是让类似于下面的代码与 websockets 一起工作
val server = Server.initServer[IO]
val router = server.router
val request = Request[IO](Method.GET, uri"/")
val io = router.orNotFound.run(request)
val response = io.unsafeRunSync
// response.status should be 200
// will return 501 if a websocket endpoint
我已经尝试过这样的变体,例如添加标题
val request = Request[IO](
Method.GET,
uri"/",
Headers(Header("Connection", "Upgrade"), Header("Upgrade", "websocket")
)
虽然任何Request
都会返回 501。
我不确定从这里去哪里,所以如果有人有任何建议,我会很高兴听到。我认为这与创建 websocket 客户端有关,但我不知道在 http4s 中这样做的方法。