Skip to content

Commit

Permalink
feat: use faster etag instead of koa-etag (#1409)
Browse files Browse the repository at this point in the history
* fix: should set weak etag avoid nginx(<1.7.3) remove it
  • Loading branch information
fengmk2 committed Nov 19, 2018
1 parent 300e0e6 commit a4a25f9
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 0 deletions.
32 changes: 32 additions & 0 deletions controllers/registry/package/list.js
@@ -1,11 +1,18 @@
'use strict';

var debug = require('debug')('cnpmjs.org:controllers:registry:package:list');
var utility = require('utility');
var packageService = require('../../../services/package');
var common = require('../../../lib/common');
var SyncModuleWorker = require('../../sync_module_worker');
var config = require('../../../config');

// https://forum.nginx.org/read.php?2,240120,240120#msg-240120
// should set weak etag avoid nginx remove it
function etag(objs) {
return 'W/"' + utility.md5(JSON.stringify(objs)) + '"';
}

/**
* list all version of a module
* GET /:name
Expand Down Expand Up @@ -124,6 +131,7 @@ module.exports = function* list() {

// set versions and times
var versions = {};
var allVersionString = '';
var times = {};
var attachments = {};
var createdTime = null;
Expand All @@ -139,6 +147,7 @@ module.exports = function* list() {
pkg.publish_time = pkg.publish_time || row.publish_time;

versions[pkg.version] = pkg;
allVersionString += pkg.version + ',';

var t = times[pkg.version] = row.publish_time ? new Date(row.publish_time) : row.gmt_modified;
if ((!distTags.latest && !latestMod) || distTags.latest === pkg.version) {
Expand Down Expand Up @@ -210,6 +219,13 @@ module.exports = function* list() {

debug('show module %s: %s, latest: %s', name, rev, latestMod.version);
this.jsonp = info;
// use faster etag
this.etag = etag([
modifiedTime,
distTags,
pkg.maintainers,
allVersionString,
]);
};

function* handleAbbreviatedMetaRequest(ctx, name, modifiedTime, tags, rows) {
Expand All @@ -224,6 +240,7 @@ function* handleAbbreviatedMetaRequest(ctx, name, modifiedTime, tags, rows) {

// set versions and times
var versions = {};
var allVersionString = '';
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
var pkg = row.package;
Expand All @@ -232,6 +249,7 @@ function* handleAbbreviatedMetaRequest(ctx, name, modifiedTime, tags, rows) {
pkg.publish_time = pkg.publish_time || row.publish_time;

versions[pkg.version] = pkg;
allVersionString += pkg.version + ',';

if ((!distTags.latest && !latestMod) || distTags.latest === pkg.version) {
latestMod = row;
Expand All @@ -257,6 +275,12 @@ function* handleAbbreviatedMetaRequest(ctx, name, modifiedTime, tags, rows) {

debug('show %j', info);
ctx.jsonp = info;
// use faster etag
ctx.etag = etag([
modifiedTime,
distTags,
allVersionString,
]);
}

function* handleAbbreviatedMetaRequestWithFullMeta(ctx, name, modifiedTime, tags, rows) {
Expand All @@ -272,6 +296,7 @@ function* handleAbbreviatedMetaRequestWithFullMeta(ctx, name, modifiedTime, tags

// set versions and times
var versions = {};
var allVersionString = '';
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
// pkg is string ... ignore it
Expand All @@ -298,6 +323,7 @@ function* handleAbbreviatedMetaRequestWithFullMeta(ctx, name, modifiedTime, tags
common.setDownloadURL(pkg, ctx);

versions[pkg.version] = pkg;
allVersionString += pkg.version + ',';

if ((!distTags.latest && !latestMod) || distTags.latest === pkg.version) {
latestMod = row;
Expand All @@ -323,4 +349,10 @@ function* handleAbbreviatedMetaRequestWithFullMeta(ctx, name, modifiedTime, tags

debug('show %j', info);
ctx.jsonp = info;
// use faster etag
ctx.etag = etag([
modifiedTime,
distTags,
allVersionString,
]);
}
10 changes: 10 additions & 0 deletions test/controllers/registry/package/list.test.js
Expand Up @@ -53,6 +53,7 @@ describe('test/controllers/registry/package/list.test.js', () => {
const pkg = data.versions[v];
assert(pkg.publish_time && typeof pkg.publish_time === 'number');
}
assert(/^W\/"\w{32}"$/.test(res.headers.etag));

// should 304
request(app)
Expand All @@ -74,6 +75,7 @@ describe('test/controllers/registry/package/list.test.js', () => {
assert(data.modified);
assert.deepEqual(data['dist-tags'], { latest: '1.0.0' });
assert(!data.time);
assert(/^W\/"\w{32}"$/.test(res.headers.etag));

// should 304
request(app)
Expand All @@ -95,6 +97,7 @@ describe('test/controllers/registry/package/list.test.js', () => {
assert(data.modified);
assert.deepEqual(data['dist-tags'], { latest: '1.0.0' });
assert(!data.time);
assert(/^W\/"\w{32}"$/.test(res.headers.etag));
})
.expect(200);
});
Expand All @@ -114,6 +117,7 @@ describe('test/controllers/registry/package/list.test.js', () => {
foouser: true
});
data.versions['0.0.1'].publish_time.should.equal(data.versions['0.0.1']._cnpm_publish_time);
assert(/^W\/"\w{32}"$/.test(res.headers.etag));
done();
});
});
Expand All @@ -122,6 +126,9 @@ describe('test/controllers/registry/package/list.test.js', () => {
request(app)
.get('/@cnpmtest/testmodule-list-1?callback=jsonp')
.expect(/jsonp\(\{/)
.expect(res => {
assert(/^W\/"\w{32}"$/.test(res.headers.etag));
})
.expect(200, done);
});

Expand Down Expand Up @@ -258,6 +265,7 @@ describe('test/controllers/registry/package/list.test.js', () => {
assert(pkg.publish_time && typeof pkg.publish_time === 'number');
assert(pkg._publish_on_cnpm === undefined);
}
assert(/^W\/"\w{32}"$/.test(res.headers.etag));
});
});

Expand Down Expand Up @@ -295,6 +303,7 @@ describe('test/controllers/registry/package/list.test.js', () => {
assert(pkg.publish_time && typeof pkg.publish_time === 'number');
assert(pkg._publish_on_cnpm === undefined);
}
assert(/^W\/"\w{32}"$/.test(res.headers.etag));
});
});

Expand All @@ -320,6 +329,7 @@ describe('test/controllers/registry/package/list.test.js', () => {
assert(pkg._publish_on_cnpm === undefined);
assert(pkg.dist.tarball.includes('.tgz?bucket=foo-us1&admin=1&other_urls=http'));
}
assert(/^W\/"\w{32}"$/.test(res.headers.etag));
});
});
});
Expand Down

0 comments on commit a4a25f9

Please sign in to comment.