Haskell Servant和流媒体

Ale*_*aga 7 haskell amazon-s3 servant

我正在尝试向我的servant服务器添加一个功能,该功能将从Amazon S3获取文件并将其传回给用户.因为文件可能很大,我不想在本地下载它们然后将它们提供给客户端,我宁愿将它们直接从S3流式传输到客户端.

我使用AmazonkaS3做的事情,我可以获得S3文件的流作为接收Conduit器.

但现在我不知道如何从中获取SinkEitherT ServantErr IO a.

任何人都可以解释我该怎么做或向我展示如何做到这一点的一些例子?

mad*_*jar 4

Servant 中没有任何东西可以开箱即用地执行此操作,但是所有需要的部件都可用。

在我们开始之前,我想如果你可以流式传输到接收器,那就意味着你有一个源( 的gorsBodyGetObjectResponsea RsBody,它是一个源)

首先,Servant 为我们提供了通过创建 的新实例来添加对新返回类型的支持的可能性HasServer,因此我们可以提供 aEitherT ServantErr IO (Source ...)并使其流式传输。

要创建该实例,我们必须实现route :: Proxy layout -> Server layout -> RoutingApplication. Server layout,在本例中,仅表示EitherT ServantErr IO layoutlayout是我们想要服务器的源,因此它是返回源的函数(并且可能会因 HTTP 错误而失败)。

我们必须返回 a ,它(以延续风格)是一个接受 a并返回 a 的RoutingApplication函数,这意味着不匹配的路由错误或响应。和都是标准的 wai,而不是 Servant,所以我们现在可以看看生态系统的其余部分来找到如何实现它。RequestRouteResult ResponseRequestResponse

幸运的是,我们不必走得太远:Network.Wai.Conduit只包含实现该功能所需的内容routeresponseSource接受状态值、一些响应标头和源代码,并为您提供一个Response.

所以,要做的工作相当多,但我们需要的一切都在那里。查看实例的来源HasServer * (Get ...)可能会有所帮助。