http-conduit-downloader 1.0.12 → 1.0.13
raw patch · 2 files changed
+64/−6 lines, 2 filesdep +http-client
Dependencies added: http-client
Files
Network/HTTP/Conduit/Downloader.hs view
@@ -1,5 +1,5 @@ {-# LANGUAGE OverloadedStrings, BangPatterns, RecordWildCards, ViewPatterns,- DoAndIfThenElse, PatternGuards #-}+ DoAndIfThenElse, PatternGuards, ScopedTypeVariables #-} {-# OPTIONS_GHC -fwarn-incomplete-patterns #-} -- | HTTP downloader tailored for web-crawler needs. --@@ -79,7 +79,8 @@ import qualified Network.TLS as TLS import qualified Network.HTTP.Types as N import qualified Network.HTTP.Conduit as C-import qualified Network.Connection as C+import qualified Network.Connection as NC+import Network.HTTP.Client.Internal (makeConnection, Connection) import qualified Control.Monad.Trans.Resource as C import qualified Data.Conduit as C import System.Timeout.Lifted@@ -90,6 +91,7 @@ import System.Locale import Data.Time.Clock import Data.Time.Clock.POSIX+import System.IO -- | Result of 'download' operation. data DownloadResult@@ -130,11 +132,68 @@ { dsUserAgent = "Mozilla/5.0 (compatible; HttpConduitDownloader/1.0; +http://hackage.haskell.org/package/http-conduit-downloader)" , dsTimeout = 30 , dsManagerSettings =- C.mkManagerSettings (C.TLSSettingsSimple True False False) Nothing+ (C.mkManagerSettings tls Nothing)+ { C.managerTlsConnection =+ -- IO (Maybe HostAddress -> String -> Int -> IO Connection)+ getTlsConnection (Just tls)+ } -- C.def { C.managerCheckCerts = -- \ _ _ _ -> return TLS.CertificateUsageAccept } , dsMaxDownloadSize = 10*1024*1024 }+ where tls = NC.TLSSettingsSimple True False False++-- Network.HTTP.Client.TLS.getTlsConnection with ability to use HostAddress+-- since Network.Connection.connectTo uses Network.connectTo that uses+-- getHostByName (passed HostAddress is ignored)+getTlsConnection :: Maybe NC.TLSSettings+-- -> Maybe NC.SockSettings+ -> IO (Maybe NS.HostAddress -> String -> Int -> IO Connection)+getTlsConnection tls = do+ context <- NC.initConnectionContext+ return $ \ mbha host port -> do+ cf <- case mbha of+ Nothing -> return $ NC.connectTo context+ Just ha -> do+ handle <- openSocketHandle ha port+ return $ NC.connectFromHandle context handle+ conn <- cf $ NC.ConnectionParams+ { NC.connectionHostname = host+ , NC.connectionPort = fromIntegral port+ , NC.connectionUseSecure = tls+ , NC.connectionUseSocks = Nothing -- sock+ }+ convertConnection conn+ where+ convertConnection conn = makeConnection+ (NC.connectionGetChunk conn)+ (NC.connectionPut conn)+ -- Closing an SSL connection gracefully involves writing/reading+ -- on the socket. But when this is called the socket might be+ -- already closed, and we get a @ResourceVanished@.+ (NC.connectionClose conn `E.catch` \(_ :: E.IOException) -> return ())++-- slightly modified Network.HTTP.Client.Connection.openSocketConnection+openSocketHandle :: NS.HostAddress+ -> Int -- ^ port+ -> IO Handle+openSocketHandle ha port = do+ let addr = NS.AddrInfo+ { NS.addrFlags = []+ , NS.addrFamily = NS.AF_INET+ , NS.addrSocketType = NS.Stream+ , NS.addrProtocol = 6 -- tcp+ , NS.addrAddress = NS.SockAddrInet (toEnum port) ha+ , NS.addrCanonName = Nothing+ }+ E.bracketOnError+ (NS.socket (NS.addrFamily addr) (NS.addrSocketType addr)+ (NS.addrProtocol addr))+ (NS.sClose)+ (\sock -> do+ NS.setSocketOption sock NS.NoDelay 1+ NS.connect sock (NS.addrAddress addr)+ NS.socketToHandle sock ReadWriteMode) -- | Keeps http-conduit 'Manager' and 'DownloaderSettings'. data Downloader
http-conduit-downloader.cabal view
@@ -1,7 +1,6 @@ cabal-version: >= 1.6 name: http-conduit-downloader-version: 1.0.12-copyright: Vladimir Shabanov 2013+version: 1.0.13 author: Vladimir Shabanov <vshabanoff@gmail.com> maintainer: Vladimir Shabanov <vshabanoff@gmail.com> homepage: https://github.com/bazqux/http-conduit-downloader@@ -39,7 +38,7 @@ library build-depends:- base == 4.*, http-conduit >= 2.0.0.4, connection, network, zlib, lifted-base,+ base == 4.*, http-conduit >= 2.0.0.4, http-client, connection, network, zlib, lifted-base, conduit, resourcet, http-types, tls, data-default, bytestring, mtl, time, old-locale