http-client-tls (empty) → 0.2.0.0
raw patch · 5 files changed
+150/−0 lines, 5 filesdep +basedep +connectiondep +data-defaultsetup-changed
Dependencies added: base, connection, data-default, hspec, http-client, http-client-tls, http-types, network, tls
Files
- LICENSE +20/−0
- Network/HTTP/Client/TLS.hs +79/−0
- Setup.hs +2/−0
- http-client-tls.cabal +34/−0
- test/Spec.hs +15/−0
+ LICENSE view
@@ -0,0 +1,20 @@+The MIT License (MIT)++Copyright (c) 2013 Michael Snoyman++Permission is hereby granted, free of charge, to any person obtaining a copy of+this software and associated documentation files (the "Software"), to deal in+the Software without restriction, including without limitation the rights to+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of+the Software, and to permit persons to whom the Software is furnished to do so,+subject to the following conditions:++The above copyright notice and this permission notice shall be included in all+copies or substantial portions of the Software.++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ Network/HTTP/Client/TLS.hs view
@@ -0,0 +1,79 @@+{-# LANGUAGE ScopedTypeVariables #-}+-- | Support for making connections via the connection package and, in turn,+-- the tls package suite.+module Network.HTTP.Client.TLS+ ( tlsManagerSettings+ , mkManagerSettings+ , getTlsConnection+ ) where++import Data.Default+import Network.HTTP.Client+import Network.HTTP.Client.Internal+import Control.Exception+import qualified Network.Connection as NC+import Network.Socket (HostAddress)+import qualified Network.TLS as TLS++mkManagerSettings :: NC.TLSSettings+ -> Maybe NC.SockSettings+ -> ManagerSettings+mkManagerSettings tls sock = defaultManagerSettings+ { managerTlsConnection = getTlsConnection (Just tls) sock+ , managerRawConnection =+ case sock of+ Nothing -> managerRawConnection defaultManagerSettings+ Just _ -> getTlsConnection Nothing sock+ , managerRetryableException = \e ->+ case () of+ ()+ | ((fromException e)::(Maybe TLS.TLSError))==Just TLS.Error_EOF -> True+ | otherwise -> case fromException e of+ Just (_ :: IOException) -> True+ _ ->+ case fromException e of+ -- Note: Some servers will timeout connections by accepting+ -- the incoming packets for the new request, but closing+ -- the connection as soon as we try to read. To make sure+ -- we open a new connection under these circumstances, we+ -- check for the NoResponseDataReceived exception.+ Just NoResponseDataReceived -> True+ _ -> False+ , managerWrapIOException =+ let wrapper se =+ case fromException se of+ Just e -> toException $ InternalIOException e+ Nothing ->+ case fromException se of+ Just TLS.Terminated{} -> toException $ TlsException se+ Nothing ->+ case fromException se of+ Just TLS.HandshakeFailed{} -> toException $ TlsException se+ Nothing ->+ case fromException se of+ Just TLS.ConnectionNotEstablished -> toException $ TlsException se+ Nothing -> se+ in handle $ throwIO . wrapper+ }++tlsManagerSettings :: ManagerSettings+tlsManagerSettings = mkManagerSettings def Nothing++getTlsConnection :: Maybe NC.TLSSettings+ -> Maybe NC.SockSettings+ -> IO (Maybe HostAddress -> String -> Int -> IO Connection)+getTlsConnection tls sock = do+ context <- NC.initConnectionContext+ return $ \_ha host port -> do+ conn <- NC.connectTo context NC.ConnectionParams+ { NC.connectionHostname = host+ , NC.connectionPort = fromIntegral port+ , NC.connectionUseSecure = tls+ , NC.connectionUseSocks = sock+ }+ convertConnection conn+ where+ convertConnection conn = makeConnection+ (NC.connectionGetChunk conn)+ (NC.connectionPut conn)+ (NC.connectionClose conn)
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ http-client-tls.cabal view
@@ -0,0 +1,34 @@+name: http-client-tls+version: 0.2.0.0+synopsis: http-client backend using the connection package and tls library+description: Intended for use by higher-level libraries, such as http-conduit.+homepage: https://github.com/snoyberg/http-client+license: MIT+license-file: LICENSE+author: Michael Snoyman+maintainer: michael@snoyman.com+category: Network+build-type: Simple+cabal-version: >=1.10++library+ exposed-modules: Network.HTTP.Client.TLS+ other-extensions: ScopedTypeVariables+ build-depends: base >= 4 && < 5+ , data-default+ , http-client >= 0.2+ , connection >= 0.1.3+ , network+ , tls >=1.1+ default-language: Haskell2010++test-suite spec+ main-is: Spec.hs+ type: exitcode-stdio-1.0+ hs-source-dirs: test+ default-language: Haskell2010+ build-depends: base+ , hspec+ , http-client+ , http-client-tls+ , http-types
+ test/Spec.hs view
@@ -0,0 +1,15 @@+{-# LANGUAGE OverloadedStrings #-}+import Test.Hspec+import Network.HTTP.Client+import Network.HTTP.Client.TLS+import Network.HTTP.Client.Internal+import Network.HTTP.Types++main :: IO ()+main = hspec $ do+ it "make a TLS connection" $ do+ manager <- newManager tlsManagerSettings+ withResponse "https://httpbin.org/status/418"+ { checkStatus = \_ _ _ -> Nothing+ } manager $ \res -> do+ responseStatus res `shouldBe` status418