Hello community,

here is the log from the commit of package ghc-http-client for openSUSE:Factory 
checked in at 2017-06-22 10:35:53
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-http-client (Old)
 and      /work/SRC/openSUSE:Factory/.ghc-http-client.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ghc-http-client"

Thu Jun 22 10:35:53 2017 rev:23 rq:504077 version:0.5.7.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-http-client/ghc-http-client.changes  
2017-03-20 17:07:19.432838272 +0100
+++ /work/SRC/openSUSE:Factory/.ghc-http-client.new/ghc-http-client.changes     
2017-06-22 10:35:55.395431089 +0200
@@ -1,0 +2,5 @@
+Wed May 31 14:01:08 UTC 2017 - [email protected]
+
+- Update to version 0.5.7.0.
+
+-------------------------------------------------------------------

Old:
----
  http-client-0.5.6.1.tar.gz

New:
----
  http-client-0.5.7.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ ghc-http-client.spec ++++++
--- /var/tmp/diff_new_pack.1qIVjk/_old  2017-06-22 10:35:56.883221360 +0200
+++ /var/tmp/diff_new_pack.1qIVjk/_new  2017-06-22 10:35:56.887220795 +0200
@@ -19,7 +19,7 @@
 %global pkg_name http-client
 %bcond_with tests
 Name:           ghc-%{pkg_name}
-Version:        0.5.6.1
+Version:        0.5.7.0
 Release:        0
 Summary:        An HTTP client engine
 License:        MIT

++++++ http-client-0.5.6.1.tar.gz -> http-client-0.5.7.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/http-client-0.5.6.1/ChangeLog.md 
new/http-client-0.5.7.0/ChangeLog.md
--- old/http-client-0.5.6.1/ChangeLog.md        2017-02-26 15:38:40.000000000 
+0100
+++ new/http-client-0.5.7.0/ChangeLog.md        2017-05-09 13:20:28.000000000 
+0200
@@ -1,3 +1,8 @@
+## 0.5.7.0
+
+* Support for Windows system proxy settings
+  [#274](https://github.com/snoyberg/http-client/pull/274)
+
 ## 0.5.6.1
 
 * Revert socks5 and socks5h support from
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/http-client-0.5.6.1/Network/HTTP/Client/Manager.hs 
new/http-client-0.5.7.0/Network/HTTP/Client/Manager.hs
--- old/http-client-0.5.6.1/Network/HTTP/Client/Manager.hs      2017-02-26 
15:38:40.000000000 +0100
+++ new/http-client-0.5.7.0/Network/HTTP/Client/Manager.hs      2017-05-09 
13:19:16.000000000 +0200
@@ -53,6 +53,7 @@
 import Network.HTTP.Client.Connection
 import Network.HTTP.Client.Headers (parseStatusHeaders)
 import Network.HTTP.Client.Request (applyBasicProxyAuth, extractBasicAuthInfo)
+import Network.HTTP.Proxy
 import Control.Concurrent.MVar (MVar, takeMVar, tryPutMVar, newEmptyMVar)
 import System.Environment (getEnvironment)
 import qualified Network.URI as U
@@ -465,12 +466,7 @@
 proxyEnvironment :: Maybe Proxy -- ^ fallback if no environment set
                  -> ProxyOverride
 proxyEnvironment mp = ProxyOverride $ \secure' ->
-    envHelper (envName secure') $ maybe EHNoProxy EHUseProxy mp
-
-envName :: Bool -- ^ secure?
-        -> Text
-envName False = "http_proxy"
-envName True = "https_proxy"
+    systemProxyHelper Nothing (httpProtocol secure') $ maybe EHNoProxy 
EHUseProxy mp
 
 -- | Same as 'proxyEnvironment', but instead of default environment variable
 -- names, allows you to set your own name.
@@ -480,66 +476,12 @@
     :: Text -- ^ environment variable name
     -> Maybe Proxy -- ^ fallback if no environment set
     -> ProxyOverride
-proxyEnvironmentNamed name =
-    ProxyOverride . const . envHelper name
-                  . maybe EHNoProxy EHUseProxy
+proxyEnvironmentNamed name mp = ProxyOverride $ \secure' ->
+    systemProxyHelper (Just name) (httpProtocol secure') $ maybe EHNoProxy 
EHUseProxy mp
 
 -- | The default proxy settings for a manager. In particular: if the 
@http_proxy@ (or @https_proxy@) environment variable is set, use it. Otherwise, 
use the values in the @Request@.
 --
 -- Since 0.4.7
 defaultProxy :: ProxyOverride
 defaultProxy = ProxyOverride $ \secure' ->
-    envHelper (envName secure') EHFromRequest
-
-data EnvHelper = EHFromRequest
-               | EHNoProxy
-               | EHUseProxy Proxy
-
-envHelper :: Text -> EnvHelper -> IO (Request -> Request)
-envHelper name eh = do
-    env <- getEnvironment
-    let lenv = Map.fromList $ map (first $ T.toLower . T.pack) env
-        lookupEnvVar n = lookup (T.unpack n) env <|> Map.lookup n lenv
-        noProxyDomains = domainSuffixes (lookupEnvVar "no_proxy")
-    case lookupEnvVar name of
-        Nothing  -> return noEnvProxy
-        Just ""  -> return noEnvProxy
-        Just str -> do
-            let invalid = throwHttp $ InvalidProxyEnvironmentVariable name 
(T.pack str)
-            (p, muserpass) <- maybe invalid return $ do
-                let allowedScheme x = x == "http:"
-                uri <- case U.parseURI str of
-                    Just u | allowedScheme (U.uriScheme u) -> return u
-                    _ -> U.parseURI $ "http://"; ++ str
-
-                guard $ allowedScheme $ U.uriScheme uri
-                guard $ null (U.uriPath uri) || U.uriPath uri == "/"
-                guard $ null $ U.uriQuery uri
-                guard $ null $ U.uriFragment uri
-
-                auth <- U.uriAuthority uri
-                port' <-
-                    case U.uriPort auth of
-                        "" -> Just 80
-                        ':':rest ->
-                            case decimal $ T.pack rest of
-                                Right (p, "") -> Just p
-                                _ -> Nothing
-                        _ -> Nothing
-
-                Just $ (Proxy (S8.pack $ U.uriRegName auth) port', 
extractBasicAuthInfo uri)
-            return $ \req ->
-                if host req `hasDomainSuffixIn` noProxyDomains
-                then noEnvProxy req
-                else maybe id (uncurry applyBasicProxyAuth) muserpass
-                     req { proxy = Just p }
-    where noEnvProxy = case eh of
-            EHFromRequest -> id
-            EHNoProxy     -> \req -> req { proxy = Nothing }
-            EHUseProxy p  -> \req -> req { proxy = Just p  }
-          prefixed s | S8.head s == '.' = s
-                     | otherwise = S8.cons '.' s
-          domainSuffixes Nothing = []
-          domainSuffixes (Just "") = []
-          domainSuffixes (Just no_proxy) = [prefixed $ S8.dropWhile (== ' ') 
suffix | suffix <- S8.split ',' (S8.pack (map toLower no_proxy)), not (S8.null 
suffix)]
-          hasDomainSuffixIn host' = any (`S8.isSuffixOf` prefixed (S8.map 
toLower host'))
+    systemProxyHelper Nothing (httpProtocol secure') EHFromRequest
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/http-client-0.5.6.1/Network/HTTP/Client/Types.hs 
new/http-client-0.5.7.0/Network/HTTP/Client/Types.hs
--- old/http-client-0.5.6.1/Network/HTTP/Client/Types.hs        2017-02-20 
09:35:27.000000000 +0100
+++ new/http-client-0.5.7.0/Network/HTTP/Client/Types.hs        2017-05-09 
13:19:16.000000000 +0200
@@ -232,6 +232,9 @@
                    -- ^ Attempted to use a 'Connection' which was already 
closed
                    --
                    -- @since 0.5.0
+                   | InvalidProxySettings Text
+                   -- ^ Proxy settings are not valid (Windows specific 
currently)
+                   -- @since 0.5.7
     deriving (Show, T.Typeable)
 
 -- Purposely not providing this instance, since we don't want users to
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/http-client-0.5.6.1/Network/HTTP/Proxy.hs 
new/http-client-0.5.7.0/Network/HTTP/Proxy.hs
--- old/http-client-0.5.6.1/Network/HTTP/Proxy.hs       1970-01-01 
01:00:00.000000000 +0100
+++ new/http-client-0.5.7.0/Network/HTTP/Proxy.hs       2017-05-12 
07:24:46.000000000 +0200
@@ -0,0 +1,374 @@
+{-# LANGUAGE CPP               #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+{-
+Copyright (c) 2002, Warrick Gray
+Copyright (c) 2002-2005, Ian Lynagh
+Copyright (c) 2003-2006, Bjorn Bringert
+Copyright (c) 2004, Andre Furtado
+Copyright (c) 2004-2005, Dominic Steinitz
+Copyright (c) 2007, Robin Bate Boerop
+Copyright (c) 2008-2010, Sigbjorn Finne
+Copyright (c) 2009, Eric Kow
+Copyright (c) 2010, Antoine Latter
+Copyright (c) 2004, 2010-2011, Ganesh Sittampalam
+Copyright (c) 2011, Duncan Coutts
+Copyright (c) 2011, Matthew Gruen
+Copyright (c) 2011, Jeremy Yallop
+Copyright (c) 2011, Eric Hesselink
+Copyright (c) 2011, Yi Huang
+Copyright (c) 2011, Tom Lokhorst
+Copyright (c) 2017, Vassil Keremidchiev
+
+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.
+
+    * The names of contributors may not be used to endorse or promote
+      products derived from this software without specific prior
+      written permission.
+
+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.
+-}
+
+module Network.HTTP.Proxy(  ProxyProtocol(..), EnvHelper(..),
+                            systemProxyHelper, envHelper,
+                            httpProtocol,
+                            ProxySettings ) where
+
+import           Control.Applicative         ((<$>), (<|>))
+import           Control.Arrow               (first)
+import           Control.Monad               (guard)
+import qualified Data.ByteString.Char8       as S8
+import           Data.Char                   (toLower)
+import qualified Data.Map                    as Map
+import qualified Data.Text                   as T
+import           Data.Text.Read              (decimal)
+import           Network.HTTP.Client.Request (applyBasicProxyAuth,
+                                              extractBasicAuthInfo)
+import           Network.HTTP.Client.Types   (HttpExceptionContent (..),
+                                              Proxy (..), Request (..),
+                                              throwHttp)
+import qualified Network.URI                 as U
+import           System.Environment          (getEnvironment)
+
+#if defined(mingw32_HOST_OS)
+import           Control.Exception           (IOException, bracket, catch, try)
+import           Control.Monad               (join, liftM, mplus, when)
+import           Data.List                   (isInfixOf, isPrefixOf)
+import           Foreign                     (Storable (peek, sizeOf), alloca,
+                                              castPtr, toBool)
+import           Network.URI                 (parseAbsoluteURI)
+import           Safe                        (readDef)
+import           System.IO
+import           System.Win32.Registry       (hKEY_CURRENT_USER, rEG_DWORD,
+                                              regCloseKey, regOpenKey,
+                                              regQueryValue, regQueryValueEx)
+import           System.Win32.Types          (DWORD, HKEY)
+#endif
+
+type EnvName     = T.Text
+type HostAddress = S8.ByteString
+type UserName    = S8.ByteString
+type Password    = S8.ByteString
+
+-- There are other proxy protocols like SOCKS, FTP, etc.
+data ProxyProtocol = HTTPProxy | HTTPSProxy
+
+instance Show ProxyProtocol where
+    show HTTPProxy  = "http"
+    show HTTPSProxy = "https"
+
+data ProxySettings = ProxySettings { proxyHost :: Proxy,
+                                     proxyAuth :: Maybe (UserName, Password) }
+                                     deriving Show
+
+httpProtocol :: Bool -> ProxyProtocol
+httpProtocol True  = HTTPSProxy
+httpProtocol False = HTTPProxy
+
+data EnvHelper = EHFromRequest
+               | EHNoProxy
+               | EHUseProxy Proxy
+
+headJust :: [Maybe a] -> Maybe a
+headJust []               = Nothing
+headJust (Nothing:xs)     = headJust xs
+headJust ((y@(Just x)):_) = y
+
+systemProxyHelper :: Maybe T.Text -> ProxyProtocol -> EnvHelper -> IO (Request 
-> Request)
+systemProxyHelper envOveride prot eh = do
+    let envName' Nothing     = envName prot
+        envName' (Just name) = name
+
+    modifier <- envHelper (envName' envOveride)
+
+-- Under Windows try first env. variables override then Windows proxy settings
+#if defined(mingw32_HOST_OS)
+    modifier' <- systemProxy prot
+    let modifiers = [modifier, modifier']
+#else
+    let modifiers = [modifier]
+#endif
+
+    let chooseMod :: Request -> Maybe ProxySettings
+        chooseMod req = headJust . map (\m -> m . host $ req) $ modifiers
+
+        noEnvProxy = case eh of
+            EHFromRequest -> id
+            EHNoProxy     -> \req -> req { proxy = Nothing }
+            EHUseProxy p  -> \req -> req { proxy = Just p  }
+
+    let result req = toRequest . chooseMod $ req where
+            toRequest Nothing                            = noEnvProxy req
+            toRequest (Just (ProxySettings p muserpass)) = maybe id (uncurry 
applyBasicProxyAuth) muserpass
+                                        req { proxy = Just p }
+    return result
+
+
+#if defined(mingw32_HOST_OS)
+windowsProxyString :: ProxyProtocol -> IO (Maybe (String, String))
+windowsProxyString proto = do
+    mProxy <- registryProxyString
+    return $ do
+        (proxies, exceptions) <- mProxy
+        protoProxy <- parseWindowsProxy proto proxies
+        return (protoProxy, exceptions)
+
+registryProxyLoc :: (HKEY,String)
+registryProxyLoc = (hive, path)
+  where
+    -- some sources say proxy settings should be at
+    -- HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows
+    --                   \CurrentVersion\Internet Settings\ProxyServer
+    -- but if the user sets them with IE connection panel they seem to
+    -- end up in the following place:
+    hive  = hKEY_CURRENT_USER
+    path = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"
+
+-- read proxy settings from the windows registry; this is just a best
+-- effort and may not work on all setups.
+registryProxyString :: IO (Maybe (String, String))
+registryProxyString = catch
+  (bracket (uncurry regOpenKey registryProxyLoc) regCloseKey $ \hkey -> do
+    enable <- toBool . maybe 0 id <$> regQueryValueDWORD hkey "ProxyEnable"
+    if enable
+        then do
+            server <- regQueryValue hkey (Just "ProxyServer")
+            exceptions <- try $ regQueryValue hkey (Just "ProxyOverride") :: 
IO (Either IOException String)
+            return $ Just (server, either (const "") id exceptions)
+        else return Nothing)
+  hideError where
+      hideError :: IOException -> IO (Maybe (String, String))
+      hideError _ = return Nothing
+
+-- the proxy string is in the format 
"http=x.x.x.x:yyyy;https=...;ftp=...;socks=..."
+-- even though the following article indicates otherwise
+-- https://support.microsoft.com/en-us/kb/819961
+--
+-- to be sure, parse strings where each entry in the ';'-separated list above 
is
+-- either in the format "protocol=..." or "protocol://..."
+parseWindowsProxy :: ProxyProtocol -> String -> Maybe String
+parseWindowsProxy proto s =
+  case proxies of
+    x:_ -> Just x
+    _   -> Nothing
+  where
+    parts = split ';' s
+    pr x = case break (== '=') x of
+      (p, []) -> p  -- might be in format http://
+      (p, u)  -> p ++ "://" ++ drop 1 u
+
+    protoPrefix = (show proto) ++ "://"
+    proxies = filter (isPrefixOf protoPrefix) . map pr $ parts
+
+    split :: Eq a => a -> [a] -> [[a]]
+    split _ [] = []
+    split a xs = case break (a ==) xs of
+      (ys, [])   -> [ys]
+      (ys, _:zs) -> ys:split a zs
+
+-- Extract proxy settings from Windows registry. This is a standard way in 
Windows OS.
+systemProxy :: ProxyProtocol -> IO (HostAddress -> Maybe ProxySettings)
+systemProxy proto = do
+    let isURLlocal "127.0.0.1" = True
+        isURLlocal "localhost" = True
+        isURLlocal _           = False
+
+        hasLocal exceptions = "<local>" `isInfixOf` exceptions
+
+    settings <- fetchProxy proto
+    return $ \url -> do
+        (proxy, exceptions) <- settings
+
+        -- Skip proxy for local hosts if it's enabled in IE settings
+        -- TODO Implement skipping for address patterns, like (*.google.com)
+        if (isURLlocal url && hasLocal exceptions) || (url `S8.isInfixOf` 
(S8.pack exceptions)) then Nothing
+        else Just proxy
+
+-- | @fetchProxy flg@ gets the local proxy settings and parse the string
+-- into a @Proxy@ value.
+-- Proxy settings are sourced from IE/WinInet's proxy
+-- setting in the Registry.
+fetchProxy :: ProxyProtocol -> IO (Maybe (ProxySettings, String))
+fetchProxy proto = do
+    mstr <- windowsProxyString proto
+    case mstr of
+      Nothing               -> return Nothing
+      Just (proxy, except)  -> case parseProxy proto proxy of
+          Just p  -> return $ Just (p, except)
+          Nothing ->
+              throwHttp . InvalidProxySettings . T.pack . unlines $
+                      [ "Invalid http proxy uri: " ++ show proxy
+                      , "proxy uri must be http with a hostname"
+                      , "ignoring http proxy, trying a direct connection"
+                      ]
+
+-- | @parseProxy str@ translates a proxy server string into a @ProxySettings@ 
value;
+-- returns @Nothing@ if not well-formed.
+parseProxy :: ProxyProtocol -> String -> Maybe ProxySettings
+parseProxy proto str = join
+                 . fmap (uri2proxy proto)
+                 $ parseHttpURI str
+                 `mplus` parseHttpURI (protoPrefix ++ str)
+    where
+     protoPrefix = (show proto) ++ "://"
+     parseHttpURI str' =
+      case parseAbsoluteURI str' of
+        Just [email protected]{U.uriAuthority = Just{}} -> Just (fixUserInfo uri)
+        _                                       -> Nothing
+
+       -- Note: we need to be able to parse non-URIs like 
@\"wwwcache.example.com:80\"@
+       -- which lack the @\"http://\"@ URI scheme. The problem is that
+       -- @\"wwwcache.example.com:80\"@ is in fact a valid URI but with scheme
+       -- @\"wwwcache.example.com:\"@, no authority part and a path of 
@\"80\"@.
+       --
+       -- So our strategy is to try parsing as normal uri first and if it 
lacks the
+       -- 'uriAuthority' then we try parsing again with a @\"http://\"@ prefix.
+       --
+
+-- | @dropWhileTail p ls@ chops off trailing elements from @ls@
+-- until @p@ returns @False@.
+dropWhileTail :: (a -> Bool) -> [a] -> [a]
+dropWhileTail f ls =
+    case foldr chop Nothing ls of { Just xs -> xs; Nothing -> [] }
+     where
+       chop x (Just xs) = Just (x:xs)
+       chop x _
+        | f x       = Nothing
+        | otherwise = Just [x]
+
+-- | @chopAtDelim elt ls@ breaks up @ls@ into two at first occurrence
+-- of @elt@; @elt@ is elided too. If @elt@ does not occur, the second
+-- list is empty and the first is equal to @ls@.
+chopAtDelim :: Eq a => a -> [a] -> ([a],[a])
+chopAtDelim elt xs =
+    case break (==elt) xs of
+    (_,[])    -> (xs,[])
+    (as,_:bs) -> (as,bs)
+
+-- | tidy up user portion, don't want the trailing "\@".
+fixUserInfo :: U.URI -> U.URI
+fixUserInfo uri = uri{ U.uriAuthority = f `fmap` U.uriAuthority uri }
+    where
+     f [email protected]{U.uriUserInfo=s} = a{U.uriUserInfo=dropWhileTail (=='@') s}
+
+defaultHTTPport :: ProxyProtocol -> Int
+defaultHTTPport HTTPProxy  = 80
+defaultHTTPport HTTPSProxy = 443
+
+uri2proxy :: ProxyProtocol -> U.URI -> Maybe ProxySettings
+uri2proxy proto [email protected]{ U.uriAuthority = Just (U.URIAuth auth' hst prt) } =
+    if (show proto ++ ":") == U.uriScheme uri then
+        Just (ProxySettings (Proxy (S8.pack hst) (port prt)) auth) else Nothing
+    where
+     port (':':xs) = readDef (defaultHTTPport proto) xs
+     port _        = (defaultHTTPport proto)
+
+     auth =
+       case auth' of
+         [] -> Nothing
+         as -> Just ((S8.pack . U.unEscapeString $ usr), (S8.pack . 
U.unEscapeString $ pwd))
+          where
+           (usr,pwd) = chopAtDelim ':' as
+
+uri2proxy _ _ = Nothing
+
+regQueryValueDWORD :: HKEY -> String -> IO (Maybe DWORD)
+regQueryValueDWORD hkey name = alloca $ \ptr -> do
+  key <- regQueryValueEx hkey name (castPtr ptr) (sizeOf (undefined :: DWORD))
+  if key == rEG_DWORD then
+      Just <$> peek ptr
+  else return Nothing
+
+-- defined(mingw32_HOST_OS)
+#endif
+
+envName :: ProxyProtocol -> EnvName
+envName proto = T.pack $ show proto ++ "_proxy"
+
+-- Extract proxy settings from environment variables. This is a standard way 
in Linux.
+envHelper :: EnvName -> IO (HostAddress -> Maybe ProxySettings)
+envHelper name = do
+  env <- getEnvironment
+  let lenv = Map.fromList $ map (first $ T.toLower . T.pack) env
+      lookupEnvVar n = lookup (T.unpack n) env <|> Map.lookup n lenv
+      noProxyDomains = domainSuffixes (lookupEnvVar "no_proxy")
+
+  case lookupEnvVar name of
+      Nothing  -> return . const $ Nothing
+      Just ""  -> return . const $ Nothing
+      Just str -> do
+          let invalid = throwHttp $ InvalidProxyEnvironmentVariable name 
(T.pack str)
+          (p, muserpass) <- maybe invalid return $ do
+              let allowedScheme x = x == "http:"
+              uri <- case U.parseURI str of
+                  Just u | allowedScheme (U.uriScheme u) -> return u
+                  _      -> U.parseURI $ "http://"; ++ str
+
+              guard $ allowedScheme $ U.uriScheme uri
+              guard $ null (U.uriPath uri) || U.uriPath uri == "/"
+              guard $ null $ U.uriQuery uri
+              guard $ null $ U.uriFragment uri
+
+              auth <- U.uriAuthority uri
+              port' <-
+                  case U.uriPort auth of
+                      "" -> Just 80
+                      ':':rest ->
+                          case decimal $ T.pack rest of
+                              Right (p, "") -> Just p
+                              _             -> Nothing
+                      _ -> Nothing
+
+              Just (Proxy (S8.pack $ U.uriRegName auth) port', 
extractBasicAuthInfo uri)
+          return $ \hostRequest ->
+              if hostRequest `hasDomainSuffixIn` noProxyDomains
+              then Nothing
+              else Just $ ProxySettings p muserpass
+  where prefixed s | S8.head s == '.' = s
+                   | otherwise = S8.cons '.' s
+        domainSuffixes Nothing = []
+        domainSuffixes (Just "") = []
+        domainSuffixes (Just no_proxy) = [prefixed $ S8.dropWhile (== ' ') 
suffix | suffix <- S8.split ',' (S8.pack (map toLower no_proxy)), not (S8.null 
suffix)]
+        hasDomainSuffixIn host' = any (`S8.isSuffixOf` prefixed (S8.map 
toLower host'))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/http-client-0.5.6.1/http-client.cabal 
new/http-client-0.5.7.0/http-client.cabal
--- old/http-client-0.5.6.1/http-client.cabal   2017-02-26 15:38:40.000000000 
+0100
+++ new/http-client-0.5.7.0/http-client.cabal   2017-05-10 11:10:23.000000000 
+0200
@@ -1,5 +1,5 @@
 name:                http-client
-version:             0.5.6.1
+version:             0.5.7.0
 synopsis:            An HTTP client engine
 description:         Hackage documentation generation is not reliable. For up 
to date documentation, please see: 
<http://www.stackage.org/package/http-client>.
 homepage:            https://github.com/snoyberg/http-client
@@ -31,6 +31,7 @@
                        Network.HTTP.Client.Response
                        Network.HTTP.Client.Types
                        Network.HTTP.Client.Util
+                       Network.HTTP.Proxy
                        Network.PublicSuffixList.Lookup
                        Network.PublicSuffixList.Types
                        Network.PublicSuffixList.Serialize
@@ -59,6 +60,10 @@
     build-depends: network >= 2.6, network-uri >= 2.6
   else
     build-depends: network < 2.6
+
+  if os(mingw32)
+    build-depends: Win32, safe
+
   default-language:    Haskell2010
 
 test-suite spec


Reply via email to