-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
68 lines (59 loc) · 1.64 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
var request = require('request')
var mkdir = require('mkdirp')
var once = require('once')
var http = require('http')
var path = require('path')
var fs
try {
fs = require('graceful-fs')
} catch (ex) {
fs = require('fs')
}
module.exports = fetch
function fetch(remote, local, options, cb) {
if (typeof cb !== "function") cb = options, options = {}
cb = once(cb)
mkdir(path.dirname(local), function (err) {
if (err) return cb(err)
fetch_(remote, local, options || {}, cb)
})
}
function fetch_(remote, local, options, cb) {
var mode = options.mode || 0666; //npm.modes.file
var fstr = fs.createWriteStream(local, { mode : mode })
var response = null
fstr.on("error", function (err) {
cb(err)
fstr.close()
})
if (typeof remote === 'string') remote = {uri: remote}
var req = request(remote)
req.on("error", function (err) {
cb(err)
fstr.close()
})
req.pipe(fstr)
req.on("response", function (res) {
response = res
response.resume()
// Work around bug in node v0.10.0 where the CryptoStream
// gets stuck and never starts reading again.
if (process.version === "v0.10.0") {
response.resume = (function (orig) {
return function() {
var ret = orig.apply(response, arguments)
if (response.socket.encrypted)
response.socket.encrypted.read(0)
return ret
}
}(response.resume))
}
})
fstr.on("close", function () {
var err = null
if (response && response.statusCode && response.statusCode >= 400) {
err = new Error(response.statusCode + ' ' + http.STATUS_CODES[response.statusCode])
}
cb(err, response)
})
}