Skip to content

Commit 2e28f70

Browse files
authored
Merge pull request #192 from punitx/support_content_encoding
Added support for content-encoding
2 parents db935b0 + 4d87673 commit 2e28f70

File tree

3 files changed

+57
-20
lines changed

3 files changed

+57
-20
lines changed

lib/proxy.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ var ProxyServer = {
1313
};
1414

1515
var proxy = http.request(options, function (res) {
16-
var data = '';
16+
var chunks = [];
1717
res.on('data', function(chunk) {
18-
data += chunk;
18+
chunks.push(chunk);
1919
});
2020
res.on('end', function() {
2121
//Replace
22-
callback(res, data);
22+
callback(res, Buffer.concat(chunks));
2323
});
2424
}).on('error', function(e) {
2525
client_res.writeHead(500);

lib/server.js

+53-16
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ var Log = require('./logger'),
1313
send = require('send'),
1414
vm = require('vm'),
1515
CircularJSON = require('circular-json'),
16-
resolve = require('resolve');
16+
resolve = require('resolve'),
17+
zlib = require('zlib');
1718

1819
exports.Server = function Server(bsClient, workers, config, callback) {
1920
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) {
205206
response.end();
206207
};
207208

209+
var patchResponse = function (data, headers, callback) {
210+
var mimeType = mime.lookup(filename);
211+
var finalData = data;
212+
if (mimeType === 'text/html') {
213+
var matcher = /(.*)<\/head>/;
214+
var patch = getReporterPatch();
215+
finalData = data.replace(matcher, patch);
216+
headers['content-length'] = finalData.length;
217+
}
218+
callback && callback(finalData, headers);
219+
};
220+
221+
var checkForEncodingAndPatch = function (responseData, headers, callback) {
222+
var encoding = headers['content-encoding'];
223+
if (encoding === 'gzip') {
224+
zlib.gunzip(responseData, function (err, decoded) {
225+
if (!err) {
226+
patchResponse(decoded && decoded.toString(), headers, function (data, headers) {
227+
zlib.gzip(data, function (err, encoded) {
228+
if (!err) {
229+
callback && callback(encoded, headers);
230+
}
231+
});
232+
});
233+
}
234+
});
235+
} else if (encoding === 'deflate') {
236+
zlib.inflate(responseData, function (err, decoded) {
237+
if (!err) {
238+
patchResponse(decoded && decoded.toString(), headers, function (data, headers) {
239+
zlib.deflate(data, function (err, encoded) {
240+
if (!err) {
241+
callback && callback(encoded, headers);
242+
}
243+
});
244+
});
245+
}
246+
});
247+
} else {
248+
patchResponse(responseData, headers, function (data, headers) {
249+
callback && callback(data, headers);
250+
});
251+
}
252+
};
253+
208254
if (!doNotUseProxy && config.test_server) {
209-
proxyServer.onRequest(request, response, config.test_server, function(remote_response, response_data) {
210-
var mimeType = mime.lookup(filename);
211-
var final_data = response_data;
255+
proxyServer.onRequest(request, response, config.test_server, function (remote_response, response_data) {
212256
var headers = remote_response.headers;
213-
if (mimeType === 'text/html') {
214-
var matcher = /(.*)<\/head>/;
215-
var patch = getReporterPatch();
216-
final_data = response_data.replace(matcher, patch);
217-
headers['content-length'] = final_data.length;
218-
}
219-
response.writeHead(remote_response.statusCode, headers);
220-
response.write(final_data);
221-
response.end();
222-
return;
257+
checkForEncodingAndPatch(response_data, headers, function (data, headers) {
258+
response.writeHead(remote_response.statusCode, headers);
259+
response.write(data);
260+
response.end();
261+
});
223262
});
224-
225263
} else {
226-
227264
fs.exists(filename, function(exists) {
228265
if (!exists) {
229266
sendError(response,'file not found', 404);

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "browserstack-runner",
33
"description": "A command line interface to run browser tests over BrowserStack",
4-
"version": "0.5.2",
4+
"version": "0.6.0",
55
"homepage": "https://github.com/browserstack/browserstack-runner",
66
"repository": {
77
"type": "git",

0 commit comments

Comments
 (0)