diff --git a/README.md b/README.md
index 679c3a9..b0ca353 100644
--- a/README.md
+++ b/README.md
@@ -349,6 +349,9 @@ Few rules:
cookies
Configure cookies that will be contained in request. HTTP message body is the easiest way for sending cookies to Manet (ex: using JSON format).
+ onlySuccessfulStatusCode
+ Take screenshot only when http status code is below 400 (a.k.a. 2xx, 3xx). (default is `false`)
+
diff --git a/public/js/app.js b/public/js/app.js
index a8718d5..c7f2093 100644
--- a/public/js/app.js
+++ b/public/js/app.js
@@ -9,12 +9,12 @@
'user', 'password',
'callback', 'headers', 'clipRect',
'force', 'selector','selectorCrop','selectorCropPadding',
- 'engine'
+ 'engine', 'onlySuccessfulStatusCode'
];
function cleanBoolValue(name, value) {
return ((value && (name === 'js' || name === 'images')) ||
- (!value && (name === 'force' || name === 'selectorCrop'))) ? null : value;
+ (!value && (name === 'force' || name === 'selectorCrop' || name === 'onlySuccessfulStatusCode'))) ? null : value;
}
function readOptions() {
diff --git a/public/usage.html b/public/usage.html
index 07e9a1b..e74f761 100644
--- a/public/usage.html
+++ b/public/usage.html
@@ -117,6 +117,11 @@ Website screenshot service
+
+
+
+
+
diff --git a/src/capture.js b/src/capture.js
index 4aabeb7..97db44b 100644
--- a/src/capture.js
+++ b/src/capture.js
@@ -4,6 +4,7 @@ const _ = require('lodash'),
fs = require('fs-extra'),
logger = require('winston'),
path = require('path'),
+ request = require('request'),
squirrel = require('squirrel'),
crypto = require('crypto'),
utils = require('./utils'),
@@ -87,24 +88,38 @@ function minimizeImage(src, dest, cb) {
/* Screenshot capturing runner */
function runCapturingProcess(options, config, outputFile, base64, onFinish) {
- const scriptFile = utils.filePath(SCRIPT_FILE),
- command = cliCommand(config).split(/[ ]+/),
- cmd = _.union(command, [scriptFile, base64, outputFile]),
- opts = {
- timeout: config.timeout
- };
-
- logger.debug(
- 'Options for script: %s, base64: %s, command: %s',
- JSON.stringify(options), base64, JSON.stringify(cmd)
- );
-
- utils.execProcess(cmd, opts, (error) => {
- if (config.compress) {
- minimizeImage(outputFile, config.storage, () => onFinish(error));
- } else {
+ request({
+ uri: options.url,
+ method: 'HEAD'
+ }, function (error, response) {
+ if (error) {
onFinish(error);
}
+
+ if (!!options.onlySuccessfulStatusCode && response.statusCode >= 400) {
+ logger.error(`URL Status code is ${response.statusCode}`);
+ return onFinish(new Error(`URL Status code is ${response.statusCode}`));
+ }
+
+ const scriptFile = utils.filePath(SCRIPT_FILE),
+ command = cliCommand(config).split(/[ ]+/),
+ cmd = _.union(command, [scriptFile, base64, outputFile]),
+ opts = {
+ timeout: config.timeout
+ };
+
+ logger.debug(
+ 'Options for script: %s, base64: %s, command: %s',
+ JSON.stringify(options), base64, JSON.stringify(cmd)
+ );
+
+ utils.execProcess(cmd, opts, (error) => {
+ if (config.compress) {
+ minimizeImage(outputFile, config.storage, () => onFinish(error));
+ } else {
+ onFinish(error);
+ }
+ });
});
}
@@ -130,7 +145,7 @@ function screenshot(options, config, onFinish) {
logger.info('Capture site screenshot: "%s"', options.url);
- if (options.force || !conf.cache) {
+ if (options.force || !conf.cache || options.onlySuccessfulStatusCode) {
retrieveImageFromSite();
} else {
fs.exists(file, (exists) =>
diff --git a/src/options.js b/src/options.js
index 84a8727..0586e85 100644
--- a/src/options.js
+++ b/src/options.js
@@ -12,6 +12,7 @@ const _ = require('lodash'),
function createSchema() {
return joi.object().keys({
force: joi.boolean(),
+ onlySuccessfulStatusCode: joi.boolean(),
url: joi.string().trim().required(),
agent: joi.string().trim(),
headers: joi.string().trim(),