在snap框架中为所有响应添加标头

时间:2017-01-18 13:45:29

标签: haskell haskell-snap-framework

标题总结了它。我想在snap中为我的所有响应添加标题。 我可以为我的每个路由添加一个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条不同的路线,我想向它们添加标题。我必须为所有这些路线编写一个截取功能。如果我想更改标题,我必须修改所有100个截取函数。

有简单的简单方法吗?

1 个答案:

答案 0 :(得分:1)

有了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)