Веб-сервис Warp с долгоживущим ресурсом (дескриптор файла) - PullRequest
1 голос
/ 27 марта 2012

Я пытаюсь понять, как написать веб-сервис, используя деформацию с долгоживущим ресурсом, доступ к которому я хочу получить из всех моих запросов (т. Е. Я хочу, чтобы ресурс существовал на протяжении всего срока службы сервера, а не на запрос).Я предполагаю, что это использование для ResourceT, но я не уверен, как я на самом деле это делаю.

Мое конкретное использование заключается в том, что я хочу показать дескриптор файла, который я в настоящее время обернут в состояниемонада.Я рад изменить этот подход, если это не имеет смысла при использовании деформации и ResourceT.Раннюю версию этого кода можно увидеть в обзоре кода: https://codereview.stackexchange.com/questions/9177/my-simple-haskell-key-value-file-store

Заранее спасибо,

Matt

1 Ответ

4 голосов
/ 27 марта 2012

Самый очевидный способ - передать дескриптор файла в качестве параметра в Приложение.

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)
...