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 +26/−0
- Setup.lhs +3/−0
- http-client-streams.cabal +29/−0
- src/System/IO/Streams/HTTP.hs +117/−0
+ 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 #-}+