Work around curl bug when asked to download an empty url to a file.

In this situation, curl -o exits successfully without creating the output
file.

There was already a workaround for curl file:/// but I did not realize this
also affected regular url downloads.

To fix it, pre-create the destination file before starting curl.
Since we cannot always know the size of an url before trying to download
it, let's always do this.

Note that since curl is told -C -, we have to consider if this
makes curl try to do a ranged download, which might fail on some servers
where a regular download would have succeeded. My testing indicates
this isn't a problem; since the file is empty, curl seems to not try to
do a ranged download.

Original report: https://github.com/datalad/datalad/issues/79
Curl bug report: https://github.com/bagder/curl/issues/183
This commit is contained in:
Joey Hess 2015-03-27 10:22:32 -04:00
parent d58b529292
commit b8f0b7309f
2 changed files with 7 additions and 5 deletions

View file

@ -209,9 +209,6 @@ download' quiet url file uo =
case parseURIRelaxed url of
Just u
| uriScheme u == "file:" -> do
-- curl does not create destination file
-- for an empty file:// url, so pre-create
writeFile file ""
curl
| otherwise -> ifM (inPath "wget") (wget , curl)
_ -> return False
@ -240,8 +237,12 @@ download' quiet url file uo =
- the remainder to download as the whole file,
- and not indicating how much percent was
- downloaded before the resume. -}
curl = go "curl" $ headerparams ++ quietopt "-s" ++
[Params "-f -L -C - -# -o"]
curl = do
-- curl does not create destination file
-- if the url happens to be empty, so pre-create.
writeFile file ""
go "curl" $ headerparams ++ quietopt "-s" ++
[Params "-f -L -C - -# -o"]
go cmd opts = boolSystem cmd $
addUserAgent uo $ reqParams uo++opts++[File file, File url]
quietopt s

1
debian/changelog vendored
View file

@ -17,6 +17,7 @@ git-annex (5.20150318) UNRELEASED; urgency=medium
* assistant: Committing a whole lot of files at once could overflow
command-line length limits and cause the commit to fail. This
only happened when using the assistant in an indirect mode repository.
* Work around curl bug when asked to download an empty url to a file.
-- Joey Hess <id@joeyh.name> Thu, 19 Mar 2015 17:05:32 -0400