packages feed

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 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