Служите статическим файлам из памяти в веб-приложении Scotty

Для облегчения перемещения приложений я хотел бы подавать статические файлы из памяти вместо диска в моем приложении Scotty. Я сейчас пользуюсь wai-middleware-static обслуживать файлы с диска, но я вижу, что есть wai-app-static что может сделать это, но это не в форме Middleware,

Могу ли я включить wai-app-staticApplication в Middleware или я пропускаю другой пакет?

2 ответа

Решение

Я не мог найти то, что искал, поэтому я сделал свой собственный: 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 и верните нужное приложение, и теперь у вас есть 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,

Возможно, где-то есть вспомогательная функция, которая делает это и для вас, но я не уверен.

Другие вопросы по тегам