From eb0596b09ef481c2a029a0fc0cd0fc74e699abe0 Mon Sep 17 00:00:00 2001
From: Omar Mefire <omefire@gmail.com>
Date: Wed, 14 Sep 2016 00:54:30 -0700
Subject: [PATCH] BugFix #3795: Ignore HTTP range requests when using 'wget',
 as it doesn't support them and would instead fail.

---
 .../Distribution/Client/HttpUtils.hs          | 22 ++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

diff --git a/cabal-install/Distribution/Client/HttpUtils.hs b/cabal-install/Distribution/Client/HttpUtils.hs
index a50dd6b8a8..eede1de84d 100644
--- a/cabal-install/Distribution/Client/HttpUtils.hs
+++ b/cabal-install/Distribution/Client/HttpUtils.hs
@@ -413,10 +413,20 @@ curlTransport prog =
 
 wgetTransport :: ConfiguredProgram -> HttpTransport
 wgetTransport prog =
-    HttpTransport gethttp posthttp posthttpfile puthttpfile True False
+  HttpTransport gethttp posthttp posthttpfile puthttpfile True False
   where
-    gethttp verbosity uri etag destPath reqHeaders = do
+    gethttp verbosity uri etag destPath reqHeaders =  do
         resp <- runWGet verbosity uri args
+
+        -- wget doesn't support range requests.
+        -- so, we not only ignore range request headers,
+        -- but we also dispay a warning message when we see them.
+        let hasRangeHeader =  any (\hdr -> isRangeHeader hdr) reqHeaders
+            warningMsg =    "the 'wget' transport currently doesn't support range requests, which wastes network bandwidth."
+                            ++ " To fix this, set 'http-transport' to 'curl' or 'plain-http' in '~/.cabal/config'."
+                            ++ " Note that the 'plain-http' transport doesn't support HTTPS.\n"
+
+        when (hasRangeHeader) $ warn verbosity warningMsg
         (code, etag') <- parseOutput uri resp
         return (code, etag')
       where
@@ -429,7 +439,13 @@ wgetTransport prog =
                [ ["--header", "If-None-Match: " ++ t]
                | t <- maybeToList etag ]
             ++ [ "--header=" ++ show name ++ ": " ++ value
-               | Header name value <- reqHeaders ]
+               | hdr@(Header name value) <- reqHeaders, (not (isRangeHeader hdr)) ]
+
+        -- wget doesn't support range requests.
+        -- so, we ignore range request headers, lest we get errors.
+        isRangeHeader :: Header -> Bool
+        isRangeHeader (Header HdrRange _) = True
+        isRangeHeader _ = False
 
     posthttp = noPostYet
 
-- 
GitLab