@@ -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
1819exports . 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 = / ( .* ) < \/ h e a d > / ;
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 = / ( .* ) < \/ h e a d > / ;
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 ) ;
0 commit comments