非常に単純なセッション マネージャーを作成して、ミドルウェアを理解しようとしています。
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)
方法がわからなかったため、 のヘッダーを変更しようとはしResponseRaw
ませんでした。
addHeader
部分的に適用され、内部アプリケーションに渡される継続関数であることが十分に明確かどうかはわかりません。この形式は、より明確 (または醜い) かもしれません。
withHeader h app req respond = app req $ \resp -> respond $ addHeader h resp
wai-sessionmapHeader
からコピーしましたが、ResponseRaw のケースを追加しました。