2017-03-09 4 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 { .. } 

난 내 자신의 자바 스크립트 콘텐츠 유형을 만드는 시도했습니다,하지만 MimeRenderer 나 예외를 던질 수 없습니다. 지금까지 가지고있는 유일한 아이디어는 "Accept"헤더를 캡처하여 처리기 내에서 303 또는 404 중 하나를 던집니다. 그러나 실제 클라이언트 응용 프로그램에 대해 아무 것도 알지 못하기 때문에 처리기가 총체적입니다.

처리 방법이 더 깨끗합니까?

답변

1

당신이 물어 본 것에 정확히 답하지는 못했지만, 더 큰 그림에서 이것은 서로 다른 두 경로에 대한 유스 케이스처럼 들리며 공통된 구현 비트가 공유됩니다.

+0

아, 좋은 지적입니다. 나는 워크 플로우를 데이터 유형과 융합 해왔다. –