상황에 따라 인증 상황입니다. 내 응용 프로그램에서 클라이언트가 인증되지 않으면 응용 프로그램이 분명히 적절하게 응답해야합니다. 문제는 서버에 호출하는 응용 프로그램의 유형에 따라 다른 응답을 선택하려고 할 때 발생합니다.서번트에서는 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 { .. }
난 내 자신의 자바 스크립트 콘텐츠 유형을 만드는 시도했습니다,하지만 MimeRenderer 나 예외를 던질 수 없습니다. 지금까지 가지고있는 유일한 아이디어는 "Accept"헤더를 캡처하여 처리기 내에서 303
또는 404
중 하나를 던집니다. 그러나 실제 클라이언트 응용 프로그램에 대해 아무 것도 알지 못하기 때문에 처리기가 총체적입니다.
처리 방법이 더 깨끗합니까?
아, 좋은 지적입니다. 나는 워크 플로우를 데이터 유형과 융합 해왔다. –