wai を使用して、非常に単純な「エコー」Web アプリケーションを作成しようとしています。私がやりたいのは、POST されたデータを返信することだけです (メソッドは本当に気にしませんが、curl を使用しており、curl は POST を使用しているので、それが目的です)。私の簡単なWebサーバーはこれです:
import Network.Wai
import Network.HTTP.Types (status200)
import Network.Wai.Handler.Warp (run)
import Control.Monad.Trans ( liftIO )
import Blaze.ByteString.Builder.ByteString (fromByteString)
import qualified Data.Conduit.List as CondList
import Data.Conduit ( ($$), ($=), Flush(Chunk) )
application req = do
let src = requestBody req $= CondList.map (Chunk ∘ fromByteString)
return $ ResponseSource status200 [("Content-Type", "text/plain")] src
main = run 3000 application
私が期待していたのは、基本的にリクエストボディをレスポンスボディに結びつけることcurl --data @/usr/share/dict/words localhost:3000
です。それは私の単語ファイルを私に吐き返します。代わりに、空の本体が返されます。「-v」を指定して curl を実行すると、アプリが「200 OK」とデータなしで応答していることがわかります。ここで何が間違っているのかわかりません。
アプリケーション関数を次のように置き換えると:
_ ← requestBody req $$ CondList.mapM_ (liftIO ∘ print)
return $ responseLBS status200 [("Content-Type", "text/plain")] "Hello world\n"
OverloadedStrings プラグマを追加して「Hello World」部分が機能するようにすると、アプリがリクエスト本文全体を stdout に出力するので、curl がデータを適切に送信していることがわかります。また、curl stdout に「Hello World」が出力されるので、curl が期待どおりに機能することがわかります。requestBody を ResponseSource に結び付けているところで何か間違ったことをしているに違いありませんが、表示されません。