From 9c355abb2b8dd07993cec527ecaddabccf314c74 Mon Sep 17 00:00:00 2001 From: Chainarong Tangsurakit <chainarong.t@linecorp.com> Date: Tue, 12 Jun 2018 19:09:01 +0700 Subject: [PATCH 1/3] #47 Enchancement to take screenshot only successful status code (2xx, 3xx) --- README.md | 3 +++ src/capture.js | 51 ++++++++++++++++++++++++++++++++------------------ src/options.js | 1 + 3 files changed, 37 insertions(+), 18 deletions(-) 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/src/capture.js b/src/capture.js index 4aabeb7..eb184f0 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,25 +88,39 @@ 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) - ); + request({ + uri: options.url, + method: 'HEAD' + }, function (error, response) { + if (error) { + onFinish(error) + } - utils.execProcess(cmd, opts, (error) => { - if (config.compress) { - minimizeImage(outputFile, config.storage, () => onFinish(error)); - } else { - 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(), From 432b48294564bd75c3352a4a0b25c3ad4913f13f Mon Sep 17 00:00:00 2001 From: Chainarong Tangsurakit <chainarong.t@linecorp.com> Date: Wed, 13 Jun 2018 10:31:56 +0700 Subject: [PATCH 2/3] eslint fix --- src/capture.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/capture.js b/src/capture.js index eb184f0..97db44b 100644 --- a/src/capture.js +++ b/src/capture.js @@ -93,12 +93,12 @@ function runCapturingProcess(options, config, outputFile, base64, onFinish) { method: 'HEAD' }, function (error, response) { if (error) { - onFinish(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}`)) + return onFinish(new Error(`URL Status code is ${response.statusCode}`)); } const scriptFile = utils.filePath(SCRIPT_FILE), @@ -120,7 +120,7 @@ function runCapturingProcess(options, config, outputFile, base64, onFinish) { onFinish(error); } }); - }) + }); } From 7f90f466ee7f60372590f43fc89d63f88ef53bda Mon Sep 17 00:00:00 2001 From: Chainarong Tangsurakit <chainarong.t@linecorp.com> Date: Wed, 13 Jun 2018 16:02:14 +0700 Subject: [PATCH 3/3] add parameter in usage.html --- public/js/app.js | 4 ++-- public/usage.html | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) 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">