使用长期资源(文件句柄)扭曲Web服务

时间:2012-03-27 08:40:06

标签: haskell yesod conduit haskell-wai haskell-warp

我正在尝试了解如何使用warp编写Web服务,该warp具有我希望从我的所有请求中访问的长期资源(即我希望资源在服务器的生命周期中存在,而不是按请求)。我假设这是ResourceT的用途,但我不确定我是如何实现这一点的。

我的特殊用途是我想要公开一个文件句柄,我目前已经将其包含在状态monad中。如果在使用warp和ResourceT时没有意义,我很乐意改变这种方法。可以在代码审核中看到此代码的早期版本:https://codereview.stackexchange.com/questions/9177/my-simple-haskell-key-value-file-store

提前致谢,

马特

1 个答案:

答案 0 :(得分:4)

最明显的方法是将文件句柄作为参数传递给Application。

import Control.Monad.Trans (liftIO)
import Data.ByteString.Lazy as Bl
import Network.HTTP.Types
import Network.Wai
import Network.Wai.Handler.Warp as Warp
import System.IO

doSomethingWithAFileHandle :: Handle -> IO ()
doSomethingWithAFileHandle =
  undefined -- insert your logic here

app :: Handle -> Application
app h req = do
  let headers = []
      body    = Bl.empty

  liftIO $ doSomethingWithAFileHandle h

  return $! responseLBS ok200 headers body

main :: IO ()
main =
  -- get some file handle
  withBinaryFile "/dev/random" ReadMode $ \ h ->

    -- and then partially apply it to get an Application
    Warp.run 3000 (app h)