我试图通过编写一个非常简单的会话管理器来理解中间件。
我需要SetCookie
在响应中添加标题。我查看了wai-extra
包裹,发现wai-session
.
我正在使用 wai-3.0.2,它似乎无法让我直接访问 Response 的类型构造函数,并且我找到的所有示例都使用模式匹配Response(..)
来添加标题。
你能为我指出正确的方向吗?
我试图通过编写一个非常简单的会话管理器来理解中间件。
我需要SetCookie
在响应中添加标题。我查看了wai-extra
包裹,发现wai-session
.
我正在使用 wai-3.0.2,它似乎无法让我直接访问 Response 的类型构造函数,并且我找到的所有示例都使用模式匹配Response(..)
来添加标题。
你能为我指出正确的方向吗?
编辑:Wai 3.0.3.0 版引入了一个与以下示例mapResponseHeaders
相同的辅助函数。mapHeader
这意味着该示例不再需要在Response
.
import Network.HTTP.Types (ResponseHeaders, Header)
import Network.Wai (Middleware, Response, mapResponseHeaders)
withHeader :: Header -> Middleware
withHeader h app req respond = app req $ respond . addHeader h
addHeader :: Header -> Response -> Response
addHeader h = mapResponseHeaders (\hs -> h:hs)
我有一些工作,并认为我理解它,但真的很想得到反馈和建议。我是 Haskell 的新手,这是我第一次使用 Wai。我最大的绊脚石是没有意识到应用程序类型在 Wai 3.0.0 中更改为延续传递样式。(文档非常清楚地说明了这一点;我只是在前 15 次阅读时错过了它。)
import Network.HTTP.Types (ResponseHeaders, Header)
import Network.Wai (Middleware)
import Network.Wai.Internal (Response(..))
withHeader :: Header -> Middleware
withHeader h app req respond = app req $ respond . addHeader h
mapHeader :: (ResponseHeaders -> ResponseHeaders) -> Response -> Response
mapHeader f (ResponseFile s h b1 b2) = ResponseFile s (f h) b1 b2
mapHeader f (ResponseBuilder s h b) = ResponseBuilder s (f h) b
mapHeader f (ResponseStream s h b) = ResponseStream s (f h) b
mapHeader _ r@(ResponseRaw _ _) = r
addHeader :: Header -> Response -> Response
addHeader h = mapHeader (\hs -> h:hs)
我没有尝试修改 a 的标题ResponseRaw
,因为我不知道怎么做。
我不确定addHeader
部分应用是否足够清楚,并且是传递给内部应用程序的延续函数。这种形式可能更清晰(或更丑陋):
withHeader h app req respond = app req $ \resp -> respond $ addHeader h resp
mapHeader
我从wai-session复制,但添加了 ResponseRaw 的案例。