http-enumerator 0.7.0 → 0.7.1
raw patch · 2 files changed
+29/−9 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Network.HTTP.Enumerator: RequestBodyEnumChunked :: (Enumerator Builder m ()) -> RequestBody m
Files
- Network/HTTP/Enumerator.hs +28/−8
- http-enumerator.cabal +1/−1
Network/HTTP/Enumerator.hs view
@@ -109,7 +109,7 @@ import Data.Enumerator ( Iteratee (..), Stream (..), catchError, throwError , yield, Step (..), Enumeratee, ($$), joinI, Enumerator, run_- , returnI, (>==>), enumEOF+ , returnI, (>==>), (>>==), continue, checkDone, enumEOF ) import qualified Data.Enumerator.List as EL import Network.HTTP.Enumerator.HttpParser@@ -122,6 +122,7 @@ import Codec.Binary.UTF8.String (encodeString) import qualified Blaze.ByteString.Builder as Blaze import Blaze.ByteString.Builder.Enumerator (builderToByteString)+import Blaze.ByteString.Builder.HTTP (chunkedTransferEncoding, chunkedTransferTerminator) import Data.Monoid (Monoid (..)) import qualified Network.HTTP.Types as W import qualified Data.CaseInsensitive as CI@@ -324,11 +325,17 @@ -- | When using the 'RequestBodyEnum' constructor and any function which calls -- 'redirectIter', you must ensure that the 'Enumerator' can be called multiple -- times.+--+-- The 'RequestBodyEnumChunked' will send a chunked request body, note+-- that not all servers support this. Only use 'RequestBodyEnumChunked'+-- if you know the server you're sending to supports chunked request+-- bodies. data RequestBody m = RequestBodyLBS L.ByteString | RequestBodyBS S.ByteString | RequestBodyBuilder Int64 Blaze.Builder | RequestBodyEnum Int64 (Enumerator Blaze.Builder m ())+ | RequestBodyEnumChunked (Enumerator Blaze.Builder m ()) -- | Add a Basic Auth header (with the specified user name and password) to the@@ -407,18 +414,22 @@ (True, True) -> withSslProxyConn (checkCerts host) host port (contentLength, bodyEnum) = case requestBody of- RequestBodyLBS lbs -> (L.length lbs, enumSingle $ Blaze.fromLazyByteString lbs)- RequestBodyBS bs -> (fromIntegral $ S.length bs, enumSingle $ Blaze.fromByteString bs)- RequestBodyBuilder i b -> (i, enumSingle b)- RequestBodyEnum i enum -> (i, enum)+ RequestBodyLBS lbs -> (Just $ L.length lbs, enumSingle $ Blaze.fromLazyByteString lbs)+ RequestBodyBS bs -> (Just $ fromIntegral $ S.length bs, enumSingle $ Blaze.fromByteString bs)+ RequestBodyBuilder i b -> (Just $ i, enumSingle b)+ RequestBodyEnum i enum -> (Just i, enum)+ RequestBodyEnumChunked enum -> (Nothing, \step -> enum $$ joinI $ chunkIt step) hh | port == 80 && not secure = host | port == 443 && secure = host | otherwise = host `mappend` S8.pack (':' : show port)+ contentLengthHeader (Just contentLength') =+ if method `elem` ["GET", "HEAD"] && contentLength' == 0+ then id+ else (:) ("Content-Length", S8.pack $ show contentLength')+ contentLengthHeader Nothing = (:) ("Transfer-Encoding", "chunked") headers' = ("Host", hh)- : (if method `elem` ["GET", "HEAD"] && contentLength == 0- then id- else (:) ("Content-Length", S8.pack $ show contentLength))+ : (contentLengthHeader contentLength) (("Accept-Encoding", "gzip") : requestHeaders) requestHeaders' = Blaze.fromByteString method@@ -491,6 +502,15 @@ catchParser "End of chunk newline" iterNewline chunkedEnumeratee k' chunkedEnumeratee step = return step++chunkIt :: Monad m => Enumeratee Blaze.Builder Blaze.Builder m a+chunkIt = checkDone $ continue . step+ where+ step k EOF = k (Chunks [chunkedTransferTerminator]) >>== return+ step k (Chunks []) = continue $ step k+ step k (Chunks xs) = k (Chunks [chunkedTransferEncoding $ mconcat xs])+ >>== chunkIt+ takeLBS :: MonadIO m => Int -> Enumeratee S.ByteString S.ByteString m a takeLBS 0 step = return step
http-enumerator.cabal view
@@ -1,5 +1,5 @@ name: http-enumerator-version: 0.7.0+version: 0.7.1 license: BSD3 license-file: LICENSE author: Michael Snoyman <michael@snoyman.com>