Skip to content

Commit d416e1f

Browse files
authored
added check for resources greater than 100mb (#1858)
* added check for resources greater than 100mb * fixed coverage
1 parent a76ee38 commit d416e1f

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

packages/core/src/network.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,13 @@ async function saveResponseResource(network, request, session) {
467467
url,
468468
responseStatus: response?.status
469469
};
470+
// Checing for content length more than 100MB, to prevent websocket error which is governed by
471+
// maxPayload option of websocket defaulted to 100MB.
472+
// If content-length is more than our allowed 25MB, no need to process that resouce we can return log.
473+
let contentLength = parseInt(response.headers['Content-Length']);
474+
if (contentLength > MAX_RESOURCE_SIZE) {
475+
return log.debug('- Skipping resource larger than 25MB', meta);
476+
}
470477
let resource = network.intercept.getResource(url);
471478

472479
if (!resource || (!resource.root && !resource.provided && disableCache)) {
@@ -484,8 +491,6 @@ async function saveResponseResource(network, request, session) {
484491
return log.debug('- Skipping remote resource', meta);
485492
} else if (!body.length) {
486493
return log.debug('- Skipping empty response', meta);
487-
} else if (body.length > MAX_RESOURCE_SIZE) {
488-
return log.debug('- Skipping resource larger than 25MB', meta);
489494
} else if (!ALLOWED_STATUSES.includes(response.status)) {
490495
return log.debug(`- Skipping disallowed status [${response.status}]`, meta);
491496
} else if (!enableJavaScript && !ALLOWED_RESOURCES.includes(request.type)) {

packages/core/test/discovery.test.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,41 @@ describe('Discovery', () => {
535535
);
536536
});
537537

538+
it('skips file greater than 100MB', async () => {
539+
server.reply('/large.css', () => [200, 'text/css', 'A'.repeat(100_000_000)]);
540+
percy.loglevel('debug');
541+
542+
await percy.snapshot({
543+
name: 'test snapshot',
544+
url: 'http://localhost:8000',
545+
domSnapshot: testDOM.replace('style.css', 'large.css')
546+
});
547+
548+
await percy.idle();
549+
550+
expect(captured[0]).toEqual([
551+
jasmine.objectContaining({
552+
attributes: jasmine.objectContaining({
553+
'resource-url': jasmine.stringMatching(/^\/percy\.\d+\.log$/)
554+
})
555+
}),
556+
jasmine.objectContaining({
557+
attributes: jasmine.objectContaining({
558+
'resource-url': 'http://localhost:8000/'
559+
})
560+
}),
561+
jasmine.objectContaining({
562+
attributes: jasmine.objectContaining({
563+
'resource-url': 'http://localhost:8000/img.gif'
564+
})
565+
})
566+
]);
567+
568+
expect(logger.stderr).toContain(
569+
'[percy:core:discovery] - Skipping resource larger than 25MB'
570+
);
571+
});
572+
538573
it('does not capture duplicate root resources', async () => {
539574
let reDOM = dedent`
540575
<html><head></head><body>

0 commit comments

Comments
 (0)