diff options
author | Sergey Golovin <golovim@gmail.com> | 2018-03-01 21:56:39 +0300 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2018-03-23 13:01:38 +0100 |
commit | f32796fad2e77b789c0ad552dcddb891484e54fc (patch) | |
tree | 6818d08f992245309fc8b04b8b4bcf61ec05bca0 /lib/internal/url.js | |
parent | 5fdee52c5ea39d2ed2c34dba9318162a4904cf44 (diff) | |
download | android-node-v8-f32796fad2e77b789c0ad552dcddb891484e54fc.tar.gz android-node-v8-f32796fad2e77b789c0ad552dcddb891484e54fc.tar.bz2 android-node-v8-f32796fad2e77b789c0ad552dcddb891484e54fc.zip |
url: refactor "escapeParam" function to make it common
PR-URL: https://github.com/nodejs/node/pull/19076
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Diffstat (limited to 'lib/internal/url.js')
-rw-r--r-- | lib/internal/url.js | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/lib/internal/url.js b/lib/internal/url.js index 842d26c4aa..e42c5278d8 100644 --- a/lib/internal/url.js +++ b/lib/internal/url.js @@ -814,7 +814,7 @@ const noEscape = [ const paramHexTable = hexTable.slice(); paramHexTable[0x20] = '+'; -function escapeParam(str) { +function encodeStr(str, noEscapeTable, hexTable) { const len = str.length; if (len === 0) return ''; @@ -827,12 +827,12 @@ function escapeParam(str) { // ASCII if (c < 0x80) { - if (noEscape[c] === 1) + if (noEscapeTable[c] === 1) continue; if (lastPos < i) out += str.slice(lastPos, i); lastPos = i + 1; - out += paramHexTable[c]; + out += hexTable[c]; continue; } @@ -842,15 +842,15 @@ function escapeParam(str) { // Multi-byte characters ... if (c < 0x800) { lastPos = i + 1; - out += paramHexTable[0xC0 | (c >> 6)] + - paramHexTable[0x80 | (c & 0x3F)]; + out += hexTable[0xC0 | (c >> 6)] + + hexTable[0x80 | (c & 0x3F)]; continue; } if (c < 0xD800 || c >= 0xE000) { lastPos = i + 1; - out += paramHexTable[0xE0 | (c >> 12)] + - paramHexTable[0x80 | ((c >> 6) & 0x3F)] + - paramHexTable[0x80 | (c & 0x3F)]; + out += hexTable[0xE0 | (c >> 12)] + + hexTable[0x80 | ((c >> 6) & 0x3F)] + + hexTable[0x80 | (c & 0x3F)]; continue; } // Surrogate pair @@ -866,10 +866,10 @@ function escapeParam(str) { } lastPos = i + 1; c = 0x10000 + (((c & 0x3FF) << 10) | c2); - out += paramHexTable[0xF0 | (c >> 18)] + - paramHexTable[0x80 | ((c >> 12) & 0x3F)] + - paramHexTable[0x80 | ((c >> 6) & 0x3F)] + - paramHexTable[0x80 | (c & 0x3F)]; + out += hexTable[0xF0 | (c >> 18)] + + hexTable[0x80 | ((c >> 12) & 0x3F)] + + hexTable[0x80 | ((c >> 6) & 0x3F)] + + hexTable[0x80 | (c & 0x3F)]; } if (lastPos === 0) return str; @@ -885,9 +885,17 @@ function serializeParams(array) { if (len === 0) return ''; - var output = `${escapeParam(array[0])}=${escapeParam(array[1])}`; - for (var i = 2; i < len; i += 2) - output += `&${escapeParam(array[i])}=${escapeParam(array[i + 1])}`; + const firstEncodedParam = encodeStr(array[0], noEscape, paramHexTable); + const firstEncodedValue = encodeStr(array[1], noEscape, paramHexTable); + let output = + `${firstEncodedParam}=${firstEncodedValue}`; + + for (var i = 2; i < len; i += 2) { + const encodedParam = encodeStr(array[i], noEscape, paramHexTable); + const encodedValue = encodeStr(array[i + 1], noEscape, paramHexTable); + output += `&${encodedParam}=${encodedValue}`; + } + return output; } @@ -1431,5 +1439,6 @@ module.exports = { domainToUnicode, urlToOptions, formatSymbol: kFormat, - searchParamsSymbol: searchParams + searchParamsSymbol: searchParams, + encodeStr }; |