packages feed

http-client-streams (empty) → 0.1.0.0

raw patch · 4 files changed

+175/−0 lines, 4 filesdep +HsOpenSSLdep +basedep +bytestringsetup-changed

Dependencies added: HsOpenSSL, base, bytestring, http-client, http-client-openssl, io-streams, mtl, transformers

Files

+ LICENSE view
@@ -0,0 +1,26 @@+Copyright (c) 2014-2015, David Johnson+All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions+are met:++    * Redistributions of source code must retain the above copyright+          notice, this list of conditions and the following disclaimer.++    * Redistributions in binary form must reproduce the above+          copyright notice, this list of conditions and the following+                disclaimer in the documentation and/or other materials provided+                      with the distribution.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.lhs view
@@ -0,0 +1,3 @@+#!/usr/bin/env runhaskell+> import Distribution.Simple+> main = defaultMain
+ http-client-streams.cabal view
@@ -0,0 +1,29 @@+name:                http-client-streams+version:             0.1.0.0+synopsis:            http-client for io-streams supporting openssl+description:         Thin io-streams wrapper for http-client w/ openssl support+license:             BSD3+license-file:        LICENSE+author:              David Johnson+maintainer:          djohnson.m@gmail.com+copyright:           David Johnson (c) 2014+category:            Web, IO-Streams+build-type:          Simple+cabal-version:       >=1.10++library+  exposed-modules:     System.IO.Streams.HTTP+  hs-source-dirs:      src+  build-depends:       HsOpenSSL >= 0.11+                     , base >=4.7 && <4.8+                     , bytestring+                     , http-client+                     , http-client-openssl+                     , io-streams+                     , mtl+                     , transformers >= 0.4.2.0+  default-language:    Haskell2010++source-repository head+  type:     git+  location: https://github.com/dmjio/http-client-streams.git
+ src/System/IO/Streams/HTTP.hs view
@@ -0,0 +1,117 @@+-- | Here is an example GET request that streams the response body to standard+--   output:+--+-- > {-# LANGUAGE OverloadedStrings #-}+-- > module Main where+-- >  +-- > import           OpenSSL                ( withOpenSSL )+-- > import           OpenSSL.Session        ( context )+-- > import qualified System.IO.Streams as Streams+-- > import           System.IO.Streams.HTTP ( opensslManagerSettings+-- >                                         , parseUrl+-- >                                         , withManager+-- >                                         , withHTTP+-- >                                         , responseBody+-- >                                         )+-- >  +-- > ------------------------------------------------------------------------------+-- > -- | OpenSSL test+-- > main :: IO ()+-- > main = withOpenSSL $ do+-- >   let settings = opensslManagerSettings context+-- >   req <- parseUrl "https://google.com"+-- >   withManager settings $ \mgr ->+-- >     withHTTP req mgr $ \resp ->+-- >       Streams.supplyTo Streams.stdout (responseBody resp)+--+-- For non-streaming request bodies, study the 'RequestBody' type,+-- which also+-- accepts strict \/ lazy bytestrings++module System.IO.Streams.HTTP (+    -- * http-client+    -- $httpclient+    module Network.HTTP.Client+  , module Network.HTTP.Client.OpenSSL+    -- * io-streams Interface+  , withHTTP+  , streamN+  , stream+  ) where++import           Control.Applicative     ( (<$>) )+import           Control.Monad.IO.Class  ( liftIO )+import           Data.ByteString         ( ByteString )+import qualified Data.ByteString as B+import           Data.Int                ( Int64 )+import           Network.HTTP.Client+import           Network.HTTP.Client.OpenSSL++import           System.IO               ( stdout )+import           System.IO.Streams       ( InputStream+                                         , OutputStream+                                         , Generator+                                         )++import qualified System.IO.Streams as Streams+import           System.IO.Streams.ByteString++{- $httpclient+    This module is a thin @io-streams@ wrapper around the @http-client@ and+    @http-client-openssl@ libraries.++    Read the documentation in the "Network.HTTP.Client" module of the+    @http-client@ library to learn about how to:++    * manage connections using connection pooling,++    * use more advanced request\/response features,++    * handle exceptions, and:++    * manage cookies.++    @http-client-openssl@ provides support for TLS connections (i.e.+     HTTPS).+-}++------------------------------------------------------------------------------+-- | Send an HTTP 'Request' and wait for an HTTP 'Response'+withHTTP+    :: Request+    -> Manager+    -> (Response (InputStream ByteString) -> IO a)+    -> IO a+withHTTP r m k = withResponse r m k'+  where+    k' resp = do+      p <- (from . brRead . responseBody) resp+      k (resp { responseBody = p})+{-# INLINABLE withHTTP #-}++------------------------------------------------------------------------------+-- | Produce an InputStream from a streaming IO ByteString action+from :: IO ByteString -> IO (InputStream ByteString)+from io = Streams.makeInputStream $ do+            bs <- io+            return $ if B.null bs+              then Nothing+              else Just bs++------------------------------------------------------------------------------+-- | Stream body of request+to :: InputStream ByteString -> (IO ByteString -> IO ()) -> IO ()+to is f = f $ maybe B.empty id <$> Streams.read is++------------------------------------------------------------------------------+-- | Stream body of request+stream :: InputStream ByteString -> RequestBody+stream p = RequestBodyStreamChunked (to p)+{-# INLINABLE stream #-}++------------------------------------------------------------------------------+-- | Stream with N bytes exactly+streamN :: Int64 -> InputStream ByteString -> RequestBody+streamN n p = RequestBodyStream n (to p)+{-# INLINABLE streamN #-}+