Comparing version 0.0.11 to 0.0.12
@@ -52,2 +52,3 @@ var fs = require('fs'), | ||
cfg.fileHwm = this.opts.fileHwm; | ||
cfg.defCharset = this.opts.defCharset; | ||
this._parser = new type(this, cfg); | ||
@@ -54,0 +55,0 @@ return; |
@@ -1,2 +0,2 @@ | ||
// TODO: | ||
// TODO: | ||
// * support 1 nested multipart level | ||
@@ -27,2 +27,3 @@ // (see second multipart example here: | ||
parsedConType = cfg.parsedConType, | ||
defCharset = cfg.defCharset || 'utf8', | ||
fileopts = typeof cfg.fileHwm === 'number' | ||
@@ -102,3 +103,3 @@ ? { highWaterMark: cfg.fileHwm } | ||
if (charset === undefined) | ||
charset = 'iso-8859-1'; | ||
charset = defCharset; | ||
@@ -105,0 +106,0 @@ if (header['content-disposition']) { |
@@ -32,3 +32,3 @@ var jsencoding = require('../../deps/encoding/encoding'), | ||
if (charset === undefined) | ||
charset = 'ISO-8859-1'; | ||
charset = cfg.defCharset || 'utf8'; | ||
@@ -35,0 +35,0 @@ this.decoder = new Decoder(); |
@@ -0,3 +1,14 @@ | ||
var jsencoding = require('../deps/encoding/encoding'); | ||
var RE_ENCODED = /%([a-fA-F0-9]{2})/g; | ||
function encodedReplacer(match, byte) { | ||
return String.fromCharCode(parseInt(byte, 16)); | ||
} | ||
exports.parseParams = function(str) { | ||
var res = [], inval = false, inquote = false, escaping = false, p = 0, | ||
var res = [], | ||
state = 'key', | ||
charset = '', | ||
inquote = false, | ||
escaping = false, | ||
p = 0, | ||
tmp = ''; | ||
@@ -17,3 +28,3 @@ | ||
inquote = false; | ||
inval = false; | ||
state = 'key'; | ||
} else | ||
@@ -26,4 +37,15 @@ inquote = true; | ||
escaping = false; | ||
if (!inval && str[i] === '=') { | ||
inval = true; | ||
if ((state === 'charset' || state === 'lang') && str[i] === "'") { | ||
if (state === 'charset') { | ||
state = 'lang'; | ||
charset = tmp.substring(1); | ||
} else | ||
state = 'value'; | ||
tmp = ''; | ||
continue; | ||
} else if (state === 'key' && (str[i] === '*' || str[i] === '=')) { | ||
if (str[i] === '*') | ||
state = 'charset'; | ||
else | ||
state = 'value'; | ||
res[p] = [tmp, undefined]; | ||
@@ -33,3 +55,13 @@ tmp = ''; | ||
} else if (!inquote && str[i] === ';') { | ||
inval = false; | ||
state = 'key'; | ||
if (charset) { | ||
if (tmp.length && jsencoding.encodingExists(charset)) { | ||
try { | ||
tmp = jsencoding.TextDecoder(charset) | ||
.decode(new Buffer(tmp.replace(RE_ENCODED, encodedReplacer), | ||
'binary')); | ||
} catch(e) {} | ||
} | ||
charset = ''; | ||
} | ||
if (res[p] === undefined) | ||
@@ -48,2 +80,9 @@ res[p] = tmp; | ||
if (tmp.length) { | ||
if (charset && jsencoding.encodingExists(charset)) { | ||
try { | ||
tmp = jsencoding.TextDecoder(charset) | ||
.decode(new Buffer(tmp.replace(RE_ENCODED, encodedReplacer), | ||
'binary')); | ||
} catch(e) {} | ||
} | ||
if (res[p] === undefined) | ||
@@ -73,2 +112,4 @@ res[p] = tmp; | ||
Decoder.prototype.write = function(str) { | ||
// Replace '+' with ' ' before decoding | ||
str = str.replace(RE_PLUS, ' '); | ||
var res = ''; | ||
@@ -101,3 +142,3 @@ var i = 0, p = 0, len = str.length; | ||
res += str.substring(p); | ||
return res.replace(RE_PLUS, ' '); | ||
return res; | ||
}; | ||
@@ -104,0 +145,0 @@ Decoder.prototype.reset = function() { |
{ "name": "busboy", | ||
"version": "0.0.11", | ||
"version": "0.0.12", | ||
"author": "Brian White <mscdex@mscdex.net>", | ||
@@ -4,0 +4,0 @@ "description": "A streaming parser for HTML form data for node.js", |
@@ -208,2 +208,4 @@ Description | ||
* **defCharset** - _string_ - Default character set to use when one isn't defined (Default: 'utf8'). | ||
* **limits** - _object_ - Various limits on incoming data. Valid properties are: | ||
@@ -210,0 +212,0 @@ |
@@ -50,4 +50,4 @@ var UrlEncoded = require('../lib/types/urlencoded'), | ||
}, | ||
{ source: ['foo=bar+baz'], | ||
expected: [['foo', 'bar baz', false, false]], | ||
{ source: ['foo=bar+baz%2Bquux'], | ||
expected: [['foo', 'bar baz+quux', false, false]], | ||
what: 'Assigned value with (plus) space' | ||
@@ -136,4 +136,4 @@ }, | ||
var cfg = { | ||
limits: v.limits, | ||
headers: null, | ||
limits: v.limits, | ||
headers: null, | ||
parsedConType: parsedConType | ||
@@ -168,2 +168,2 @@ }; | ||
return '[' + group + what + ']: ' + msg; | ||
} | ||
} |
@@ -49,2 +49,10 @@ var Decoder = require('../lib/utils').Decoder; | ||
}, | ||
{ source: ['5%2B5%3D10'], | ||
expected: '5+5=10', | ||
what: 'Encoded plus' | ||
}, | ||
{ source: ['5+%2B+5+%3D+10'], | ||
expected: '5 + 5 = 10', | ||
what: 'Spaces and encoded plus' | ||
}, | ||
].forEach(function(v) { | ||
@@ -55,4 +63,6 @@ var dec = new Decoder(), result = ''; | ||
}); | ||
var msg = '[' + group + v.what + ']: decoded string mismatch'; | ||
var msg = '[' + group + v.what + ']: decoded string mismatch.\n' | ||
+ 'Saw: ' + result + '\n' | ||
+ 'Expected: ' + v.expected; | ||
assert.deepEqual(result, v.expected, msg); | ||
}); |
@@ -25,2 +25,26 @@ var parseParams = require('../lib/utils').parseParams; | ||
}, | ||
{ source: "text/plain; filename*=iso-8859-1'en'%A3%20rates", | ||
expected: ['text/plain', ['filename', '£ rates']], | ||
what: 'Extended parameter (RFC 5987) with language' | ||
}, | ||
{ source: "text/plain; filename*=utf-8''%c2%a3%20and%20%e2%82%ac%20rates", | ||
expected: ['text/plain', ['filename', '£ and € rates']], | ||
what: 'Extended parameter (RFC 5987) without language' | ||
}, | ||
{ source: "text/plain; filename*=utf-8''%E6%B5%8B%E8%AF%95%E6%96%87%E6%A1%A3", | ||
expected: ['text/plain', ['filename', '测试文档']], | ||
what: 'Extended parameter (RFC 5987) without language #2' | ||
}, | ||
{ source: "text/plain; filename*=iso-8859-1'en'%A3%20rates; altfilename*=utf-8''%c2%a3%20and%20%e2%82%ac%20rates", | ||
expected: ['text/plain', ['filename', '£ rates'], ['altfilename', '£ and € rates']], | ||
what: 'Multiple extended parameters (RFC 5987) with mixed charsets' | ||
}, | ||
{ source: "text/plain; filename*=iso-8859-1'en'%A3%20rates; altfilename=\"foobarbaz\"", | ||
expected: ['text/plain', ['filename', '£ rates'], ['altfilename', 'foobarbaz']], | ||
what: 'Mixed regular and extended parameters (RFC 5987)' | ||
}, | ||
{ source: "text/plain; filename=\"foobarbaz\"; altfilename*=iso-8859-1'en'%A3%20rates", | ||
expected: ['text/plain', ['filename', 'foobarbaz'], ['altfilename', '£ rates']], | ||
what: 'Mixed regular and extended parameters (RFC 5987) #2' | ||
}, | ||
].forEach(function(v) { | ||
@@ -27,0 +51,0 @@ var result = parseParams(v.source), |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
661031
5213
225