Подавать статические файлы из памяти в веб-приложении Scotty

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

Могу ли я превратить wai-app-static Application в Middleware или мне не хватает другого пакета?


person adamse    schedule 19.01.2017    source источник


Ответы (2)


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.

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

person Libby    schedule 19.01.2017
comment
(Я видел, что вы уже придумали ответ, но он был у меня в черновике, поэтому я все равно опубликовал его на случай, если он будет полезен кому-то в будущем.) - person Libby; 20.01.2017
comment
Спасибо, это дало мне пищу для размышлений! :) - person adamse; 20.01.2017

Я не смог найти то, что искал, поэтому сделал свой собственный: https://github.com/adamse/wai-middleware-static-embedded на основе wai-middleware-static.

Он обеспечивает функцию

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

который обслуживает файл, если он есть в предоставленном списке.

person adamse    schedule 19.01.2017