Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
request.rawBody is now a buffer
  • Loading branch information
Eran Hammer committed Apr 4, 2013
1 parent 328ec2f commit 7147b4a
Show file tree
Hide file tree
Showing 6 changed files with 100 additions and 151 deletions.
4 changes: 1 addition & 3 deletions lib/pack.js
Expand Up @@ -408,9 +408,7 @@ internals.getSourceFilePath = function () {

for (var i = 0, il = stack.length; i < il; ++i) {
var stackLine = stack[i];
if (stackLine[3] === 'internals.Pack.require' ||
stackLine[3] === 'internals.Pack.allow.scoped.require') { // The file that calls require is next

if (stackLine[3].lastIndexOf('.require') === stackLine[3].length - 8) { // The file that calls require is next
callerFile = stack[i + 1][0];
break;
}
Expand Down
67 changes: 34 additions & 33 deletions lib/payload.js
Expand Up @@ -66,10 +66,6 @@ exports.read = function (request, next) {

// Read incoming body

var isGZip = (req.headers['content-encoding'] === 'gzip');
var encoding = isGZip ? 'base64' : 'utf8';
req.setEncoding(encoding);

req.on('close', function () {

return finish(Boom.internal('Request closed before finished reading'));
Expand All @@ -80,76 +76,81 @@ exports.read = function (request, next) {
return finish(Boom.internal('Request error before finished reading: ' + err));
});

var payload = '';
var buffers = [];
var buffersLength = 0

req.on('readable', function () {

var chunk = req.read();
if (!chunk) {
return;
}

if (payload.length + chunk.length > request.server.settings.payload.maxBytes) {
if (buffersLength + chunk.length > request.server.settings.payload.maxBytes) {
return finish(Boom.badRequest('Payload size greater than maximum allowed: ' + request.server.settings.payload.maxBytes));
}

payload += chunk;
buffers.push(chunk);
buffersLength += chunk.length;
});

req.on('end', function () {

if (isBailed) {
return; // next() already called
}

var unzip = function () {
var review = function () {

var payloadBuf = new Buffer(payload, encoding);
if (!internals.isDeflate(payloadBuf) && !internals.isGzip(payloadBuf)) {
return finish(Boom.badRequest('Invalid compressed payload'));
if (isBailed) {
return; // next() already called
}

Zlib.unzip(payloadBuf, function (err, buffer) { // Err shouldn't exist since the buffer is validated above
var payload = Buffer.concat(buffers, buffersLength);

var unzipped = buffer.toString();
request.rawBody = unzipped;
return parse(unzipped);
});
if (payload.length &&
req.headers['content-encoding'] === 'gzip') {

if (!internals.isDeflate(payload) && !internals.isGzip(payload)) {
return finish(Boom.badRequest('Invalid compressed payload'));
}

Zlib.unzip(payload, function (err, unzipped) { // Err shouldn't exist since the buffer is validated above

return parse(unzipped);
});

return;
}

parse(payload);
};

var parse = function (result) {
var parse = function (payload) {

if (level !== 'parse') { // 'raw'
request.rawBody = (payload.length ? payload : null);

if (level !== 'parse') { // 'raw'
return finish();
}

request.payload = {};

if (!result) {
if (!payload.length) {
return finish();
}

// Set parser

internals.parse(result, req.headers, function (err, payload) {
internals.parse(payload.toString('utf8'), req.headers, function (err, result) {

if (err) {
return finish(err);
}

request.payload = payload;
request.payload = result;
return finish();
});
};

if (isGZip) {
return unzip();
}

request.rawBody = payload;
parse(payload);
review();
});

req.read(0);
};


Expand Down
1 change: 1 addition & 0 deletions lib/response/generic.js
Expand Up @@ -166,6 +166,7 @@ internals.Generic.prototype._transmit = function (request, callback) {
});
}

self.peek.emit('end');
request.raw.res.end();

callback();
Expand Down
1 change: 1 addition & 0 deletions lib/response/raw.js
Expand Up @@ -78,6 +78,7 @@ internals.Raw.prototype._transmit = function (request, callback) {
this.begin(function (err) { // Flush header if begin() not called. Too late to handle the error (ignored).

delete self.write;
self.peek.emit('end');
self._request.raw.res.end();
return callback();
});
Expand Down
2 changes: 1 addition & 1 deletion test/integration/auth.js
Expand Up @@ -652,7 +652,7 @@ describe('Auth', function () {

setTimeout(function () {

this.emit('end');
this.push(null);
}, 5);
};

Expand Down

0 comments on commit 7147b4a

Please sign in to comment.