Skip to content

Instantly share code, notes, and snippets.

@cdax
Last active August 29, 2015 14:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cdax/3e1946391fc59c82219d to your computer and use it in GitHub Desktop.
Save cdax/3e1946391fc59c82219d to your computer and use it in GitHub Desktop.
A simple file download function (supports promises via nfcall())
function download(url, filepath, progressCallback, callback) {
//http.get() promisified using Q.nfcall()
return
Q.nfcall(http.get, url)
.then(function(res) {
//Detecting a redirect the way request/request.js does it
if(res.statusCode >= 300 && res.statusCode < 400 && hasHeader(res, 'location')) {
//Get the new URL and make a fresh call to download, returning the promise
return download(getHeader(res, 'location'), filepath, progressCallback, callback);
} else {
var data = '', totalLength = parseInt(res.getHeader('content-length'));
var file = fs.createWriteStream(filepath);
res.pipe(file);
//Promise fulfilled
res.on('end', function() {
return filename;
});
//Promise rejected
res.on('error', function(err) {
throw err;
})
//Progress callback
if(totalLength > 0) {
res.on('data', function() {
data += chunk.toString();
if(progressCallback === undefined)
progressCallback(data.length / totalLength);
});
}
}
}).nodeify(callback);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment