Как установить заголовок со статическим промежуточным ПО в Скотти? - PullRequest
3 голосов
/ 19 марта 2019

Предположим, у меня есть набор статических файлов, но они без расширения. Я хочу установить заголовок «Content-Type: image / png» для всех них , которые служат от «some /» (1-е правило). Как это сделать в этом коде?

import Network.Wai.Middleware.Static
import Web.Scotty

routes :: Scotty M ()
routes = do
  ...
  middleware $ staticPolicy $
    contains "some/" >-> (addBase "/something/files/")
    <|>
    addBase "/elsewhere/"

Я пробовал это:

setContentType :: Middleware
setContentType = modifyResponse $ mapResponseHeaders 
(("Content-Type", "image/png"):)

reqInfixedWith :: Text -> Request -> Bool
reqInfixedWith str req =
  isInfixOf str $ convertString $ rawQueryString req

...

-- in routes
  middleware $ ifRequest (reqInfixedWith "some/") setContentType

и проверяется с помощью Debug.Trace пути запроса, строки запроса - все они пусты, а фактический запрос "...: 8080 / some / somefile".

Как правильно это сделать?

1 Ответ

1 голос
/ 20 марта 2019

Требуется функция addHeader из Web.Scotty:

http://hackage.haskell.org/package/scotty-0.11.3/docs/Web-Scotty.html

addHeader :: Text -> Text -> ActionM ()

Пример:

{-#Language OverloadedStrings#-}
import           Network.Wai.Middleware.Static
import           Web.Scotty

main :: IO ()
main = do
  scotty 3000 $ do
    middleware static
    get "/some/:file" $ do
      f <- param "file"
      addHeader "Content-Type" "image/png"
      file f

Запрос к http://localhost:3000/some/image возвращает файл с именем "image" с типом содержимого image/png:

enter image description here

...