Skip to content

Commit e83e20d

Browse files
authored
Merge pull request prerender#798 from prerender/custom-http-status-codes-for-rendering-errors
Added `renderErrorStatusCode` to `this.options`.
2 parents ad43c29 + 2d3fbd4 commit e83e20d

File tree

5 files changed

+51
-27
lines changed

5 files changed

+51
-27
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
All notable changes to this project will be documented in this file.
44
This project adheres to [Semantic Versioning](http://semver.org/).
55

6+
## 5.21.6
7+
8+
- Added `renderErrorStatusCode` to `this.options`. We are returning with this status code in case of rendering error.
9+
610
## 5.21.5 - 2024-07-10
711

812
- Spawn chrome process as a direct descendant of root process, and not through extra shell (this is required for chrome restarts to work properly)

lib/browsers/chrome.js

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ chrome.loadUrlThenWaitForPageLoadEvent = function (tab, url, onNavigated) {
491491
var finished = false;
492492
const { Page, Emulation } = tab;
493493

494-
util.debug(`Enabling page url=${url}`)
494+
util.debug(`Enabling page url=${url}`);
495495

496496
Page.enable()
497497
.then(() => {
@@ -501,7 +501,9 @@ chrome.loadUrlThenWaitForPageLoadEvent = function (tab, url, onNavigated) {
501501
let pageLoadTimeout =
502502
tab.prerender.pageLoadTimeout || this.options.pageLoadTimeout;
503503

504-
util.log(`Start loading page url=${url}, pageLoadTimeout=${pageLoadTimeout}`)
504+
util.log(
505+
`Start loading page url=${url}, pageLoadTimeout=${pageLoadTimeout}`,
506+
);
505507

506508
var checkIfDone = () => {
507509
if (finished) {
@@ -523,7 +525,7 @@ chrome.loadUrlThenWaitForPageLoadEvent = function (tab, url, onNavigated) {
523525
if (doneLoading && !finished) {
524526
finished = true;
525527

526-
util.debug(`Page is done loading url=${tab.prerender.url}`)
528+
util.debug(`Page is done loading url=${tab.prerender.url}`);
527529

528530
if (
529531
(tab.prerender.renderType === 'jpeg' ||
@@ -544,9 +546,11 @@ chrome.loadUrlThenWaitForPageLoadEvent = function (tab, url, onNavigated) {
544546
})
545547
.catch((e) => {
546548
finished = true;
547-
util.log(`Chrome connection closed during request url=${url}, err=${e}`);
549+
util.log(
550+
`Chrome connection closed during request url=${url}, err=${e}`,
551+
);
548552
tab.prerender.errors.push(ChromeConnectionClosed);
549-
tab.prerender.statusCode = 504;
553+
tab.prerender.statusCode = this.options.renderErrorStatusCode;
550554
tab.prerender.statusCodeReason =
551555
'Chrome connection closed during request';
552556
reject();
@@ -556,7 +560,9 @@ chrome.loadUrlThenWaitForPageLoadEvent = function (tab, url, onNavigated) {
556560
setTimeout(() => {
557561
if (!finished) {
558562
finished = true;
559-
util.log(`page timed out url=${tab.prerender.url} requestsInFlight=${tab.prerender.numRequestsInFlight}`)
563+
util.log(
564+
`page timed out url=${tab.prerender.url} requestsInFlight=${tab.prerender.numRequestsInFlight}`,
565+
);
560566

561567
const timeoutStatusCode =
562568
tab.prerender.timeoutStatusCode || this.options.timeoutStatusCode;
@@ -623,7 +629,7 @@ chrome.loadUrlThenWaitForPageLoadEvent = function (tab, url, onNavigated) {
623629
})
624630
.catch(() => {
625631
util.log('invalid URL sent to Chrome:', tab.prerender.url);
626-
tab.prerender.statusCode = 504;
632+
tab.prerender.statusCode = this.options.renderErrorStatusCode;
627633
tab.prerender.statusCodeReason =
628634
'invalid URL sent to Chrome: ' + tab.prerender.url;
629635
finished = true;
@@ -632,7 +638,7 @@ chrome.loadUrlThenWaitForPageLoadEvent = function (tab, url, onNavigated) {
632638
})
633639
.catch((err) => {
634640
util.log(`unable to load URL err=${err}, url=${url}`);
635-
tab.prerender.statusCode = 504;
641+
tab.prerender.statusCode = this.options.renderErrorStatusCode;
636642
tab.prerender.statusCodeReason = 'unable to load URL';
637643
tab.prerender.errors.push(UnableToLoadURL);
638644
finished = true;
@@ -696,8 +702,10 @@ chrome.checkIfPageIsDoneLoading = function (tab) {
696702
);
697703
})
698704
.catch((err) => {
699-
util.log(`unable to evaluate javascript on the page err=${err}, url=${url}`);
700-
tab.prerender.statusCode = 504;
705+
util.log(
706+
`unable to evaluate javascript on the page err=${err}, url=${url}`,
707+
);
708+
tab.prerender.statusCode = this.options.renderErrorStatusCode;
701709
tab.prerender.statusCodeReason =
702710
'unable to evaluate javascript on the page';
703711
tab.prerender.errors.push(UnableToEvaluateJavascript);
@@ -731,8 +739,10 @@ chrome.executeJavascript = function (tab, javascript) {
731739
resolve();
732740
})
733741
.catch((err) => {
734-
util.log(`unable to evaluate javascript on the page err=${err}, url=${url}`)
735-
tab.prerender.statusCode = 504;
742+
util.log(
743+
`unable to evaluate javascript on the page err=${err}, url=${url}`,
744+
);
745+
tab.prerender.statusCode = this.options.renderErrorStatusCode;
736746
tab.prerender.statusCodeReason =
737747
'unable to evaluate javascript on the page';
738748
tab.prerender.errors.push(UnableToEvaluateJavascript);
@@ -741,8 +751,12 @@ chrome.executeJavascript = function (tab, javascript) {
741751
}, 1000);
742752
})
743753
.catch((err) => {
744-
util.log(`unable to evaluate javascript on the page err=${err}, url=${url}`)
745-
tab.prerender.statusCode = 504;
754+
util.log(
755+
`unable to evaluate javascript on the page err=${err}, url=${url}`,
756+
);
757+
tab.prerender.statusCode = this.options.renderErrorStatusCode;
758+
tab.prerender.statusCodeReason =
759+
'unable to evaluate javascript on the page';
746760
tab.prerender.errors.push(UnableToEvaluateJavascript);
747761
reject();
748762
});
@@ -776,7 +790,8 @@ chrome.parseHtmlFromPage = function (tab) {
776790

777791
var parseTimeout = setTimeout(() => {
778792
util.log(`parse html timed out url=${url}`);
779-
tab.prerender.statusCode = 504;
793+
tab.prerender.statusCode = this.options.renderErrorStatusCode;
794+
tab.prerender.statusCodeReason = 'parse html timed out';
780795
tab.prerender.errors.push(ParseHTMLTimedOut);
781796
reject();
782797
}, 5000);
@@ -791,7 +806,7 @@ chrome.parseHtmlFromPage = function (tab) {
791806
.then((resp) => {
792807
tab.prerender.content = resp.result.value;
793808
if (tab.prerender.content === undefined) {
794-
tab.prerender.statusCode = 504;
809+
throw new Error('Unable to parse HTML');
795810
}
796811
return tab.Runtime.evaluate({
797812
expression:
@@ -822,7 +837,8 @@ chrome.parseHtmlFromPage = function (tab) {
822837
.catch((err) => {
823838
util.log(`unable to parse HTML url=${url}, error=${err}`);
824839

825-
tab.prerender.statusCode = 504;
840+
tab.prerender.statusCode = this.options.renderErrorStatusCode;
841+
tab.prerender.statusCodeReason = 'unable to parse HTML';
826842
tab.prerender.errors.push(UnableToParseHTML);
827843
clearTimeout(parseTimeout);
828844
reject();
@@ -834,7 +850,8 @@ chrome.captureScreenshot = function (tab, format, fullpage) {
834850
return new Promise((resolve, reject) => {
835851
var parseTimeout = setTimeout(() => {
836852
util.log('capture screenshot timed out for', tab.prerender.url);
837-
tab.prerender.statusCode = 504;
853+
tab.prerender.statusCode = this.options.renderErrorStatusCode;
854+
tab.prerender.statusCodeReason = 'capture screenshot timed out';
838855
tab.prerender.errors.push(CaptureScreenshotTimedOut);
839856
reject();
840857
}, 10000);
@@ -864,7 +881,7 @@ chrome.captureScreenshot = function (tab, format, fullpage) {
864881
})
865882
.catch((err) => {
866883
util.log('unable to capture screenshot:', err);
867-
tab.prerender.statusCode = 504;
884+
tab.prerender.statusCode = this.options.renderErrorStatusCode;
868885
tab.prerender.statusCodeReason = 'unable to capture screenshot';
869886
tab.prerender.errors.push(UnableToCaptureScreenshot);
870887
clearTimeout(parseTimeout);
@@ -878,7 +895,7 @@ chrome.printToPDF = function (tab, options) {
878895
return new Promise((resolve, reject) => {
879896
var parseTimeout = setTimeout(() => {
880897
util.log('print pdf timed out for', tab.prerender.url);
881-
tab.prerender.statusCode = 504;
898+
tab.prerender.statusCode = this.options.renderErrorStatusCode;
882899
tab.prerender.statusCodeReason =
883900
'print pdf timed out for ' + tab.prerender.url;
884901
tab.prerender.errors.push(PrintPdfTimedOut);
@@ -893,7 +910,7 @@ chrome.printToPDF = function (tab, options) {
893910
})
894911
.catch((err) => {
895912
util.log('unable to capture pdf:', err);
896-
tab.prerender.statusCode = 504;
913+
tab.prerender.statusCode = this.options.renderErrorStatusCode;
897914
tab.prerender.statusCodeReason = 'unable to capture pdf';
898915

899916
tab.prerender.errors.push(UnableToCapturePdf);

lib/server.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ const BROWSER_TRY_RESTART_PERIOD =
2323
const BROWSER_DEBUGGING_PORT = process.env.BROWSER_DEBUGGING_PORT || 9222;
2424

2525
const TIMEOUT_STATUS_CODE = process.env.TIMEOUT_STATUS_CODE;
26+
const RENDERING_ERROR_STATUS_CODE = process.env.RENDERING_ERROR_STATUS_CODE || 504;
2627

2728
const PARSE_SHADOW_DOM = process.env.PARSE_SHADOW_DOM || false;
2829

@@ -52,6 +53,7 @@ server.init = function (options) {
5253
this.options.browserDebuggingPort || BROWSER_DEBUGGING_PORT;
5354
this.options.timeoutStatusCode =
5455
this.options.timeoutStatusCode || TIMEOUT_STATUS_CODE;
56+
this.options.renderErrorStatusCode = this.options.renderErrorStatusCode || RENDERING_ERROR_STATUS_CODE;
5557
this.options.parseShadowDom = this.options.parseShadowDom || PARSE_SHADOW_DOM;
5658
this.options.browserTryRestartPeriod =
5759
this.options.browserTryRestartPeriod || BROWSER_TRY_RESTART_PERIOD;
@@ -431,7 +433,8 @@ server.firePluginEvent = function (methodName, req, res) {
431433
};
432434

433435
server._send = function (req, res) {
434-
req.prerender.statusCode = parseInt(req.prerender.statusCode) || 504;
436+
req.prerender.statusCode = parseInt(req.prerender.statusCode) || this.options.renderErrorStatusCode;
437+
435438
let contentTypes = {
436439
jpeg: 'image/jpeg',
437440
png: 'image/png',
@@ -478,7 +481,7 @@ server._send = function (req, res) {
478481

479482
res.removeHeader('Content-Encoding');
480483

481-
if (req.prerender.statusCode === 504 && req.prerender.statusCodeReason) {
484+
if (req.prerender.statusCodeReason) {
482485
res.setHeader('x-prerender-504-reason', req.prerender.statusCodeReason);
483486
}
484487

@@ -510,4 +513,4 @@ server._send = function (req, res) {
510513
);
511514
};
512515

513-
module.exports = server;
516+
module.exports = server;

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"author": "Prerender.io",
33
"name": "prerender",
44
"description": "Service to prerender Javascript rendered pages for SEO",
5-
"version": "5.21.5",
5+
"version": "5.21.6",
66
"license": "MIT",
77
"repository": {
88
"type": "git",

0 commit comments

Comments
 (0)