浏览代码

Add proxy to the setting (#213)

Gaël Métais 8 年之前
父节点
当前提交
317b0fc4d7

+ 5 - 1
bin/cli.js

@@ -15,7 +15,8 @@ var cli = meow({
         'Options:',
         '  --device             Use "phone" or "tablet" to simulate a mobile device (by user-agent and viewport size).',
         '  --screenshot         Will take a screenshot and use this value as the output path. It needs to end with ".png".',
-        '  --wait-for-selector  Once the page is loaded, Phantomas will wait until the given CSS selector matches some elements.',
+        //'  --wait-for-selector  Once the page is loaded, Phantomas will wait until the given CSS selector matches some elements.',
+        '  --proxy              Sets an HTTP proxy to pass through. Syntax is "host:port".',
         '  --cookie             Adds a cookie on the main domain.',
         '  --auth-user          Basic HTTP authentication username.',
         '  --auth-pass          Basic HTTP authentication password.',
@@ -56,6 +57,9 @@ options.device = cli.flags.device || 'desktop';
 // Wait for CSS selector
 options.waitForSelector = cli.flags.waitForSelector || null;
 
+// Proxy
+options.proxy = cli.flags.proxy || null;
+
 // Cookie
 options.cookie = cli.flags.cookie || null;
 

+ 1 - 0
front/src/js/services/apiService.js

@@ -11,6 +11,7 @@ apiService.factory('API', ['$location', 'Runs', 'Results', function($location, R
                 screenshot: true,
                 device: settings.device,
                 waitForSelector: settings.waitForSelector,
+                proxy: settings.proxy,
                 cookie: settings.cookie,
                 authUser: settings.authUser,
                 authPass: settings.authPass,

+ 10 - 0
front/src/views/index.html

@@ -61,6 +61,16 @@
                     </div>
                 </div>
             </div>
+            <div>
+                <div class="label">
+                    HTTP proxy
+                    <span class="settingsTooltip">
+                        <span class="icon-question"></span>
+                        <div><b>HTTP proxy</b><br><br>Insert here your proxy settings with the format "host:port".<br><br>Example: "192.168.10.0:3333"</div>
+                    </span>
+                </div>
+                <div><input type="text" name="proxy" ng-model="settings.proxy" /></div>
+            </div>
             <div>
                 <div class="label">
                     Block domains

+ 2 - 0
lib/server/controllers/apiController.js

@@ -32,6 +32,7 @@ var ApiController = function(app) {
                 partialResult: req.body.partialResult || null,
                 screenshot: req.body.screenshot || false,
                 device: req.body.device || 'desktop',
+                proxy: req.body.proxy || null,
                 waitForSelector: req.body.waitForSelector || null,
                 cookie: req.body.cookie || null,
                 authUser: req.body.authUser || null,
@@ -71,6 +72,7 @@ var ApiController = function(app) {
             var runOptions = {
                 screenshot: run.params.screenshot ? screenshot.getTmpFilePath() : false,
                 device: run.params.device,
+                proxy: run.params.proxy,
                 waitForSelector: run.params.waitForSelector,
                 cookie: run.params.cookie,
                 authUser: run.params.authUser,

+ 6 - 0
lib/tools/phantomas/phantomasWrapper.js

@@ -59,6 +59,12 @@ var PhantomasWrapper = function() {
             ].join(',')
         };
 
+        // Proxy option can't be set to null or undefined...
+        // this is why it's set now and not in the object above
+        if (task.options.proxy) {
+            options.proxy = task.options.proxy;
+        }
+
         // Output the command line for debugging purpose
         debug('If you want to reproduce the phantomas task only, copy the following command line:');
         var optionsString = '';

+ 12 - 3
lib/tools/redownload/redownload.js

@@ -45,6 +45,14 @@ var Redownload = function() {
             };
         }
 
+        var proxy = null;
+        if (data.params && data.params.options && data.params.options.proxy) {
+            proxy = data.params.options.proxy;
+            if (proxy.indexOf('http:') === -1) {
+                proxy = 'http://' + proxy;
+            }
+        }
+
         // Prevent a bug with the font analyzer on empty pages
         var differentCharacters = '';
         if (data.toolsResults.phantomas.offenders.differentCharacters && data.toolsResults.phantomas.offenders.differentCharacters.length > 0) {
@@ -55,7 +63,7 @@ var Redownload = function() {
         var redownloadList = requestsList.map(function(entry) {
             return function(callback) {
                 
-                redownloadEntry(entry, httpAuth)
+                redownloadEntry(entry, httpAuth, proxy)
 
                 .then(contentTypeChecker.checkContentType)
 
@@ -558,7 +566,7 @@ var Redownload = function() {
     }
 
 
-    function redownloadEntry(entry, httpAuth) {
+    function redownloadEntry(entry, httpAuth, proxy) {
         var deferred = Q.defer();
         
         function downloadError(message) {
@@ -610,7 +618,8 @@ var Redownload = function() {
             method: entry.method,
             url: entry.url,
             headers: reqHeaders,
-            timeout: REQUEST_TIMEOUT
+            timeout: REQUEST_TIMEOUT,
+            proxy: proxy
         };
 
         // Basic auth