在Scotty webapp中从内存中提供静态文件

时间:2017-01-19 12:19:31

标签: haskell scotty

为了便于应用程序重定位,我想在我的Scotty应用程序中从内存而不是磁盘提供静态文件。我目前正在使用wai-middleware-static来处理来自磁盘的文件,但我发现有一个wai-app-static可以执行此操作,但它不是Middleware的形式。< / p>

我可以将wai-app-static Application变成Middleware,还是我错过了另一个套餐?

2 个答案:

答案 0 :(得分:1)

Middleware的类型为Application -> Application。所以,如果你 想要将someApplication转换为Middleware,这是您可以做的一种方式 它是:

staticMiddleware :: Middleware
staticMiddleware = \app -> someApplication

你丢弃一个Application的参数并返回 你想要的应用程序,现在你有Middleware

可能不是很有用Middleware。你可能想看一下 要求弄清楚如何处理它?比如,有些请求正在进行中 由这个静态服务器中间件处理,其他人正在进行 要处理你的常规服务器吗?

也许你可以这样做:

someMiddleware :: Middleware
someMiddleware = \app -> branchingApp

branchingApp :: Application
branchingApp req functionReqToRecieved =
  if iWantToStaticServeThis req
  then staticApp req functionReqToRecieved
  else dynamicApp req functionReqToRecieved

这是一个糟糕的代码,所以请不要复制,但我希望它可以解决这个问题?

Application是一个函数:Request -> (Response -> IO ResponseReceived) -> IO ResponseReceived。我想说怎么用 第一个参数(请求)。所以,而不是说这个 Middleware返回此预定义的应用程序,我构建了我的应用程序 拥有Application,只需查看Request并决定 哪个Application应该处理它。然后它传递参数 回到Application

在某处可能有帮助功能为您执行此操作, 我也不确定。

答案 1 :(得分:0)

我无法找到我要找的东西,所以我根据wai-middleware-static制作了自己的https://github.com/adamse/wai-middleware-static-embedded

它提供了一个功能

static :: [(FilePath, ByteString)] -> Middleware
如果文件位于提供的列表中,

将提供文件。