7

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

Amazonka用于我对 S3 所做的事情,我可以获得一个 S3 文件的流作为Conduit接收器。

但现在我不知道如何从Sinkto得到EitherT ServantErr IO a

谁能解释我如何做到这一点或向我展示如何做到这一点的一些例子?

4

1 回答 1

4

Servant 没有开箱即用的功能,但是所有需要的部件都是可用的。

在我们开始之前,我猜如果你可以流式传输到 Sink,那意味着你有一个源(gorsBodyofGetObjectResponse是 a RsBody,它是一个 Source)

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

要创建该实例,我们必须实现route :: Proxy layout -> Server layout -> RoutingApplication. Server layout, 在这种情况下, 只是意味着EitherT ServantErr IO layout,layout作为我们想要服务器的源, 所以它是返回源的函数(并且可能会因 HTTP 错误而失败)。

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

幸运的是,我们不必走得太远:Network.Wai.Conduit只包含实现route函数responseSource所需的内容:获取状态值、一些响应标头和您的源,并为您提供一个Response.

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

于 2016-01-25T10:44:38.917 回答