diff --git a/README.md b/README.md index 679c3a9..b0ca353 100644 --- a/README.md +++ b/README.md @@ -349,6 +349,9 @@ Few rules: <dt>cookies</dt> <dd>Configure <a href="http://phantomjs.org/api/phantom/property/cookies.html">cookies</a> that will be contained in request. HTTP message body is the easiest way for sending cookies to Manet (ex: using JSON format).</dd> + <dt>onlySuccessfulStatusCode</dt> + <dd>Take screenshot only when http status code is below 400 (a.k.a. 2xx, 3xx). (default is `false`)</dd> + </dl> 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 @@ <h2>Website screenshot service</h2> <input id="force" name="force" type="checkbox"> </div> + <div class="pure-control-group"> + <label for="onlySuccessfulStatusCode">Only Successful Status Code</label> + <input id="onlySuccessfulStatusCode" name="onlySuccessfulStatusCode" type="checkbox"> + </div> + <div class="pure-control-group"> <label for="selector">Wait for DOM element</label> <input id="selector" name="selector" type="text" maxlength="1024" placeholder="CSS selector"> 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(),