0
Fork 0
mirror of https://github.com/verdaccio/verdaccio.git synced 2024-12-16 21:56:25 -05:00

add via tag to prevent loops

This commit is contained in:
Alex Kocharin 2013-12-09 07:58:25 +04:00
parent 2f45649a2c
commit 4d70d8065e
4 changed files with 48 additions and 16 deletions

View file

@ -101,7 +101,7 @@ module.exports = function(config_hash) {
// TODO: anonymous user?
app.get('/:package/:version?', can('access'), function(req, res, next) {
storage.get_package(req.params.package, function(err, info) {
storage.get_package(req.params.package, {req: req}, function(err, info) {
if (err) return next(err)
info = utils.filter_tarball_urls(info, req, config)

View file

@ -371,7 +371,9 @@ Storage.prototype.get_tarball = function(name, filename, callback) {
return stream
}
Storage.prototype.get_package = function(name, callback) {
Storage.prototype.get_package = function(name, options, callback) {
if (typeof(options) === 'function') callback = options, options = {}
var self = this
, file = name + '/' + info_file

View file

@ -385,13 +385,15 @@ Storage.prototype.get_tarball = function(name, filename) {
//
// Used storages: local && uplink (proxy_access)
//
Storage.prototype.get_package = function(name, callback) {
Storage.prototype.get_package = function(name, options, callback) {
if (typeof(options) === 'function') callback = options, options = {}
// NOTE: callback(err, result, _uplink_errors)
// _uplink_errors is an array of errors used internally
// XXX: move it to another function maybe?
var self = this
self.local.get_package(name, function(err, data) {
self.local.get_package(name, options, function(err, data) {
if (err && (!err.status || err.status >= 500)) {
// report internal errors right away
return cb(err)
@ -414,11 +416,11 @@ Storage.prototype.get_package = function(name, callback) {
var latest = result['dist-tags'].latest
async.map(uplinks, function(up, cb) {
var oldetag = null
var _options = Object.create(options)
if (utils.is_object(result._uplinks[up.upname]))
oldetag = result._uplinks[up.upname].etag
_options.etag = result._uplinks[up.upname].etag
up.get_package(name, oldetag, function(err, up_res, etag) {
up.get_package(name, _options, function(err, up_res, etag) {
if (err || !up_res) return cb(null, [err || new Error('no data')])
try {

View file

@ -181,7 +181,9 @@ Storage.prototype.can_fetch_url = function(url) {
&& url.path.indexOf(this.url.path) === 0
}
Storage.prototype.add_package = function(name, metadata, callback) {
Storage.prototype.add_package = function(name, metadata, options, callback) {
if (typeof(options) === 'function') callback = options, options = {}
this.request({
uri: '/' + escape(name),
method: 'PUT',
@ -195,7 +197,9 @@ Storage.prototype.add_package = function(name, metadata, callback) {
})
}
Storage.prototype.add_version = function(name, version, metadata, tag, callback) {
Storage.prototype.add_version = function(name, version, metadata, tag, options, callback) {
if (typeof(options) === 'function') callback = options, options = {}
this.request({
uri: '/' + escape(name) + '/' + escape(version) + '/-tag/' + escape(tag),
method: 'PUT',
@ -209,7 +213,9 @@ Storage.prototype.add_version = function(name, version, metadata, tag, callback)
})
}
Storage.prototype.add_tarball = function(name, filename) {
Storage.prototype.add_tarball = function(name, filename, options) {
if (!options) options = {}
var stream = new mystreams.UploadTarballStream()
, self = this
@ -248,12 +254,15 @@ Storage.prototype.add_tarball = function(name, filename) {
return stream
}
Storage.prototype.get_package = function(name, etag, callback) {
if (etag) {
var headers = {
'if-none-match': etag
}
Storage.prototype.get_package = function(name, options, callback) {
if (typeof(options) === 'function') callback = options, options = {}
var headers = {}
if (options.etag) {
headers['If-None-Match'] = options.etag
}
this._add_proxy_headers(options.req, headers)
this.request({
uri: '/' + escape(name),
json: true,
@ -273,7 +282,8 @@ Storage.prototype.get_package = function(name, etag, callback) {
})
}
Storage.prototype.get_tarball = function(name, filename) {
Storage.prototype.get_tarball = function(name, options, filename) {
if (!options) options = {}
return this.get_url(this.config.url + '/' + name + '/-/' + filename)
}
@ -309,5 +319,23 @@ Storage.prototype.get_url = function(url) {
return stream
}
Storage.prototype._add_proxy_headers = function(req, headers) {
if (req) {
headers['X-Forwarded-For'] = (
(req && req.headers['x-forwarded-for']) ?
req.headers['x-forwarded-for'] + ', ' :
''
) + req.connection.remoteAddress
}
// always attach Via header to avoid loops, even if we're not proxying
headers['Via'] =
(req && req.headers['via']) ?
req.headers['via'] + ', ' :
''
headers['Via'] += '1.1 ' + this.server_id + ' (Sinopia)'
}
module.exports = Storage