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

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

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

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

Matt

1 ответ

Решение

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

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)
Другие вопросы по тегам