2016-06-19 1 views
0

を使用して、requestBodySourceIOこの型シグネチャを有する:保管トラック<code>Network.HTTP.Conduit</code>でrequestBodySourceIO

Prelude Network.HTTP.Conduit Data.Conduit Control.Monad.Trans.Resource> :t requestBodySourceIO 
requestBodySourceIO 
    :: GHC.Int.Int64 
    -> Source IO Data.ByteString.Internal.ByteString -> RequestBody 

最初の引数は、バイト単位体の長さです。これまでにBytestringの実行合計を追跡しながら、ByteStringのソースを渡すのは良い方法ですか?これは、リクエストの最後に渡された長さが、それに渡されたBytestringの全長と一致するかどうかを判断するのに役立ちます。

答えて

1

バイトのソースがあります。これはsourceと呼ばれます。

mySource = source =$= processor 0 
    where processor sz = do bs <- await 
          let sz' = sz + BS.length bs 
          ... 
          processor sz' 

そしてmySourcerequestBodySourceIOを呼び出す:あなただけの長さを追跡するコンジットセグメントを追加し、requestBodySourceIOに渡すしようとしているソースを構築する 。

+0

hmm、 'requestBodySourceIO'はあらかじめ定義された関数です。それは何とかここに上書きされないのですか、新しいものを書くことを提案していますか?また、ここでシンクしていますが、上記のコードでどのようにサイズを取得するのですか?上記の 'requestBodySourceIO'内で消費されているようです(何とか上書きできると仮定して)、' requestBody'を返す必要があります。 – Sal

+0

さて、それは理にかなっています!私はまだこのtypechecksを確認する必要があります。その前に、私のためのこのパズルの欠けているもの - 私たちは 'requestBody'を返す' requestBodySourceIO'に 'mySource'を渡します。 'requestBodySourceIO'が終了した後に長さを取得するにはどうしたらいいですか(長さは返されません)? 'mySource'に対して別の' runConduit'を並行して実行することはできますか(そのストリームを2つの異なる関数に渡す何らかの「T」分割)?これを行う効率的な方法は何でしょうか? – Sal

+0

また、必要に応じて、追加する代わりに最終バージョンで回答を上書きすることもできます。 – Sal

関連する問題