私はhaskell warp http
serverのパフォーマンス(1秒あたりのリクエスト)をテストしたいと思います。私はhaskellについて何も知らない。私は以下のerlangコードと同じことをしたい:
- ディスクから “page.txt”を1回だけ読み込みます(asciiファイル100kB)
- すべてのリクエストでそのファイルの内容を配信しますが、ディスクからリロードすることはありません。
どのようにしてこれを行うには?
アーラン:
-module(test).
-export([start/0]).
start() ->
{ok, Bin} = file:read_file("page.txt"),
misultin:start_link([{port, 3000}, {loop, fun(Req) -> Req:ok(Bin) end}]).
私はこのhaskellの例題に遭遇し、ファイルからロードされたコンテンツを使用するように変更する必要があります。
ハスケル:
{-# LANGUAGE OverloadedStrings #-}
import Network.Wai
import Network.Wai.Handler.Warp
import Blaze.ByteString.Builder (fromByteString)
import Network.HTTP.Types (status200)
main = run 3000 $ const $ return $ ResponseBuilder
status200
[("Content-Type", "text/plain"), ("Content-Length", "4")]
$ fromByteString "TEST"
助けてください! 🙂
ベストアンサー
Data.ByteString
から hGetContents
を使用してファイルの内容を厳密な ByteString
として読み込み、それをBlazeの
fromByteString
に渡します。 >:
{-# LANGUAGE OverloadedStrings #-}
import Network.Wai
import Network.Wai.Handler.Warp
import Blaze.ByteString.Builder (fromByteString)
import Network.HTTP.Types (status200)
import System.IO (withBinaryFile, IOMode (..))
import Data.ByteString (hGetContents)
main = do
contents <- withBinaryFile "full/path/to/page.txt" ReadMode hGetContents
run 3000 $ const $ return $ ResponseBuilder
status200
[("Content-Type", "text/plain"), ("Content-Length", "4")]
$ fromByteString contents
私はそれをWindows上の相対パスで動作させることはできませんでしたが、それは単にHaskell-fuの欠如かもしれません。