Skip to content
This repository was archived by the owner on Feb 20, 2023. It is now read-only.

Commit a8f6cdd

Browse files
committed
Fix tests and abort if content-length does not match
1 parent 9834e72 commit a8f6cdd

File tree

11 files changed

+957
-618
lines changed

11 files changed

+957
-618
lines changed

__tests__/lib/brotli/middleware.test.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ describe('brotli middleware', () => {
1313

1414
const middleware = require('../../../lib/brotli/middleware');
1515

16-
expect(middleware({ request, response })).resolves.toEqual({
16+
await expect(middleware({ request, response })).resolves.toEqual({
1717
request,
1818
response,
1919
});
@@ -29,7 +29,7 @@ describe('brotli middleware', () => {
2929

3030
const middleware = require('../../../lib/brotli/middleware');
3131

32-
expect(middleware({ request, response })).resolves.toEqual({
32+
await expect(middleware({ request, response })).resolves.toEqual({
3333
request,
3434
response,
3535
});
@@ -95,14 +95,14 @@ describe('brotli middleware', () => {
9595
});
9696
jest.mock('../../../lib/brotli/compress', () => {
9797
return jest.fn(() => {
98-
throw new Error();
98+
throw new Error('Expected error message');
9999
});
100100
});
101101

102102
const middleware = require('../../../lib/brotli/middleware');
103103

104-
expect(
104+
await expect(
105105
middleware({ request: {}, response: { body: '' } })
106-
).rejects.toThrow();
106+
).rejects.toThrow('Expected error message');
107107
});
108108
});

__tests__/lib/fetch/middleware.test.js

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ describe('fetch middleware', () => {
1212
});
1313

1414
nock('http://example.com')
15+
.persist()
16+
.replyContentLength()
1517
.get('/server-error')
1618
.reply(503, '');
1719

1820
const middleware = require('../../../lib/fetch/middleware');
1921

20-
expect(middleware({}, { headers: {} })).rejects.toThrow();
22+
await expect(middleware({}, { headers: {} })).rejects.toThrow('Response code 503');
2123
});
2224

2325
test('rejects promise when resource is not found', async () => {
@@ -26,12 +28,14 @@ describe('fetch middleware', () => {
2628
});
2729

2830
nock('http://example.com')
31+
.persist()
32+
.replyContentLength()
2933
.get('/not-found')
3034
.reply(404, '');
3135

3236
const middleware = require('../../../lib/fetch/middleware');
3337

34-
expect(middleware({}, { headers: {} })).rejects.toThrow();
38+
await expect(middleware({}, { headers: {} })).rejects.toThrow('Response code 404');
3539
});
3640

3741
test('fills response object with origin response headers', async () => {
@@ -41,7 +45,7 @@ describe('fetch middleware', () => {
4145

4246
nock('http://example.com')
4347
.get('/origin-response-headers')
44-
.reply(200, '', { 'content-type': 'text/html' });
48+
.reply(200, '', { 'content-type': 'text/html', 'content-length': 0 });
4549

4650
const middleware = require('../../../lib/fetch/middleware');
4751
const { response } = await middleware({
@@ -59,7 +63,7 @@ describe('fetch middleware', () => {
5963

6064
nock('http://example.com')
6165
.get('/origin-response-headers')
62-
.reply(200, '', { 'content-type': 'text/html' });
66+
.reply(200, '', { 'content-type': 'text/html', 'content-length': '0' });
6367

6468
const middleware = require('../../../lib/fetch/middleware');
6569
const { response } = await middleware({
@@ -79,7 +83,7 @@ describe('fetch middleware', () => {
7983

8084
nock('http://example.com')
8185
.get('/origin-response-headers')
82-
.reply(200, body, { 'content-type': 'text/html' });
86+
.reply(200, body, { 'content-type': 'text/html', 'content-length': body.length.toString() });
8387

8488
const middleware = require('../../../lib/fetch/middleware');
8589
const { response } = await middleware({
@@ -100,7 +104,7 @@ describe('fetch middleware', () => {
100104
.reply(function(uri, requestBody, cb) {
101105
expect(this.req.headers['accept-encoding']).toBe('text/html');
102106

103-
cb(null, [200, '', {}]);
107+
cb(null, [200, '', {'content-length': '0'}]);
104108
});
105109

106110
const middleware = require('../../../lib/fetch/middleware');
@@ -128,7 +132,7 @@ describe('fetch middleware', () => {
128132
.reply(function(uri, requestBody, cb) {
129133
expect(this.req.headers['host']).toBe('example.com');
130134

131-
cb(null, [200, '', {}]);
135+
cb(null, [200, '', {'content-length': '0'}]);
132136
});
133137

134138
const middleware = require('../../../lib/fetch/middleware');

__tests__/lib/gzip/compress.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ describe('gzip compress', () => {
1919
test('rejects the promise when gzip errors', async () => {
2020
const compress = require('../../../lib/gzip/compress');
2121

22-
expect(compress(-1)).rejects.toThrow();
22+
await expect(compress(-1)).rejects.toThrow('Received type number');
2323
});
2424

2525
test('result output is smaller then input', async () => {

__tests__/lib/gzip/middleware.test.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ describe('gzip middleware', () => {
1515

1616
const middleware = require('../../../lib/gzip/middleware');
1717

18-
expect(middleware({ request, response })).resolves.toEqual({
18+
await expect(middleware({ request, response })).resolves.toEqual({
1919
request,
2020
response,
2121
});
@@ -31,7 +31,7 @@ describe('gzip middleware', () => {
3131

3232
const middleware = require('../../../lib/gzip/middleware');
3333

34-
expect(middleware({ request, response })).resolves.toEqual({
34+
await expect(middleware({ request, response })).resolves.toEqual({
3535
request,
3636
response,
3737
});
@@ -96,12 +96,12 @@ describe('gzip middleware', () => {
9696
});
9797
jest.mock('../../../lib/gzip/compress', () => {
9898
return jest.fn(() => {
99-
throw new Error();
99+
throw new Error('Expected error message');
100100
});
101101
});
102102

103103
const middleware = require('../../../lib/gzip/middleware');
104104

105-
expect(middleware({ request: {}, response: {} })).rejects.toThrow();
105+
await expect(middleware({ request: {}, response: {} })).rejects.toThrow('Expected error message');
106106
});
107107
});

__tests__/lib/imagemin/middleware.test.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ describe('imagemin middleware', () => {
3434

3535
const middleware = require('../../../lib/imagemin/middleware');
3636

37-
expect(middleware({ request, response })).resolves.toEqual({
37+
await expect(middleware({ request, response })).resolves.toEqual({
3838
request,
3939
response,
4040
});
@@ -144,14 +144,14 @@ describe('imagemin middleware', () => {
144144
});
145145
jest.mock('../../../lib/imagemin/compress', () => {
146146
return jest.fn(() => {
147-
throw new Error();
147+
throw new Error('Expected error message');
148148
});
149149
});
150150

151151
const middleware = require('../../../lib/imagemin/middleware');
152152

153-
expect(
153+
await expect(
154154
middleware({ request: {}, response: { body: '' } })
155-
).rejects.toThrow();
155+
).rejects.toThrow('Expected error message');
156156
});
157157
});

__tests__/lib/webp/middleware.test.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ describe('webp middleware', () => {
2222

2323
const middleware = require('../../../lib/brotli/middleware');
2424

25-
expect(middleware({ request, response })).resolves.toEqual({
25+
await expect(middleware({ request, response })).resolves.toEqual({
2626
request,
2727
response,
2828
});
@@ -38,7 +38,7 @@ describe('webp middleware', () => {
3838

3939
const middleware = require('../../../lib/brotli/middleware');
4040

41-
expect(middleware({ request, response })).resolves.toEqual({
41+
await expect(middleware({ request, response })).resolves.toEqual({
4242
request,
4343
response,
4444
});
@@ -136,14 +136,14 @@ describe('webp middleware', () => {
136136
});
137137
jest.mock('../../../lib/webp/compress', () => {
138138
return jest.fn(() => {
139-
throw new Error();
139+
throw new Error('Expected error message');
140140
});
141141
});
142142

143143
const middleware = require('../../../lib/webp/middleware');
144144

145-
expect(
145+
await expect(
146146
middleware({ request: {}, response: { body: '' } })
147-
).rejects.toThrow();
147+
).rejects.toThrow('Expected error message');
148148
});
149149
});

__tests__/origin-request.test.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,14 @@ describe('origin-request handler', () => {
4141
};
4242
nock('http://example.com')
4343
.get('/gzip-supported.js')
44-
.reply(200, '', { 'content-type': 'text/javascript' });
44+
.reply(200, '', { 'content-type': 'text/javascript', 'content-length': '0' });
4545

4646
const callback = jest.fn();
4747

4848
await originRequest.handler(event, null, callback);
4949

5050
expect(callback).toHaveBeenCalledWith(null, {
51-
body: 'H4sIAAAAAAACEwMAAAAAAAAAAAA=',
51+
body: 'H4sIAAAAAAACAwMAAAAAAAAAAAA=',
5252
bodyEncoding: 'base64',
5353
headers: {
5454
'content-encoding': [
@@ -122,7 +122,7 @@ describe('origin-request handler', () => {
122122
};
123123
nock('http://example.com')
124124
.get('/brotli-supported.js')
125-
.reply(200, '', { 'content-type': 'text/javascript' });
125+
.reply(200, '', { 'content-type': 'text/javascript', 'content-length': '0' });
126126

127127
const callback = jest.fn();
128128

@@ -176,7 +176,7 @@ describe('origin-request handler', () => {
176176
};
177177
nock('http://example.com')
178178
.get('/brotli-gzip-supported.js')
179-
.reply(200, '', { 'content-type': 'text/javascript' });
179+
.reply(200, '', { 'content-type': 'text/javascript', 'content-length': '0' });
180180

181181
const callback = jest.fn();
182182

@@ -228,7 +228,7 @@ describe('origin-request handler', () => {
228228
};
229229
nock('http://example.com')
230230
.get('/not-found.js')
231-
.reply(404, '', { 'content-type': 'text/javascript' });
231+
.reply(404, '', { 'content-type': 'text/javascript', 'content-length': '0' });
232232

233233
const callback = jest.fn();
234234

@@ -268,7 +268,7 @@ describe('origin-request handler', () => {
268268
};
269269
nock('http://example.com')
270270
.get('/server-error.js')
271-
.reply(503, '', { 'content-type': 'text/javascript' });
271+
.reply(503, '', { 'content-type': 'text/javascript', 'content-length': '0' });
272272

273273
const callback = jest.fn();
274274

lib/fetch/middleware.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ module.exports = async ({ request }) => {
1717
headers: requestToHeaders(request),
1818
});
1919

20+
const contentLength = !!originResponse.headers ? Number(originResponse.headers['content-length']) : NaN;
21+
if (contentLength !== originResponse.body.length) {
22+
throw Error('Invalid content-length');
23+
}
24+
2025
const response = {
2126
status: originResponse.statusCode,
2227
statusDescription: originResponse.statusMessage,

lib/responseHelper.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ const headersToLambda = headers => {
5757

5858
const requestToHeaders = request => {
5959
const convertedHeaders = {};
60-
const headers = request.headers;
60+
const headers = !!request ? request.headers : {};
6161
for (let name in headers) {
6262
if (!allowedRequestHeaders.includes(name)) {
6363
continue;

package.json

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@
1919
"eslint-plugin-node": "^11.0.0",
2020
"eslint-plugin-prettier": "^3.1.2",
2121
"husky": "^4.2.1",
22-
"jest": "^25.1.0",
22+
"jest": "^26.6.3",
23+
"jest-plugin-must-assert": "^2.0.0",
2324
"lint-staged": "^10.0.3",
24-
"nock": "^12.0.3",
25+
"nock": "^13.0.4",
2526
"prettier": "^2.0.4"
2627
},
2728
"lint-staged": {
@@ -64,6 +65,13 @@
6465
}
6566
}
6667
},
68+
"jest": {
69+
"testPathIgnorePatterns": [
70+
"/node_modules/",
71+
".history"
72+
],
73+
"setupFilesAfterEnv": ["jest-plugin-must-assert"]
74+
},
6775
"dependencies": {
6876
"@types/jest": "^25.2.1",
6977
"got": "^10.3.0",

0 commit comments

Comments
 (0)