2012-11-07 4 views
8

저는 Haskell 초보자입니다.Haskell 및 Yesod에서 오류 상태 반환

Webdav 서버를 Yesod Framework으로 작성하려고 시도했으며 Apache Tomcat 7 소스 코드에서 WebdavServlet으로 모델링했습니다. 내 기능 중 하나에서 오류를 반환하는 문제가 발생했습니다.

내 webdav 서비스는 호출자가 보낸 Accept 헤더의 값에 따라 XML 또는 JSON을 반환해야합니다. 내 서비스의 반환 값, 특히 lockWebdavR 함수로이 데이터 유형을 사용하고

import Yesod 

data RepXmlJson = RepXmlJson RepXml RepJson 

instance HasReps RepXmlJson where 
    chooseRep (RepXmlJson (RepXml xml) (RepJson json)) = chooseRep 
    [ (typeXml, xml) 
    , (typeJson, json) 
    ] 

: 나는 RepXmlJson라는 데이터 유형을 정의. 리소스가 현재 잠겨 있으면 423 (잠김) 상태를 반환하려고합니다. 내 코드는 다음과 같습니다

import qualified Data.ByteString as B 
import qualified Data.Map  as M 
import qualified Data.Text  as T 
import qualified Network.Wai  as W 

mkYesodSub "Webdav" [] [parseRoutes| 
/WebdavR COPY DELETE LOCK MKCOL MOVE OPTIONS PROPFIND PROPPATCH PUT UNLOCK 
|] 

type WebdavHandler yesod = GHandler Webdav yesod 

webdavLocked423 :: Status 
webdavLocked423 = Status 423 "Locked" 

isLockedRequest :: Yesod master => Request -> WebdavHandler master Bool 
-- isLockedRequest definition omitted for brevity 

lockWebdavR :: Yesod master => WebdavHandler master RepXmlJson 
lockWebdavR = do 
    request <- getRequest 
    locked <- isLockedRequest request 
    if locked 
    then return $ 
     W.responseLBS webdavLocked423 [("Content-Type", "text/plain")] "" 
    else return undefined 

나는 다음과 같은 오류가 점점 오전 : 나는 책 "Developing Web Applications with Haskell and Yesod"을 통해 검색

Webdav.hs:94:10: 
    Couldn't match expected type `RepXmlJson' 
       with actual type `W.Response' 
    Expected type: GHandler Webdav master RepXmlJson 
     Actual type: GHandler Webdav master W.Response 
    In the expression: 
     return 
     $ W.responseLBS webdavLocked423 [("Content-Type", "text/plain")] "" 
    In a stmt of a 'do' block: 
     if locked then 
      return 
      $ W.responseLBS webdavLocked423 [("Content-Type", "text/plain")] "" 
     else 
      return undefined 

을하지만, 올바른 유형의 오류를 반환의 예를 찾을 수 없습니다 (Rep...) .

어떻게 올바른 오류 상태로 RepXmlJson을 만들려면 어떻게해야합니까? 핸들러의

답변

5

정상 완료는 항상 200 상태 코드가 발생합니다. 이를 무시하려면 다른 방식으로 응답을 보내야합니다. 귀하의 경우 sendResponseStatus을 시도해보십시오. 다른 가능성은 sendWaiResponseredirectWith이 될 것이지만 후자가 유용 할 것 같지는 않습니다.

+0

나는'sendResponseStatus webdavLocked423 $ RepXmlJson (RepXml "") (RepJson "")'에 반환 값을 변경하고 그것을 컴파일합니다. 감사. 좋은 책 이네. – Ralph

+0

'invalidArgs [ "refs"를 해석 할 수 없습니다 "]를 사용하여 400 오류로 응답합니다. 그러나 내 메시지가 어떻게되는지 이해하지 못한다 ... – cies