0
Fork 0
mirror of https://github.com/verdaccio/verdaccio.git synced 2025-03-18 02:22:46 -05:00

try to fetch package from uplinks if user requested a tarball we don't know about

closes #29 + tests fix
This commit is contained in:
Alex Kocharin 2013-12-15 03:15:58 +04:00
parent 9094d0742f
commit ef61515f28
5 changed files with 66 additions and 39 deletions

View file

@ -179,9 +179,11 @@ Storage.prototype.update_versions = function(name, newdata, callback) {
if (change) {
self.logger.debug('updating package info')
self._write_package(name, data, callback)
self._write_package(name, data, function(err) {
callback(err, data)
})
} else {
callback()
callback(null, data)
}
})
}

View file

@ -348,45 +348,23 @@ Storage.prototype.get_tarball = function(name, filename) {
rstream = null // gc
self.local.get_package(name, function(err, info) {
if (err) return stream.emit('error', err)
if (!err && info._distfiles && info._distfiles[filename] != null) {
// information about this file exists locally
serve_file(info._distfiles[filename])
if (info._distfiles[filename] == null) {
return stream.emit('error', err404)
}
} else {
// we know nothing about this file, trying to get information elsewhere
var file = info._distfiles[filename]
var uplink = null
for (var p in self.uplinks) {
if (self.uplinks[p].can_fetch_url(file.url)) {
uplink = self.uplinks[p]
}
}
if (uplink == null) {
uplink = new Proxy({
url: file.url,
_autogenerated: true,
}, self.config)
}
self._sync_package_with_uplinks(name, info, {}, function(err, info) {
if (err) return stream.emit('error', err)
var savestream = self.local.add_tarball(name, filename)
savestream.on('error', function(err) {
savestream.abort()
stream.emit('error', err)
})
savestream.on('open', function() {
var rstream2 = uplink.get_url(file.url)
rstream2.on('error', function(err) {
savestream.abort()
stream.emit('error', err)
if (!info._distfiles || info._distfiles[filename] == null) {
return stream.emit('error', err404)
}
serve_file(info._distfiles[filename])
})
rstream2.on('end', function() {
savestream.done()
})
// XXX: check, what would happen if client disconnects?
rstream2.pipe(stream)
rstream2.pipe(savestream)
})
}
})
})
rstream.on('open', function() {
@ -394,6 +372,41 @@ Storage.prototype.get_tarball = function(name, filename) {
rstream.pipe(stream)
})
return stream
function serve_file(file) {
var uplink = null
for (var p in self.uplinks) {
if (self.uplinks[p].can_fetch_url(file.url)) {
uplink = self.uplinks[p]
}
}
if (uplink == null) {
uplink = new Proxy({
url: file.url,
_autogenerated: true,
}, self.config)
}
var savestream = self.local.add_tarball(name, filename)
savestream.on('error', function(err) {
savestream.abort()
stream.emit('error', err)
})
savestream.on('open', function() {
var rstream2 = uplink.get_url(file.url)
rstream2.on('error', function(err) {
savestream.abort()
stream.emit('error', err)
})
rstream2.on('end', function() {
savestream.done()
})
// XXX: check, what would happen if client disconnects?
rstream2.pipe(stream)
rstream2.pipe(savestream)
})
}
}
//
@ -509,7 +522,7 @@ Storage.prototype._sync_package_with_uplinks = function(name, pkginfo, options,
}), null, uplink_errors)
}
self.local.update_versions(name, pkginfo, function(err) {
self.local.update_versions(name, pkginfo, function(err, pkginfo) {
if (err) return callback(err)
return callback(null, pkginfo, uplink_errors)
})

View file

@ -22,7 +22,7 @@ packages:
proxy_access: server1
proxy_publish: server1
testpkg:
'testpkg*':
allow_access: test anonymous
allow_publish: test anonymous
proxy_access: server1

View file

@ -1,5 +1,6 @@
var assert = require('assert')
, readfile = require('fs').readFileSync
, crypto = require('crypto')
, ex = module.exports
, server = process.server
, server2 = process.server2
@ -36,6 +37,16 @@ ex['uploading new tarball / srv1'] = function(cb) {
})
}
ex['uploading new package version / srv1'] = function(cb) {
var pkg = require('./lib/package')('testpkg-gh29')
pkg.dist.shasum = crypto.createHash('sha1').update(readfile('fixtures/binary')).digest('hex')
server.put_version('testpkg-gh29', '0.0.1', pkg, function(res, body) {
assert.equal(res.statusCode, 201)
assert(~body.ok.indexOf('published'))
cb()
})
}
ex['downloading newly created tarball / srv2'] = function(cb) {
server2.get_tarball('testpkg-gh29', 'blahblah', function(res, body) {
assert.equal(res.statusCode, 200)

View file

@ -16,6 +16,7 @@ function prep(cb) {
}
Server.prototype.request = function(options, cb) {
assert(options.uri)
var headers = options.headers || {};
headers.accept = headers.accept || 'application/json';
headers['user-agent'] = headers['user-agent'] || this.userAgent;