我是一个 Haskell 新手。
我正在尝试写一个小的Webdav服务器使用 Yesod Framework并仿照WebdavServlet
在 Apache Tomcat 7 源代码中。我遇到了从我的一个函数返回错误的问题。
我的 webdav 服务应该返回 XML 或 JSON,这取决于 Accept
的值。调用者发送的 header 。我定义了一个名为 RepXmlJson
的数据类型:
import Yesod
data RepXmlJson = RepXmlJson RepXml RepJson
instance HasReps RepXmlJson where
chooseRep (RepXmlJson (RepXml xml) (RepJson json)) = chooseRep
[ (typeXml, xml)
, (typeJson, json)
]
我使用此数据类型作为我的服务的返回值,特别是 lockWebdavR
功能。如果资源当前被锁定,我正在尝试返回状态 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
具有正确的错误状态?
最佳答案
处理程序的正常完成总是导致 200 状态代码。要覆盖它,您必须以其他方式发送响应。在您的情况下,您可以尝试 sendResponseStatus
.其他可能性是 sendWaiResponse
和 redirectWith
,尽管我怀疑后者会有用。
关于haskell - 在 Haskell 和 Yesod 中返回错误状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13269891/