Skip to content

Commit b33bb15

Browse files
fix(sirv): ensure cached headers are not mutated (#75)
* fix(sirv): a request with range headers appends Content-Length, Content-Range and Accept-Ranges for all subsequent requests. Fixes #55 * fix: only spread `headers` when needed * Added test case for range requests mutating subsequent request non range request headers * Cleaned up test for range request header mutation. First set of asserts are already covered by other tests * chore: add `dev` test variant * chore: bad copy-paste * sigh Co-authored-by: Luke Edwards <luke.edwards05@gmail.com>
1 parent f8ea6a8 commit b33bb15

File tree

2 files changed

+47
-2
lines changed

2 files changed

+47
-2
lines changed

packages/sirv/index.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ function send(req, res, file, stats, headers={}) {
5959
let code=200, tmp, opts={}
6060

6161
if (tmp = res.getHeader('content-type')) {
62-
headers['Content-Type'] = tmp;
62+
headers = { ...headers, 'Content-Type': tmp };
6363
}
6464

6565
if (req.headers.range) {
@@ -73,7 +73,8 @@ function send(req, res, file, stats, headers={}) {
7373
res.statusCode = 416;
7474
return res.end();
7575
}
76-
76+
77+
if (!tmp) headers = { ...headers };
7778
headers['Content-Range'] = `bytes ${start}-${end}/${stats.size}`;
7879
headers['Content-Length'] = (end - start + 1);
7980
headers['Accept-Ranges'] = 'bytes';

tests/sirv.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -979,6 +979,50 @@ ranges('should throw `416` when range cannot be met (overflow)', async () => {
979979
}
980980
});
981981

982+
ranges('should not mutate response headers on subsequent non-Range requests :: dev', async () => {
983+
let server = utils.http({ dev: true });
984+
985+
try {
986+
let file = await utils.lookup('bundle.67329.js', 'utf8');
987+
988+
let headers = { Range: 'bytes=0-10' };
989+
let res1 = await server.send('GET', '/bundle.67329.js', { headers });
990+
assert.ok(res1.headers['content-range']);
991+
assert.ok(res1.headers['accept-ranges']);
992+
993+
let res2 = await server.send('GET', '/bundle.67329.js');
994+
assert.is(res2.statusCode, 200);
995+
assert.is(res2.headers['content-length'], `${file.size}`);
996+
assert.not(res2.headers['content-range']);
997+
assert.not(res2.headers['accept-ranges']);
998+
999+
} finally {
1000+
server.close();
1001+
}
1002+
});
1003+
1004+
ranges('should not mutate response headers on subsequent non-Range requests :: prod', async () => {
1005+
let server = utils.http({ dev: false });
1006+
1007+
try {
1008+
let file = await utils.lookup('bundle.67329.js', 'utf8');
1009+
1010+
let headers = { Range: 'bytes=0-10' };
1011+
let res1 = await server.send('GET', '/bundle.67329.js', { headers });
1012+
assert.ok(res1.headers['content-range']);
1013+
assert.ok(res1.headers['accept-ranges']);
1014+
1015+
let res2 = await server.send('GET', '/bundle.67329.js');
1016+
assert.is(res2.statusCode, 200);
1017+
assert.is(res2.headers['content-length'], `${file.size}`);
1018+
assert.not(res2.headers['content-range']);
1019+
assert.not(res2.headers['accept-ranges']);
1020+
1021+
} finally {
1022+
server.close();
1023+
}
1024+
});
1025+
9821026
ranges.run();
9831027

9841028
// ---

0 commit comments

Comments
 (0)