コンテキストの場合、これは認証の状況です。私のアプリケーションでは、クライアントが認証されていない場合、アプリケーションは明らかに適切に応答する必要があります。サーバーに呼び出されるアプリケーションのタイプに基づいて異なる応答を選択したいときに問題が発生します。サーバントで、Acceptヘッダーに基づいて例外を選択するにはどうすればよいですか?
server = Header "Cookie" (AuthToken Unverified)
:> "api" :> "history" :> Get '[HTML, JSON] HistoryPage
ので、HTML応答はCGIアプリのために次のようになります。ここでは
はルートの一例です。一般に、認証ページをレンダリングするか、ユーザーを認証ページに誘導するために303を投げます。しかし、JSONレスポンスはJavascriptアプリケーションのためのものであり、Javascriptには他の認証方法があるため、単に404を返すだけです。
は、ここに私のトップレベルのハンドラである:
newtype WebM a = WebM (ReaderT Context (ExceptT WebExc IO) a)
data WebExc = OtherExceptionTypes
| AppUnauthorized
runWeb :: Context -> WebM :~> Handler
runWeb [email protected]{..} = Nat $ \(WebM action) -> withExceptT trExc $ runReaderT action ctx
where
trExc :: WebExc -> ServantErr
trExc AppUnauthorized = err303 { .. }
私は自分のJavascriptのコンテンツタイプを作成しようとしましたが、MimeRendererは私が例外をスローすることはできません。これまで私が持っていた唯一のアイデアは、 "Accept"ヘッダーをキャプチャしてハンドラ内から303
または404
のいずれかを投げることです。しかし、ハンドラは実際のクライアントアプリケーションについて何も知っていないはずなので、それは総体です。
これを処理するクリーナーの方法はありますか?
ああ、良い点。私はデータ型とワークフローを融合させてきましたが、それは本当に正しくありません。 –