lib: move encodeStr function to internal for reusable
PR-URL: https://github.com/nodejs/node/pull/24242 Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
parent
399bb3c95a
commit
db9a7459c3
@ -1,5 +1,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
const { ERR_INVALID_URI } = require('internal/errors').codes;
|
||||||
|
|
||||||
const hexTable = new Array(256);
|
const hexTable = new Array(256);
|
||||||
for (var i = 0; i < 256; ++i)
|
for (var i = 0; i < 256; ++i)
|
||||||
hexTable[i] = '%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase();
|
hexTable[i] = '%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase();
|
||||||
@ -23,7 +25,72 @@ const isHexTable = [
|
|||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // ... 256
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // ... 256
|
||||||
];
|
];
|
||||||
|
|
||||||
|
function encodeStr(str, noEscapeTable, hexTable) {
|
||||||
|
const len = str.length;
|
||||||
|
if (len === 0)
|
||||||
|
return '';
|
||||||
|
|
||||||
|
var out = '';
|
||||||
|
var lastPos = 0;
|
||||||
|
|
||||||
|
for (var i = 0; i < len; i++) {
|
||||||
|
var c = str.charCodeAt(i);
|
||||||
|
|
||||||
|
// ASCII
|
||||||
|
if (c < 0x80) {
|
||||||
|
if (noEscapeTable[c] === 1)
|
||||||
|
continue;
|
||||||
|
if (lastPos < i)
|
||||||
|
out += str.slice(lastPos, i);
|
||||||
|
lastPos = i + 1;
|
||||||
|
out += hexTable[c];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastPos < i)
|
||||||
|
out += str.slice(lastPos, i);
|
||||||
|
|
||||||
|
// Multi-byte characters ...
|
||||||
|
if (c < 0x800) {
|
||||||
|
lastPos = i + 1;
|
||||||
|
out += hexTable[0xC0 | (c >> 6)] +
|
||||||
|
hexTable[0x80 | (c & 0x3F)];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (c < 0xD800 || c >= 0xE000) {
|
||||||
|
lastPos = i + 1;
|
||||||
|
out += hexTable[0xE0 | (c >> 12)] +
|
||||||
|
hexTable[0x80 | ((c >> 6) & 0x3F)] +
|
||||||
|
hexTable[0x80 | (c & 0x3F)];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Surrogate pair
|
||||||
|
++i;
|
||||||
|
|
||||||
|
// This branch should never happen because all URLSearchParams entries
|
||||||
|
// should already be converted to USVString. But, included for
|
||||||
|
// completion's sake anyway.
|
||||||
|
if (i >= len)
|
||||||
|
throw new ERR_INVALID_URI();
|
||||||
|
|
||||||
|
var c2 = str.charCodeAt(i) & 0x3FF;
|
||||||
|
|
||||||
|
lastPos = i + 1;
|
||||||
|
c = 0x10000 + (((c & 0x3FF) << 10) | c2);
|
||||||
|
out += hexTable[0xF0 | (c >> 18)] +
|
||||||
|
hexTable[0x80 | ((c >> 12) & 0x3F)] +
|
||||||
|
hexTable[0x80 | ((c >> 6) & 0x3F)] +
|
||||||
|
hexTable[0x80 | (c & 0x3F)];
|
||||||
|
}
|
||||||
|
if (lastPos === 0)
|
||||||
|
return str;
|
||||||
|
if (lastPos < len)
|
||||||
|
return out + str.slice(lastPos);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
encodeStr,
|
||||||
hexTable,
|
hexTable,
|
||||||
isHexTable
|
isHexTable
|
||||||
};
|
};
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
const util = require('util');
|
const util = require('util');
|
||||||
const {
|
const {
|
||||||
|
encodeStr,
|
||||||
hexTable,
|
hexTable,
|
||||||
isHexTable
|
isHexTable
|
||||||
} = require('internal/querystring');
|
} = require('internal/querystring');
|
||||||
@ -833,70 +834,6 @@ const noEscape = [
|
|||||||
const paramHexTable = hexTable.slice();
|
const paramHexTable = hexTable.slice();
|
||||||
paramHexTable[0x20] = '+';
|
paramHexTable[0x20] = '+';
|
||||||
|
|
||||||
function encodeStr(str, noEscapeTable, hexTable) {
|
|
||||||
const len = str.length;
|
|
||||||
if (len === 0)
|
|
||||||
return '';
|
|
||||||
|
|
||||||
var out = '';
|
|
||||||
var lastPos = 0;
|
|
||||||
|
|
||||||
for (var i = 0; i < len; i++) {
|
|
||||||
var c = str.charCodeAt(i);
|
|
||||||
|
|
||||||
// ASCII
|
|
||||||
if (c < 0x80) {
|
|
||||||
if (noEscapeTable[c] === 1)
|
|
||||||
continue;
|
|
||||||
if (lastPos < i)
|
|
||||||
out += str.slice(lastPos, i);
|
|
||||||
lastPos = i + 1;
|
|
||||||
out += hexTable[c];
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lastPos < i)
|
|
||||||
out += str.slice(lastPos, i);
|
|
||||||
|
|
||||||
// Multi-byte characters ...
|
|
||||||
if (c < 0x800) {
|
|
||||||
lastPos = i + 1;
|
|
||||||
out += hexTable[0xC0 | (c >> 6)] +
|
|
||||||
hexTable[0x80 | (c & 0x3F)];
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (c < 0xD800 || c >= 0xE000) {
|
|
||||||
lastPos = i + 1;
|
|
||||||
out += hexTable[0xE0 | (c >> 12)] +
|
|
||||||
hexTable[0x80 | ((c >> 6) & 0x3F)] +
|
|
||||||
hexTable[0x80 | (c & 0x3F)];
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// Surrogate pair
|
|
||||||
++i;
|
|
||||||
var c2;
|
|
||||||
if (i < len)
|
|
||||||
c2 = str.charCodeAt(i) & 0x3FF;
|
|
||||||
else {
|
|
||||||
// This branch should never happen because all URLSearchParams entries
|
|
||||||
// should already be converted to USVString. But, included for
|
|
||||||
// completion's sake anyway.
|
|
||||||
c2 = 0;
|
|
||||||
}
|
|
||||||
lastPos = i + 1;
|
|
||||||
c = 0x10000 + (((c & 0x3FF) << 10) | c2);
|
|
||||||
out += hexTable[0xF0 | (c >> 18)] +
|
|
||||||
hexTable[0x80 | ((c >> 12) & 0x3F)] +
|
|
||||||
hexTable[0x80 | ((c >> 6) & 0x3F)] +
|
|
||||||
hexTable[0x80 | (c & 0x3F)];
|
|
||||||
}
|
|
||||||
if (lastPos === 0)
|
|
||||||
return str;
|
|
||||||
if (lastPos < len)
|
|
||||||
return out + str.slice(lastPos);
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
// application/x-www-form-urlencoded serializer
|
// application/x-www-form-urlencoded serializer
|
||||||
// Ref: https://url.spec.whatwg.org/#concept-urlencoded-serializer
|
// Ref: https://url.spec.whatwg.org/#concept-urlencoded-serializer
|
||||||
function serializeParams(array) {
|
function serializeParams(array) {
|
||||||
|
@ -24,8 +24,8 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const { Buffer } = require('buffer');
|
const { Buffer } = require('buffer');
|
||||||
const { ERR_INVALID_URI } = require('internal/errors').codes;
|
|
||||||
const {
|
const {
|
||||||
|
encodeStr,
|
||||||
hexTable,
|
hexTable,
|
||||||
isHexTable
|
isHexTable
|
||||||
} = require('internal/querystring');
|
} = require('internal/querystring');
|
||||||
@ -140,59 +140,8 @@ function qsEscape(str) {
|
|||||||
else
|
else
|
||||||
str += '';
|
str += '';
|
||||||
}
|
}
|
||||||
var out = '';
|
|
||||||
var lastPos = 0;
|
|
||||||
|
|
||||||
for (var i = 0; i < str.length; ++i) {
|
return encodeStr(str, noEscape, hexTable);
|
||||||
var c = str.charCodeAt(i);
|
|
||||||
|
|
||||||
// ASCII
|
|
||||||
if (c < 0x80) {
|
|
||||||
if (noEscape[c] === 1)
|
|
||||||
continue;
|
|
||||||
if (lastPos < i)
|
|
||||||
out += str.slice(lastPos, i);
|
|
||||||
lastPos = i + 1;
|
|
||||||
out += hexTable[c];
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lastPos < i)
|
|
||||||
out += str.slice(lastPos, i);
|
|
||||||
|
|
||||||
// Multi-byte characters ...
|
|
||||||
if (c < 0x800) {
|
|
||||||
lastPos = i + 1;
|
|
||||||
out += hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)];
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (c < 0xD800 || c >= 0xE000) {
|
|
||||||
lastPos = i + 1;
|
|
||||||
out += hexTable[0xE0 | (c >> 12)] +
|
|
||||||
hexTable[0x80 | ((c >> 6) & 0x3F)] +
|
|
||||||
hexTable[0x80 | (c & 0x3F)];
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// Surrogate pair
|
|
||||||
++i;
|
|
||||||
|
|
||||||
if (i >= str.length)
|
|
||||||
throw new ERR_INVALID_URI();
|
|
||||||
|
|
||||||
var c2 = str.charCodeAt(i) & 0x3FF;
|
|
||||||
|
|
||||||
lastPos = i + 1;
|
|
||||||
c = 0x10000 + (((c & 0x3FF) << 10) | c2);
|
|
||||||
out += hexTable[0xF0 | (c >> 18)] +
|
|
||||||
hexTable[0x80 | ((c >> 12) & 0x3F)] +
|
|
||||||
hexTable[0x80 | ((c >> 6) & 0x3F)] +
|
|
||||||
hexTable[0x80 | (c & 0x3F)];
|
|
||||||
}
|
|
||||||
if (lastPos === 0)
|
|
||||||
return str;
|
|
||||||
if (lastPos < str.length)
|
|
||||||
return out + str.slice(lastPos);
|
|
||||||
return out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function stringifyPrimitive(v) {
|
function stringifyPrimitive(v) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user