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

Serve static files from memory in Scotty webapp

为了便于应用程序重新定位,我想在我的 Scotty 应用程序中从内存而不是磁盘提供静态文件。我目前正在使用 wai-middleware-static to serve files from disk but I see that there is a wai-app-static 可以做到这一点,但它不是 Middleware.

的形式

我可以将 wai-app-static Application 变成 Middleware 还是我缺少另一个包裹?

我找不到我要找的东西所以我自己做了:https://github.com/adamse/wai-middleware-static-embedded 基于 wai-middleware-static.

它提供了一个功能

static :: [(FilePath, ByteString)] -> Middleware

如果文件在提供的列表中,它会提供文件。

Middleware 的类型为 Application -> Application。所以如果你 想把 someApplication 变成 Middleware,你可以这样做 它是:

staticMiddleware :: Middleware
staticMiddleware = \app -> someApplication

你扔掉了一个 Application 和 return 的参数 你想要的应用程序,现在你有 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 return这个预定义的应用程序,我正在构建我的 拥有 Application,只看一下 Request 并决定 Application 应该处理它。然后它传递参数 回到 Application.

某处可能有辅助函数可以为您执行此操作, 也是,但我不确定。