2010-11-30 8 views
3

私はMochiwebを探していましたが、ソケットを通して要求を受け取っている間に本文を読み取る方法が見つかりません。Erlangで受信したHTTP要求の本文を読み取る

私はMochiwebに限らず、他のHTTPライブラリであればいいです。

私はHTTPリクエストを受信して​​いる間にボディ/ヘッダーを読むことができるこの方法で試しましたが、手動でレスポンスを処理し、さらにリクエストを処理する必要があります。溶液。

私の意図は、大きなボディでのリクエストを受け取り、フルボディの受信を待って読み込み/処理を開始することではありません。

答えて

3

mochiwebを使用すると、Req:stream_body/3を使用してリクエストボディのチャンクを折り畳むことができます。 チャンクハンドラ関数を2番目の引数として想定しています。このハンドラは、 {ChunkSize, BinaryData}で呼び出され、ソケットから受信されるごとにすべてのチャンクの状態が呼び出されます。

例(チャンクの[逆転]リストの取得):

MaxChunkSize = 100, 
InitialState = [], 
ChunkHandler = fun ({_Size, Bin}, State) -> [Bin | State] end, 
List = Req:stream_body(MaxChunkSize, ChunkHandler, InitialState), 
... 
+0

これは、定義された要求ハンドラ内で行われなければなりませんか?しかし、リクエスト・ハンドラは、フル・リクエストが受信されたときに呼び出されます。そうではありませんか?私は 'Req:stream_body(...)'がソケットを通して到着している間に本体をどのように読み込むのか分かりません。私は何かに間違っていなければならないが、どこを知らない。 – Ricardo

+0

要求ハンドラは、ヘッダーが読み込まれるとすぐに、かなり早く呼び出されます。ハンドラの中で 'Req:recv_body/0'を使って完全なリクエストを受け取るか、' Req:stream_body/3'を使ってリクエストすることができます。 'stream_body'の実装は、ソケットからチャンクでデータを読み込んでチャンクハンドラ関数に渡します。私を信じて、それは動作します! –

+0

OK、それは意味があります。あなたの助けを借りてフェリックスに感謝します。 – Ricardo

関連する問題