Skip to content

Commit a789474

Browse files
sapicscodebytere
authored andcommitted
src: fix ParseEncoding
"utf-16LE" was parsed "UNKNOWN", this fixes to "UCS2" "utf-buffer" was parsed "BUFFER", this fixes to "UNKNOWN" "utf-16leNOT" was parsed "UCS2", this fixes to "UNKNOWN" PR-URL: #33957 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent 4e42eb5 commit a789474

File tree

3 files changed

+65
-47
lines changed

3 files changed

+65
-47
lines changed

src/api/encoding.cc

+58-41
Original file line numberDiff line numberDiff line change
@@ -14,74 +14,91 @@ enum encoding ParseEncoding(const char* encoding,
1414
enum encoding default_encoding) {
1515
switch (encoding[0]) {
1616
case 'u':
17+
case 'U':
1718
// utf8, utf16le
1819
if (encoding[1] == 't' && encoding[2] == 'f') {
1920
// Skip `-`
20-
encoding += encoding[3] == '-' ? 4 : 3;
21-
if (encoding[0] == '8' && encoding[1] == '\0')
21+
const size_t skip = encoding[3] == '-' ? 4 : 3;
22+
if (encoding[skip] == '8' && encoding[skip + 1] == '\0')
2223
return UTF8;
23-
if (strncmp(encoding, "16le", 4) == 0)
24+
if (strncmp(encoding + skip, "16le", 5) == 0)
2425
return UCS2;
25-
2626
// ucs2
2727
} else if (encoding[1] == 'c' && encoding[2] == 's') {
28-
encoding += encoding[3] == '-' ? 4 : 3;
29-
if (encoding[0] == '2' && encoding[1] == '\0')
28+
const size_t skip = encoding[3] == '-' ? 4 : 3;
29+
if (encoding[skip] == '2' && encoding[skip + 1] == '\0')
3030
return UCS2;
3131
}
32+
if (StringEqualNoCase(encoding, "utf8"))
33+
return UTF8;
34+
if (StringEqualNoCase(encoding, "utf-8"))
35+
return UTF8;
36+
if (StringEqualNoCase(encoding, "ucs2"))
37+
return UCS2;
38+
if (StringEqualNoCase(encoding, "ucs-2"))
39+
return UCS2;
40+
if (StringEqualNoCase(encoding, "utf16le"))
41+
return UCS2;
42+
if (StringEqualNoCase(encoding, "utf-16le"))
43+
return UCS2;
3244
break;
45+
3346
case 'l':
47+
case 'L':
3448
// latin1
3549
if (encoding[1] == 'a') {
36-
if (strncmp(encoding + 2, "tin1", 4) == 0)
50+
if (strncmp(encoding + 2, "tin1", 5) == 0)
3751
return LATIN1;
3852
}
53+
if (StringEqualNoCase(encoding, "latin1"))
54+
return LATIN1;
3955
break;
56+
4057
case 'b':
41-
// binary
58+
case 'B':
59+
// binary is a deprecated alias of latin1
4260
if (encoding[1] == 'i') {
43-
if (strncmp(encoding + 2, "nary", 4) == 0)
61+
if (strncmp(encoding + 2, "nary", 5) == 0)
4462
return LATIN1;
45-
4663
// buffer
4764
} else if (encoding[1] == 'u') {
48-
if (strncmp(encoding + 2, "ffer", 4) == 0)
65+
if (strncmp(encoding + 2, "ffer", 5) == 0)
4966
return BUFFER;
67+
// base64
68+
} else if (encoding[1] == 'a') {
69+
if (strncmp(encoding + 2, "se64", 5) == 0)
70+
return BASE64;
5071
}
72+
if (StringEqualNoCase(encoding, "binary"))
73+
return LATIN1; // BINARY is a deprecated alias of LATIN1.
74+
if (StringEqualNoCase(encoding, "buffer"))
75+
return BUFFER;
76+
if (StringEqualNoCase(encoding, "base64"))
77+
return BASE64;
5178
break;
52-
case '\0':
53-
return default_encoding;
54-
default:
79+
80+
case 'a':
81+
case 'A':
82+
// ascii
83+
if (encoding[1] == 's') {
84+
if (strncmp(encoding + 2, "cii", 4) == 0)
85+
return ASCII;
86+
}
87+
if (StringEqualNoCase(encoding, "ascii"))
88+
return ASCII;
5589
break;
56-
}
5790

58-
if (StringEqualNoCase(encoding, "utf8")) {
59-
return UTF8;
60-
} else if (StringEqualNoCase(encoding, "utf-8")) {
61-
return UTF8;
62-
} else if (StringEqualNoCase(encoding, "ascii")) {
63-
return ASCII;
64-
} else if (StringEqualNoCase(encoding, "base64")) {
65-
return BASE64;
66-
} else if (StringEqualNoCase(encoding, "ucs2")) {
67-
return UCS2;
68-
} else if (StringEqualNoCase(encoding, "ucs-2")) {
69-
return UCS2;
70-
} else if (StringEqualNoCase(encoding, "utf16le")) {
71-
return UCS2;
72-
} else if (StringEqualNoCase(encoding, "utf-16le")) {
73-
return UCS2;
74-
} else if (StringEqualNoCase(encoding, "latin1")) {
75-
return LATIN1;
76-
} else if (StringEqualNoCase(encoding, "binary")) {
77-
return LATIN1; // BINARY is a deprecated alias of LATIN1.
78-
} else if (StringEqualNoCase(encoding, "buffer")) {
79-
return BUFFER;
80-
} else if (StringEqualNoCase(encoding, "hex")) {
81-
return HEX;
82-
} else {
83-
return default_encoding;
91+
case 'h':
92+
case 'H':
93+
// hex
94+
if (encoding[1] == 'e')
95+
if (encoding[2] == 'x' && encoding[3] == '\0')
96+
return HEX;
97+
if (StringEqualNoCase(encoding, "hex"))
98+
return HEX;
99+
break;
84100
}
101+
return default_encoding;
85102
}
86103

87104

src/util-inl.h

+4-6
Original file line numberDiff line numberDiff line change
@@ -296,12 +296,10 @@ std::string ToUpper(const std::string& in) {
296296
}
297297

298298
bool StringEqualNoCase(const char* a, const char* b) {
299-
do {
300-
if (*a == '\0')
301-
return *b == '\0';
302-
if (*b == '\0')
303-
return false;
304-
} while (ToLower(*a++) == ToLower(*b++));
299+
while (ToLower(*a) == ToLower(*b++)) {
300+
if (*a++ == '\0')
301+
return true;
302+
}
305303
return false;
306304
}
307305

test/addons/parse-encoding/test.js

+3
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ assert.strictEqual(parseEncoding('hex'), 'HEX');
1414
assert.strictEqual(parseEncoding('latin1'), 'LATIN1');
1515
assert.strictEqual(parseEncoding('ucs2'), 'UCS2');
1616
assert.strictEqual(parseEncoding('utf8'), 'UTF8');
17+
assert.strictEqual(parseEncoding('utf-16LE'), 'UCS2');
18+
assert.strictEqual(parseEncoding('utf-buffer'), 'UNKNOWN');
19+
assert.strictEqual(parseEncoding('utf-16leNOT'), 'UNKNOWN');
1720

1821
assert.strictEqual(parseEncoding('linary'), 'UNKNOWN');
1922
assert.strictEqual(parseEncoding('luffer'), 'UNKNOWN');

0 commit comments

Comments
 (0)