|
@@ -0,0 +1,596 @@
|
|
|
|
+'use strict';
|
|
|
|
+
|
|
|
|
+function parseContentType(str) {
|
|
|
|
+ if (str.length === 0)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ const params = Object.create(null);
|
|
|
|
+ let i = 0;
|
|
|
|
+
|
|
|
|
+ // Parse type
|
|
|
|
+ for (; i < str.length; ++i) {
|
|
|
|
+ const code = str.charCodeAt(i);
|
|
|
|
+ if (TOKEN[code] !== 1) {
|
|
|
|
+ if (code !== 47/* '/' */ || i === 0)
|
|
|
|
+ return;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // Check for type without subtype
|
|
|
|
+ if (i === str.length)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ const type = str.slice(0, i).toLowerCase();
|
|
|
|
+
|
|
|
|
+ // Parse subtype
|
|
|
|
+ const subtypeStart = ++i;
|
|
|
|
+ for (; i < str.length; ++i) {
|
|
|
|
+ const code = str.charCodeAt(i);
|
|
|
|
+ if (TOKEN[code] !== 1) {
|
|
|
|
+ // Make sure we have a subtype
|
|
|
|
+ if (i === subtypeStart)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ if (parseContentTypeParams(str, i, params) === undefined)
|
|
|
|
+ return;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // Make sure we have a subtype
|
|
|
|
+ if (i === subtypeStart)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ const subtype = str.slice(subtypeStart, i).toLowerCase();
|
|
|
|
+
|
|
|
|
+ return { type, subtype, params };
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+function parseContentTypeParams(str, i, params) {
|
|
|
|
+ while (i < str.length) {
|
|
|
|
+ // Consume whitespace
|
|
|
|
+ for (; i < str.length; ++i) {
|
|
|
|
+ const code = str.charCodeAt(i);
|
|
|
|
+ if (code !== 32/* ' ' */ && code !== 9/* '\t' */)
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Ended on whitespace
|
|
|
|
+ if (i === str.length)
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ // Check for malformed parameter
|
|
|
|
+ if (str.charCodeAt(i++) !== 59/* ';' */)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ // Consume whitespace
|
|
|
|
+ for (; i < str.length; ++i) {
|
|
|
|
+ const code = str.charCodeAt(i);
|
|
|
|
+ if (code !== 32/* ' ' */ && code !== 9/* '\t' */)
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Ended on whitespace (malformed)
|
|
|
|
+ if (i === str.length)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ let name;
|
|
|
|
+ const nameStart = i;
|
|
|
|
+ // Parse parameter name
|
|
|
|
+ for (; i < str.length; ++i) {
|
|
|
|
+ const code = str.charCodeAt(i);
|
|
|
|
+ if (TOKEN[code] !== 1) {
|
|
|
|
+ if (code !== 61/* '=' */)
|
|
|
|
+ return;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // No value (malformed)
|
|
|
|
+ if (i === str.length)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ name = str.slice(nameStart, i);
|
|
|
|
+ ++i; // Skip over '='
|
|
|
|
+
|
|
|
|
+ // No value (malformed)
|
|
|
|
+ if (i === str.length)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ let value = '';
|
|
|
|
+ let valueStart;
|
|
|
|
+ if (str.charCodeAt(i) === 34/* '"' */) {
|
|
|
|
+ valueStart = ++i;
|
|
|
|
+ let escaping = false;
|
|
|
|
+ // Parse quoted value
|
|
|
|
+ for (; i < str.length; ++i) {
|
|
|
|
+ const code = str.charCodeAt(i);
|
|
|
|
+ if (code === 92/* '\\' */) {
|
|
|
|
+ if (escaping) {
|
|
|
|
+ valueStart = i;
|
|
|
|
+ escaping = false;
|
|
|
|
+ } else {
|
|
|
|
+ value += str.slice(valueStart, i);
|
|
|
|
+ escaping = true;
|
|
|
|
+ }
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ if (code === 34/* '"' */) {
|
|
|
|
+ if (escaping) {
|
|
|
|
+ valueStart = i;
|
|
|
|
+ escaping = false;
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ value += str.slice(valueStart, i);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ if (escaping) {
|
|
|
|
+ valueStart = i - 1;
|
|
|
|
+ escaping = false;
|
|
|
|
+ }
|
|
|
|
+ // Invalid unescaped quoted character (malformed)
|
|
|
|
+ if (QDTEXT[code] !== 1)
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // No end quote (malformed)
|
|
|
|
+ if (i === str.length)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ ++i; // Skip over double quote
|
|
|
|
+ } else {
|
|
|
|
+ valueStart = i;
|
|
|
|
+ // Parse unquoted value
|
|
|
|
+ for (; i < str.length; ++i) {
|
|
|
|
+ const code = str.charCodeAt(i);
|
|
|
|
+ if (TOKEN[code] !== 1) {
|
|
|
|
+ // No value (malformed)
|
|
|
|
+ if (i === valueStart)
|
|
|
|
+ return;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ value = str.slice(valueStart, i);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ name = name.toLowerCase();
|
|
|
|
+ if (params[name] === undefined)
|
|
|
|
+ params[name] = value;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return params;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+function parseDisposition(str, defDecoder) {
|
|
|
|
+ if (str.length === 0)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ const params = Object.create(null);
|
|
|
|
+ let i = 0;
|
|
|
|
+
|
|
|
|
+ for (; i < str.length; ++i) {
|
|
|
|
+ const code = str.charCodeAt(i);
|
|
|
|
+ if (TOKEN[code] !== 1) {
|
|
|
|
+ if (parseDispositionParams(str, i, params, defDecoder) === undefined)
|
|
|
|
+ return;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const type = str.slice(0, i).toLowerCase();
|
|
|
|
+
|
|
|
|
+ return { type, params };
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+function parseDispositionParams(str, i, params, defDecoder) {
|
|
|
|
+ while (i < str.length) {
|
|
|
|
+ // Consume whitespace
|
|
|
|
+ for (; i < str.length; ++i) {
|
|
|
|
+ const code = str.charCodeAt(i);
|
|
|
|
+ if (code !== 32/* ' ' */ && code !== 9/* '\t' */)
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Ended on whitespace
|
|
|
|
+ if (i === str.length)
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ // Check for malformed parameter
|
|
|
|
+ if (str.charCodeAt(i++) !== 59/* ';' */)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ // Consume whitespace
|
|
|
|
+ for (; i < str.length; ++i) {
|
|
|
|
+ const code = str.charCodeAt(i);
|
|
|
|
+ if (code !== 32/* ' ' */ && code !== 9/* '\t' */)
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Ended on whitespace (malformed)
|
|
|
|
+ if (i === str.length)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ let name;
|
|
|
|
+ const nameStart = i;
|
|
|
|
+ // Parse parameter name
|
|
|
|
+ for (; i < str.length; ++i) {
|
|
|
|
+ const code = str.charCodeAt(i);
|
|
|
|
+ if (TOKEN[code] !== 1) {
|
|
|
|
+ if (code === 61/* '=' */)
|
|
|
|
+ break;
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // No value (malformed)
|
|
|
|
+ if (i === str.length)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ let value = '';
|
|
|
|
+ let valueStart;
|
|
|
|
+ let charset;
|
|
|
|
+ //~ let lang;
|
|
|
|
+ name = str.slice(nameStart, i);
|
|
|
|
+ if (name.charCodeAt(name.length - 1) === 42/* '*' */) {
|
|
|
|
+ // Extended value
|
|
|
|
+
|
|
|
|
+ const charsetStart = ++i;
|
|
|
|
+ // Parse charset name
|
|
|
|
+ for (; i < str.length; ++i) {
|
|
|
|
+ const code = str.charCodeAt(i);
|
|
|
|
+ if (CHARSET[code] !== 1) {
|
|
|
|
+ if (code !== 39/* '\'' */)
|
|
|
|
+ return;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Incomplete charset (malformed)
|
|
|
|
+ if (i === str.length)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ charset = str.slice(charsetStart, i);
|
|
|
|
+ ++i; // Skip over the '\''
|
|
|
|
+
|
|
|
|
+ //~ const langStart = ++i;
|
|
|
|
+ // Parse language name
|
|
|
|
+ for (; i < str.length; ++i) {
|
|
|
|
+ const code = str.charCodeAt(i);
|
|
|
|
+ if (code === 39/* '\'' */)
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Incomplete language (malformed)
|
|
|
|
+ if (i === str.length)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ //~ lang = str.slice(langStart, i);
|
|
|
|
+ ++i; // Skip over the '\''
|
|
|
|
+
|
|
|
|
+ // No value (malformed)
|
|
|
|
+ if (i === str.length)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ valueStart = i;
|
|
|
|
+
|
|
|
|
+ let encode = 0;
|
|
|
|
+ // Parse value
|
|
|
|
+ for (; i < str.length; ++i) {
|
|
|
|
+ const code = str.charCodeAt(i);
|
|
|
|
+ if (EXTENDED_VALUE[code] !== 1) {
|
|
|
|
+ if (code === 37/* '%' */) {
|
|
|
|
+ let hexUpper;
|
|
|
|
+ let hexLower;
|
|
|
|
+ if (i + 2 < str.length
|
|
|
|
+ && (hexUpper = HEX_VALUES[str.charCodeAt(i + 1)]) !== -1
|
|
|
|
+ && (hexLower = HEX_VALUES[str.charCodeAt(i + 2)]) !== -1) {
|
|
|
|
+ const byteVal = (hexUpper << 4) + hexLower;
|
|
|
|
+ value += str.slice(valueStart, i);
|
|
|
|
+ value += String.fromCharCode(byteVal);
|
|
|
|
+ i += 2;
|
|
|
|
+ valueStart = i + 1;
|
|
|
|
+ if (byteVal >= 128)
|
|
|
|
+ encode = 2;
|
|
|
|
+ else if (encode === 0)
|
|
|
|
+ encode = 1;
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ // '%' disallowed in non-percent encoded contexts (malformed)
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ value += str.slice(valueStart, i);
|
|
|
|
+ value = convertToUTF8(value, charset, encode);
|
|
|
|
+ if (value === undefined)
|
|
|
|
+ return;
|
|
|
|
+ } else {
|
|
|
|
+ // Non-extended value
|
|
|
|
+
|
|
|
|
+ ++i; // Skip over '='
|
|
|
|
+
|
|
|
|
+ // No value (malformed)
|
|
|
|
+ if (i === str.length)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ if (str.charCodeAt(i) === 34/* '"' */) {
|
|
|
|
+ valueStart = ++i;
|
|
|
|
+ let escaping = false;
|
|
|
|
+ // Parse quoted value
|
|
|
|
+ for (; i < str.length; ++i) {
|
|
|
|
+ const code = str.charCodeAt(i);
|
|
|
|
+ if (code === 92/* '\\' */) {
|
|
|
|
+ if (escaping) {
|
|
|
|
+ valueStart = i;
|
|
|
|
+ escaping = false;
|
|
|
|
+ } else {
|
|
|
|
+ value += str.slice(valueStart, i);
|
|
|
|
+ escaping = true;
|
|
|
|
+ }
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ if (code === 34/* '"' */) {
|
|
|
|
+ if (escaping) {
|
|
|
|
+ valueStart = i;
|
|
|
|
+ escaping = false;
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ value += str.slice(valueStart, i);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ if (escaping) {
|
|
|
|
+ valueStart = i - 1;
|
|
|
|
+ escaping = false;
|
|
|
|
+ }
|
|
|
|
+ // Invalid unescaped quoted character (malformed)
|
|
|
|
+ if (QDTEXT[code] !== 1)
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // No end quote (malformed)
|
|
|
|
+ if (i === str.length)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ ++i; // Skip over double quote
|
|
|
|
+ } else {
|
|
|
|
+ valueStart = i;
|
|
|
|
+ // Parse unquoted value
|
|
|
|
+ for (; i < str.length; ++i) {
|
|
|
|
+ const code = str.charCodeAt(i);
|
|
|
|
+ if (TOKEN[code] !== 1) {
|
|
|
|
+ // No value (malformed)
|
|
|
|
+ if (i === valueStart)
|
|
|
|
+ return;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ value = str.slice(valueStart, i);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ value = defDecoder(value, 2);
|
|
|
|
+ if (value === undefined)
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ name = name.toLowerCase();
|
|
|
|
+ if (params[name] === undefined)
|
|
|
|
+ params[name] = value;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return params;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+function getDecoder(charset) {
|
|
|
|
+ let lc;
|
|
|
|
+ while (true) {
|
|
|
|
+ switch (charset) {
|
|
|
|
+ case 'utf-8':
|
|
|
|
+ case 'utf8':
|
|
|
|
+ return decoders.utf8;
|
|
|
|
+ case 'latin1':
|
|
|
|
+ case 'ascii': // TODO: Make these a separate, strict decoder?
|
|
|
|
+ case 'us-ascii':
|
|
|
|
+ case 'iso-8859-1':
|
|
|
|
+ case 'iso8859-1':
|
|
|
|
+ case 'iso88591':
|
|
|
|
+ case 'iso_8859-1':
|
|
|
|
+ case 'windows-1252':
|
|
|
|
+ case 'iso_8859-1:1987':
|
|
|
|
+ case 'cp1252':
|
|
|
|
+ case 'x-cp1252':
|
|
|
|
+ return decoders.latin1;
|
|
|
|
+ case 'utf16le':
|
|
|
|
+ case 'utf-16le':
|
|
|
|
+ case 'ucs2':
|
|
|
|
+ case 'ucs-2':
|
|
|
|
+ return decoders.utf16le;
|
|
|
|
+ case 'base64':
|
|
|
|
+ return decoders.base64;
|
|
|
|
+ default:
|
|
|
|
+ if (lc === undefined) {
|
|
|
|
+ lc = true;
|
|
|
|
+ charset = charset.toLowerCase();
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ return decoders.other.bind(charset);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+const decoders = {
|
|
|
|
+ utf8: (data, hint) => {
|
|
|
|
+ if (data.length === 0)
|
|
|
|
+ return '';
|
|
|
|
+ if (typeof data === 'string') {
|
|
|
|
+ // If `data` never had any percent-encoded bytes or never had any that
|
|
|
|
+ // were outside of the ASCII range, then we can safely just return the
|
|
|
|
+ // input since UTF-8 is ASCII compatible
|
|
|
|
+ if (hint < 2)
|
|
|
|
+ return data;
|
|
|
|
+
|
|
|
|
+ data = Buffer.from(data, 'latin1');
|
|
|
|
+ }
|
|
|
|
+ return data.utf8Slice(0, data.length);
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ latin1: (data, hint) => {
|
|
|
|
+ if (data.length === 0)
|
|
|
|
+ return '';
|
|
|
|
+ if (typeof data === 'string')
|
|
|
|
+ return data;
|
|
|
|
+ return data.latin1Slice(0, data.length);
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ utf16le: (data, hint) => {
|
|
|
|
+ if (data.length === 0)
|
|
|
|
+ return '';
|
|
|
|
+ if (typeof data === 'string')
|
|
|
|
+ data = Buffer.from(data, 'latin1');
|
|
|
|
+ return data.ucs2Slice(0, data.length);
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ base64: (data, hint) => {
|
|
|
|
+ if (data.length === 0)
|
|
|
|
+ return '';
|
|
|
|
+ if (typeof data === 'string')
|
|
|
|
+ data = Buffer.from(data, 'latin1');
|
|
|
|
+ return data.base64Slice(0, data.length);
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ other: (data, hint) => {
|
|
|
|
+ if (data.length === 0)
|
|
|
|
+ return '';
|
|
|
|
+ if (typeof data === 'string')
|
|
|
|
+ data = Buffer.from(data, 'latin1');
|
|
|
|
+ try {
|
|
|
|
+ const decoder = new TextDecoder(this);
|
|
|
|
+ return decoder.decode(data);
|
|
|
|
+ } catch {}
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+function convertToUTF8(data, charset, hint) {
|
|
|
|
+ const decode = getDecoder(charset);
|
|
|
|
+ if (decode)
|
|
|
|
+ return decode(data, hint);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+function basename(path) {
|
|
|
|
+ if (typeof path !== 'string')
|
|
|
|
+ return '';
|
|
|
|
+ for (let i = path.length - 1; i >= 0; --i) {
|
|
|
|
+ switch (path.charCodeAt(i)) {
|
|
|
|
+ case 0x2F: // '/'
|
|
|
|
+ case 0x5C: // '\'
|
|
|
|
+ path = path.slice(i + 1);
|
|
|
|
+ return (path === '..' || path === '.' ? '' : path);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return (path === '..' || path === '.' ? '' : path);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+const TOKEN = [
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+];
|
|
|
|
+
|
|
|
|
+const QDTEXT = [
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
|
+];
|
|
|
|
+
|
|
|
|
+const CHARSET = [
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+];
|
|
|
|
+
|
|
|
|
+const EXTENDED_VALUE = [
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
+];
|
|
|
|
+
|
|
|
|
+/* eslint-disable no-multi-spaces */
|
|
|
|
+const HEX_VALUES = [
|
|
|
|
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
|
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
|
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
|
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
|
|
|
|
+ -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
|
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
|
+ -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
|
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
|
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
|
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
|
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
|
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
|
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
|
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
|
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
|
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
|
+];
|
|
|
|
+/* eslint-enable no-multi-spaces */
|
|
|
|
+
|
|
|
|
+module.exports = {
|
|
|
|
+ basename,
|
|
|
|
+ convertToUTF8,
|
|
|
|
+ getDecoder,
|
|
|
|
+ parseContentType,
|
|
|
|
+ parseDisposition,
|
|
|
|
+};
|