2012-11-07 16 views
8

私はHaskell初心者です。HaskellとYesodのエラーステータスの返信

WebdavサーバをYesod Frameworkで作成しようとしており、Apache Tomcat 7のソースコードのWebdavServletの後にモデル化しました。私は私の機能の1つからエラーを返す問題にぶつかってきました。

私の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 

私は、次のエラーを取得しています:

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 

私は本"Developing Web Applications with Haskell and Yesod"経由で検索、しかし、適切な型(Rep...)のエラーを返すの例を見つけることができません。

RepXmlJsonを正しいエラーステータスで作成するにはどうすればよいですか?

答えて

5

ハンドラを正常に完了すると、常にステータスコード200が返されます。それを無効にするには、別の方法で応答を送信する必要があります。あなたの場合、sendResponseStatusを試すことができます。他の可能性はsendWaiResponseredirectWithですが、私は後者が役に立つとは思わないでしょう。

+0

戻り値を 'sendResponseStatus webdavLocked423 $ RepXmlJson(RepXml" ")(RepJson" ")'に変更し、コンパイルします。ありがとう。ところで、素敵な本。 – Ralph

+0

私は 'invalidArgs [" refs "を解析できませんでした"]を使用して400エラーで応答します。しかし、私のメッセージに何が起こるのか理解していない... – cies

関連する問題