[英]In Haskell WAI, how do I add headers as Middleware?
我試圖通過編寫一個非常簡單的會話管理器來了解中間件。
我需要在響應中添加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)
我沒有嘗試修改ResponseRaw
標頭,因為我無法弄清楚如何。
我不確定addHeader
是否已部分應用並且是傳遞給內部Application的延續函數。 這種形式可能更清晰(或更丑):
withHeader h app req respond = app req $ \resp -> respond $ addHeader h resp
我從wai-session復制了mapHeader
,但為ResponseRaw添加了案例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.