From befb015947b42a68c674908aa1fc67dfbb15fbd1 Mon Sep 17 00:00:00 2001 From: Punit Mittal Date: Tue, 5 Dec 2017 16:22:53 +0530 Subject: [PATCH 1/2] Added support for content-encoding --- lib/proxy.js | 6 ++--- lib/server.js | 69 +++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 56 insertions(+), 19 deletions(-) diff --git a/lib/proxy.js b/lib/proxy.js index 1c352dc..020aee9 100644 --- a/lib/proxy.js +++ b/lib/proxy.js @@ -13,13 +13,13 @@ var ProxyServer = { }; var proxy = http.request(options, function (res) { - var data = ''; + var chunks = []; res.on('data', function(chunk) { - data += chunk; + chunks.push(chunk); }); res.on('end', function() { //Replace - callback(res, data); + callback(res, Buffer.concat(chunks)); }); }).on('error', function(e) { client_res.writeHead(500); diff --git a/lib/server.js b/lib/server.js index f01d7e0..4f2160f 100644 --- a/lib/server.js +++ b/lib/server.js @@ -13,7 +13,8 @@ var Log = require('./logger'), send = require('send'), vm = require('vm'), CircularJSON = require('circular-json'), - resolve = require('resolve'); + resolve = require('resolve'), + zlib = require('zlib'); exports.Server = function Server(bsClient, workers, config, callback) { var testFilePaths = (Array.isArray(config.test_path) ? config.test_path : [ config.test_path ]) @@ -205,25 +206,61 @@ exports.Server = function Server(bsClient, workers, config, callback) { response.end(); }; + var patchResponse = function (data, headers, callback) { + var mimeType = mime.lookup(filename); + var finalData = data; + if (mimeType === 'text/html') { + var matcher = /(.*)<\/head>/; + var patch = getReporterPatch(); + finalData = data.replace(matcher, patch); + headers['content-length'] = finalData.length; + } + callback && callback(finalData, headers); + }; + + var checkForEncodingAndPatch = function (responseData, headers, callback) { + var encoding = headers['content-encoding']; + if (encoding === 'gzip') { + zlib.gunzip(responseData, function (err, decoded) { + if (!err) { + patchResponse(decoded && decoded.toString(), headers, function (data, headers) { + zlib.gzip(data, function (err, encoded) { + if (!err) { + callback && callback(encoded, headers); + } + }); + }); + } + }); + } else if (encoding === 'deflate') { + zlib.inflate(responseData, function (err, decoded) { + if (!err) { + patchResponse(decoded && decoded.toString(), headers, function (data, headers) { + zlib.deflate(data, function (err, encoded) { + if (!err) { + callback && callback(encoded, headers); + } + }); + }); + } + }); + } else { + patchResponse(responseData, headers, function (data, headers) { + callback && callback(data, headers); + }); + } + }; + if (!doNotUseProxy && config.test_server) { - proxyServer.onRequest(request, response, config.test_server, function(remote_response, response_data) { - var mimeType = mime.lookup(filename); - var final_data = response_data; + proxyServer.onRequest(request, response, config.test_server, function (remote_response, response_data) { var headers = remote_response.headers; - if (mimeType === 'text/html') { - var matcher = /(.*)<\/head>/; - var patch = getReporterPatch(); - final_data = response_data.replace(matcher, patch); - headers['content-length'] = final_data.length; - } - response.writeHead(remote_response.statusCode, headers); - response.write(final_data); - response.end(); - return; + checkForEncodingAndPatch(response_data, headers, function (data, headers) { + response.writeHead(remote_response.statusCode, headers); + response.write(data); + response.end(); + }); }); - } else { - fs.exists(filename, function(exists) { if (!exists) { sendError(response,'file not found', 404); From 4d876735b13fa51401c09da844e4ee37a0b27c4a Mon Sep 17 00:00:00 2001 From: Punit Mittal Date: Tue, 5 Dec 2017 18:24:41 +0530 Subject: [PATCH 2/2] Bumped version to 0.6.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 19650ac..a9a2844 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "browserstack-runner", "description": "A command line interface to run browser tests over BrowserStack", - "version": "0.5.2", + "version": "0.6.0", "homepage": "https://github.com/browserstack/browserstack-runner", "repository": { "type": "git",