2017-03-09 10 views
1

コンテキストの場合、これは認証の状況です。私のアプリケーションでは、クライアントが認証されていない場合、アプリケーションは明らかに適切に応答する必要があります。サーバーに呼び出されるアプリケーションのタイプに基づいて異なる応答を選択したいときに問題が発生します。サーバントで、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のいずれかを投げることです。しかし、ハンドラは実際のクライアントアプリケーションについて何も知っていないはずなので、それは総体です。

これを処理するクリーナーの方法はありますか?

答えて

1

あなたが尋ねたものに正確には答えていませんが、大きな画像では、2つの別々のルートのユースケースのように聞こえ、共通の実装ビットが共有されています。

+0

ああ、良い点。私はデータ型とワークフローを融合させてきましたが、それは本当に正しくありません。 –

関連する問題