向 snap 框架中的所有响应添加 header

add a header to all responses in snap framework

标题总结了它。我想在 snap 中为我的所有回复添加一个 header。 我可以为我的每条路线添加一个 modifyRequest 处理程序,例如:

apiRoutes :: [(ByteString, Handler b Api ())]
apiRoutes = [("status",  addHeader)]


addHeader :: Handler b Api ()
addHeader = do
   modifyResponse (setHeader "Content-Type" "application/json")
   otherHandler

otherHandler :: Handler b Api ()
otherHandler = metod Get doActualStuff <|> metod Get doMoreActualStuff

现在,如果我有 100 条不同的路线,并且我想将 header 添加到所有路线中。我必须为所有这些路由编写一个拦截器函数。如果我想更改 header 我必须修改所有 100 个拦截器函数。

有没有简单的方法?

根据 sjakobi 提供的提示,我明白了。这可以像这样完成:

apiRoutes :: [(ByteString, Handler b Api ())]
apiRoutes = map (mapSecond (addHeaders >>))
[("status",  addHeader)]


addHeaders :: Handler b Api ()
addHeaders = do
   modifyResponse (setHeader "Content-Type" "application/json")
   modifyResponse (setHeader "more-header" "more-header")

mapSecond :: (b -> c) -> (a,b) -> (a,c)
mapSecond f (a,b) = (a,f b)