簡體   English   中英

在Haskell WAI中,如何將標題添加為中間件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM