Added decoder for chunked HTTP encoding

This decoder will join up a HTTP response sent using chunked transfer encoding, raised in issue #168.

This is useful when attempting to extract files or gzipped responses sent using chunked transfer encoding, particularly when combined with the gunzip operation.
This commit is contained in:
Russell 2018-05-23 12:51:37 +00:00
parent dcc28438ff
commit 37a86b58e5
4 changed files with 31 additions and 0 deletions

View file

@ -150,6 +150,7 @@ const Categories = [
ops: [ ops: [
"HTTP request", "HTTP request",
"Strip HTTP headers", "Strip HTTP headers",
"Dechunk HTTP response",
"Parse User Agent", "Parse User Agent",
"Parse IP range", "Parse IP range",
"Parse IPv6 address", "Parse IPv6 address",

View file

@ -1846,6 +1846,13 @@ const OperationConfig = {
outputType: "string", outputType: "string",
args: [] args: []
}, },
"Dechunk HTTP response": {
module: "HTTP",
description: "Parses a HTTP response transferred using transfer-encoding:chunked",
inputType: "string",
outputType: "string",
args: []
},
"Parse User Agent": { "Parse User Agent": {
module: "HTTP", module: "HTTP",
description: "Attempts to identify and categorise information contained in a user-agent string.", description: "Attempts to identify and categorise information contained in a user-agent string.",

View file

@ -16,6 +16,7 @@ let OpModules = typeof self === "undefined" ? {} : self.OpModules || {};
OpModules.HTTP = { OpModules.HTTP = {
"HTTP request": HTTP.runHTTPRequest, "HTTP request": HTTP.runHTTPRequest,
"Strip HTTP headers": HTTP.runStripHeaders, "Strip HTTP headers": HTTP.runStripHeaders,
"Dechunk HTTP response": HTTP.runDechunk,
"Parse User Agent": HTTP.runParseUserAgent, "Parse User Agent": HTTP.runParseUserAgent,
}; };

View file

@ -37,6 +37,28 @@ const HTTP = {
return (headerEnd < 2) ? input : input.slice(headerEnd, input.length); return (headerEnd < 2) ? input : input.slice(headerEnd, input.length);
}, },
/**
* Dechunk response operation
*
* @param {string} input
* @param {Object[]} args}
* @returns {string}
*/
runDechunk: function(input, args) {
var chunks = [];
var chunkSizeEnd = input.indexOf("\n") + 1;
var lineEndings = input.charAt(chunkSizeEnd - 2) == "\r" ? "\r\n" : "\n";
var lineEndingsLength = lineEndings.length;
var chunkSize = parseInt(input.slice(0, chunkSizeEnd), 16);
while (!isNaN(chunkSize)) {
chunks.push(input.slice(chunkSizeEnd, chunkSize + chunkSizeEnd));
input = input.slice(chunkSizeEnd + chunkSize + lineEndingsLength);
chunkSizeEnd = input.indexOf(lineEndings) + lineEndingsLength;
chunkSize = parseInt(input.slice(0, chunkSizeEnd), 16);
}
return chunks.join('') + input;
},
/** /**
* Parse User Agent operation. * Parse User Agent operation.