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)

方法がわからなかったため、 のヘッダーを変更しようとはしResponseRawませんでした。

addHeader部分的に適用され、内部アプリケーションに渡される継続関数であることが十分に明確かどうかはわかりません。この形式は、より明確 (または醜い) かもしれません。

withHeader h app req respond = app req $ \resp -> respond $ addHeader h resp

wai-sessionmapHeaderからコピーしましたが、ResponseRaw のケースを追加しました。

于 2014-11-02T04:57:33.470 に答える