haskell - 在 Haskell 和 Yesod 中返回错误状态

标签 haskell http-status-codes yesod

我是一个 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 .其他可能性是 sendWaiResponseredirectWith ,尽管我怀疑后者会有用。

关于haskell - 在 Haskell 和 Yesod 中返回错误状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13269891/

相关文章:

haskell - 使用 Yesod 高效上传大文件

variables - 如果你不能在 Haskell 中改变一个变量的值,你如何创建数据结构?

haskell - 比较列表中的所有元素 haskell

haskell - 为什么 Stack 选择 ghc 7.10,即使有 ghc8 的 lts?

rest - HTTP 状态,以防我不想支持一个或多个字段的搜索

haskell - 使用 esqueleto 计算行数

haskell - GHC(在 Linux 上)生成的 .hi 和 .o 文件是什么?

c# - HttpStatusCode 是任何 500 类型

http-status-codes - http2:421 错误定向请求状态代码示例

yesod - 干净地关闭 warp 服务器而不退出进程