2016-06-19 12 views
0

In Network.HTTP.Conduit verwendet, hat diese Art requestBodySourceIO signature:Die Verfolgung der Länge, wenn requestBodySourceIO

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

erstes Argument Körperlänge in Bytes. Was ist ein guter Weg, um es die Quelle von ByteString zu übergeben, während die laufende Summe der Bytestring bis jetzt gefüttert verfolgt? Dies wird helfen, am Ende der Anfrage zu bestimmen, wo die Länge, die an sie übergeben wurde, der Gesamtlänge der Bytestring entspricht, die an sie übergeben wurde.

Antwort

1

Sie werden eine Quelle für die Bytes haben - rufen Sie diese source. die Quelle zu konstruieren Sie requestBodySourceIO passieren werden, hängen nur ein Leitungssegment, das den Überblick über die Länge hält:

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

Und dann requestBodySourceIO mit mySource nennen.

+0

hmm, 'requestBodySourceIO' ist eine vordefinierte Funktion. Wird es hier nicht irgendwie überschrieben, oder schlägst du vor, einen neuen zu schreiben? Außerdem haben wir hier zu sinken, aber wie erhalten wir die Größe im obigen Code? Es scheint nur oben in 'requestBodySourceIO' verbraucht zu werden (vorausgesetzt, es kann irgendwie überschrieben werden), die' requestBody' zurückgeben muss. – Sal

+0

Nun, das macht mehr Sinn! Ich muss immer noch diese Tippschecks machen. Davor fehlt mir noch ein Teil dieses Puzzles - wir übergeben 'mySource' an' requestBodySourceIO', was 'requestBody' zurückgibt. Wie erhalten wir die Länge daraus, nachdem 'requestBodySourceIO' beendet ist (was die Länge nicht zurückgibt)? Können wir parallel noch eine 'runConduit' auf' mySource' laufen lassen (eine Art 'T' Split im Stream, in dem wir diesen Stream an zwei verschiedene Funktionen weiterleiten)? Was wird ein effizienter Weg sein, dies zu tun? – Sal

+0

Sie können die Antwort auch mit der endgültigen Version überschreiben, anstatt sie anzuhängen, wenn Sie möchten. – Sal

Verwandte Themen