Служите статическим файлам из памяти в веб-приложении Scotty
Для облегчения перемещения приложений я хотел бы подавать статические файлы из памяти вместо диска в моем приложении Scotty. Я сейчас пользуюсь wai-middleware-static
обслуживать файлы с диска, но я вижу, что есть wai-app-static
что может сделать это, но это не в форме Middleware
,
Могу ли я включить wai-app-static
Application
в 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
,
Возможно, где-то есть вспомогательная функция, которая делает это и для вас, но я не уверен.