3

我试图通过编写一个非常简单的会话管理器来理解中间件。

我需要SetCookie在响应中添加标题。我查看了wai-extra包裹,发现wai-session.

我正在使用 wai-3.0.2,它似乎无法让我直接访问 Response 的类型构造函数,并且我找到的所有示例都使用模式匹配Response(..)来添加标题。

你能为我指出正确的方向吗?

4

1 回答 1

6

编辑: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 的案例。

于 2014-11-02T04:57:33.470 回答