Skip to content

Commit

Permalink
Percent decode
Browse files Browse the repository at this point in the history
  • Loading branch information
slowcheetah committed Aug 13, 2024
1 parent b3e76ef commit 5eaf948
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 19 deletions.
29 changes: 10 additions & 19 deletions packages/core-js/modules/web.url-search-params.constructor.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ var indexOf = uncurryThis(''.indexOf);
var numberToString = uncurryThis(1.0.toString);
var fromCharCode = String.fromCharCode;
var fromCodePoint = getBuiltIn('String', 'fromCodePoint');
var $isNaN = isNaN;
var $parseInt = parseInt;

var parseHexOctet = function (string, start) {
Expand All @@ -76,7 +77,8 @@ var parseHexOctet = function (string, start) {

var getLeadingOnes = function (octet) {
var binString = padStart(numberToString(octet, 2), 8, '0');
return indexOf(binString, '0') !== -1 ? indexOf(binString, '0') : binString.length;
var firstZero = indexOf(binString, '0');
return firstZero !== -1 ? firstZero : binString.length;
};

var utf8Decode = function (octets) {
Expand All @@ -101,31 +103,24 @@ var utf8Decode = function (octets) {
return codePoint > 0x10FFFF ? null : codePoint;
};

/* eslint-disable max-statements -- TODO */
var decode = function (input) {
var length = input.length;
var result = '';
var i = 0;

while (i < length) {
var decodedChar = input[i];
var decodedChar = charAt(input, i);

if (decodedChar === '%') {
if (i + 3 > length && i + 1 !== length) {
/* eslint-disable no-useless-assignment -- TODO */
decodedChar = FALLBACK_REPLACER;
break;
}

if (input[i + 1] === '%' || i + 1 === length) {
if (input[i + 1] === '%' || i + 1 === length || i + 3 > length) {
result += '%';
i++;
continue;
}

var octet = parseHexOctet(input, i + 1);

if (isNaN(octet)) {
if ($isNaN(octet)) {
result += decodedChar;
i++;
continue;
Expand All @@ -148,21 +143,17 @@ var decode = function (input) {

while (sequenceIndex < byteSequenceLength) {
i++;
if (i + 3 > length || input[i] !== '%') {
break;
}
if (i + 3 > length || input[i] !== '%') break;

var nextByte = parseHexOctet(input, i + 1);

if (nextByte > 191 || nextByte < 128) { // incorrect next byte
break;
}
if (nextByte > 191 || nextByte < 128) break;

if (isNaN(nextByte)) {
if ($isNaN(nextByte)) {
i += 3;
break;
}
octets.push(nextByte);
push(octets, nextByte);
i += 2;
sequenceIndex++;
}
Expand Down
1 change: 1 addition & 0 deletions tests/unit-global/web.url-search-params.js
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ QUnit.test('URLSearchParams', assert => {
assert.same(String(new URLSearchParams('%C2')), '%EF%BF%BD=');
assert.same(String(new URLSearchParams('%F0%9F%D0%90')), '%EF%BF%BD%D0%90=');
assert.same(String(new URLSearchParams('%25')), '%25=');
assert.same(String(new URLSearchParams('%4')), '%254=');

const testData = [
{ input: '?a=%', output: [['a', '%']], name: 'handling %' },
Expand Down
1 change: 1 addition & 0 deletions tests/unit-pure/web.url-search-params.js
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ QUnit.test('URLSearchParams', assert => {
assert.same(String(new URLSearchParams('%C2')), '%EF%BF%BD=');
assert.same(String(new URLSearchParams('%F0%9F%D0%90')), '%EF%BF%BD%D0%90=');
assert.same(String(new URLSearchParams('%25')), '%25=');
assert.same(String(new URLSearchParams('%4')), '%254=');

const testData = [
{ input: '?a=%', output: [['a', '%']], name: 'handling %' },
Expand Down

0 comments on commit 5eaf948

Please sign in to comment.