Веб-сервис 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)