diff --git a/lib/requestify.js b/lib/requestify.js index 9293f1b..b0e29ab 100644 --- a/lib/requestify.js +++ b/lib/requestify.js @@ -8,6 +8,8 @@ var http = require('http'), cache = require('./cache'), https = require('https'), logger = require('./logger'), + /*content-types that requires buffer encoding*/ + BUFFER_RESPONSE_TYPES = ['gzip', 'deflate'], redisTransporter = require('./cache-transporters/redis-transporter'); var Requestify = (function() { @@ -69,6 +71,14 @@ var Requestify = (function() { }); } + /** + * Based on response content type, returns true if Buffered response is needed + * @param {ttp.ServerResponse} res + **/ + function isBufferResponse(res){ + return BUFFER_RESPONSE_TYPES.indexOf(res.headers['content-encoding']) !== -1; + } + /** * Executes the given request object. * @param {Request} request @@ -97,12 +107,22 @@ var Requestify = (function() { clearTimeout(timeout); var response = new Response(res.statusCode, res.headers); - res.setEncoding(responseEncoding); + + if(!isBufferResponse(res)){ + res.setEncoding(responseEncoding); + } + res.on('data', function(chunk) { - response.setChunk(chunk); + if(isBufferResponse(res)){ + response.setResponseChunks(chunk); + } + response.setChunk(chunk); }); res.on('end', function() { + if(isBufferResponse(res)){ + response.finalizeBuffer(); + } if (isSuccessful(response.code)) { storeCache(request.getFullUrl(), response.getCode(), response.getHeaders(), response.body, request.cache); defer.resolve(response); @@ -187,7 +207,7 @@ var Requestify = (function() { * @returns {string|Requestify} */ responseEncoding: function(value) { - if (!value) { + if (value === undefined) { return responseEncoding; } diff --git a/lib/response.js b/lib/response.js index 2592d4c..5b4a04a 100644 --- a/lib/response.js +++ b/lib/response.js @@ -13,9 +13,11 @@ var url = require('url'), * @constructor */ function Response(code, headers, body) { + this.responseChunks = []; this.code = code; this.headers = headers; this.body = body || ''; + this.bufferedResponse; } /** @@ -25,16 +27,37 @@ function Response(code, headers, body) { */ Response.prototype.setChunk = function(chunk) { this.body += chunk; + return this; +}; + +/** + * Sets one response body chunk to the response body + * @param {buffer} chunk + * @returns {Response} + */ +Response.prototype.setResponseChunks = function(chunk) { + this.responseChunks.push(chunk); + return this; +}; +/** +* +*/ +Response.prototype.finalizeBuffer = function(chunk) { + //console.log('totalBufLength:' + totalBufLength); + //console.dir(responseChunks); + this.bufferedResponse = Buffer.concat(this.responseChunks); return this; }; + /** * Returns the decoded || raw string of the request * @returns {string|object} */ Response.prototype.getBody = function() { - var responseType = this.getHeader('content-type'); + var responseType = this.getHeader('content-type'), + zlib; if (!responseType) { return this.body; @@ -47,7 +70,7 @@ Response.prototype.getBody = function() { console.log('Failed parsing expected JSON response, returned raw response'); return this.body; } - } + } if (responseType.indexOf('application/x-www-form-urlencoded') !== -1) { return queryString.parse(this.body);