1

すべてのリクエストからアクセスしたい長寿命のリソースを持つワープを使用してWebサービスを作成する方法を理解しようとしています(つまり、リクエストごとではなく、サーバーの存続期間中リソースが存在するようにしたい)。これは ResourceT の使用であると想定していますが、実際にこれをどのように行うかはわかりません。

私の特定の用途は、現在状態モナドにラップされているファイルハンドルを公開したいということです。warp と ResourceT を使用するときにこれが意味をなさない場合は、喜んでこのアプローチを変更します。このコードの初期バージョンは、コード レビューで確認できます: https://codereview.stackexchange.com/questions/9177/my-simple-haskell-key-value-file-store

前もって感謝します、

マット

4

1 に答える 1

4

最も明白な方法は、ファイル ハンドルをパラメーターとしてアプリケーションに渡すことです。

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)
于 2012-03-27T09:01:54.820 に答える