From 4246a40b309f2f1529a9733aaba455cc00cb060f Mon Sep 17 00:00:00 2001 From: ZYSzys <17367077526@163.com> Date: Thu, 8 Nov 2018 14:17:14 +0800 Subject: [PATCH] lib: move encodeStr function to internal for reusable PR-URL: https://github.com/nodejs/node/pull/24242 Reviewed-By: James M Snell --- lib/internal/querystring.js | 67 +++++++++++++++++++++++++++++++++++++ lib/internal/url.js | 65 +---------------------------------- lib/querystring.js | 55 ++---------------------------- 3 files changed, 70 insertions(+), 117 deletions(-) diff --git a/lib/internal/querystring.js b/lib/internal/querystring.js index d1684418097100..ca978eb69d7860 100644 --- a/lib/internal/querystring.js +++ b/lib/internal/querystring.js @@ -1,5 +1,7 @@ 'use strict'; +const { ERR_INVALID_URI } = require('internal/errors').codes; + const hexTable = new Array(256); for (var i = 0; i < 256; ++i) 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 ]; +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 = { + encodeStr, hexTable, isHexTable }; diff --git a/lib/internal/url.js b/lib/internal/url.js index a3b1bedaca51ef..8d14a26ecb3617 100644 --- a/lib/internal/url.js +++ b/lib/internal/url.js @@ -2,6 +2,7 @@ const util = require('util'); const { + encodeStr, hexTable, isHexTable } = require('internal/querystring'); @@ -833,70 +834,6 @@ const noEscape = [ const paramHexTable = hexTable.slice(); 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 // Ref: https://url.spec.whatwg.org/#concept-urlencoded-serializer function serializeParams(array) { diff --git a/lib/querystring.js b/lib/querystring.js index 7e4ab5e894120d..5189a28f235770 100644 --- a/lib/querystring.js +++ b/lib/querystring.js @@ -24,8 +24,8 @@ 'use strict'; const { Buffer } = require('buffer'); -const { ERR_INVALID_URI } = require('internal/errors').codes; const { + encodeStr, hexTable, isHexTable } = require('internal/querystring'); @@ -140,59 +140,8 @@ function qsEscape(str) { else str += ''; } - var out = ''; - var lastPos = 0; - - for (var i = 0; i < str.length; ++i) { - 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; + return encodeStr(str, noEscape, hexTable); } function stringifyPrimitive(v) {