mirror of
https://github.com/zebrajr/node.git
synced 2026-01-15 12:15:26 +00:00
src: do not ignore IDNA conversion error
Old behavior can be restored using a special `lenient` mode, as used in the legacy URL parser. PR-URL: https://github.com/nodejs/node/pull/11549 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
This commit is contained in:
@@ -319,7 +319,10 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {
|
||||
// It only converts parts of the domain name that
|
||||
// have non-ASCII characters, i.e. it doesn't matter if
|
||||
// you call it with a domain that already is ASCII-only.
|
||||
this.hostname = toASCII(this.hostname);
|
||||
|
||||
// Use lenient mode (`true`) to try to support even non-compliant
|
||||
// URLs.
|
||||
this.hostname = toASCII(this.hostname, true);
|
||||
}
|
||||
|
||||
var p = this.port ? ':' + this.port : '';
|
||||
|
||||
@@ -410,7 +410,8 @@ bool InitializeICUDirectory(const std::string& path) {
|
||||
|
||||
int32_t ToUnicode(MaybeStackBuffer<char>* buf,
|
||||
const char* input,
|
||||
size_t length) {
|
||||
size_t length,
|
||||
bool lenient) {
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
uint32_t options = UIDNA_DEFAULT;
|
||||
options |= UIDNA_NONTRANSITIONAL_TO_UNICODE;
|
||||
@@ -435,7 +436,7 @@ int32_t ToUnicode(MaybeStackBuffer<char>* buf,
|
||||
&status);
|
||||
}
|
||||
|
||||
if (U_FAILURE(status)) {
|
||||
if (U_FAILURE(status) || (!lenient && info.errors != 0)) {
|
||||
len = -1;
|
||||
buf->SetLength(0);
|
||||
} else {
|
||||
@@ -448,7 +449,8 @@ int32_t ToUnicode(MaybeStackBuffer<char>* buf,
|
||||
|
||||
int32_t ToASCII(MaybeStackBuffer<char>* buf,
|
||||
const char* input,
|
||||
size_t length) {
|
||||
size_t length,
|
||||
bool lenient) {
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
uint32_t options = UIDNA_DEFAULT;
|
||||
options |= UIDNA_NONTRANSITIONAL_TO_ASCII;
|
||||
@@ -473,7 +475,7 @@ int32_t ToASCII(MaybeStackBuffer<char>* buf,
|
||||
&status);
|
||||
}
|
||||
|
||||
if (U_FAILURE(status)) {
|
||||
if (U_FAILURE(status) || (!lenient && info.errors != 0)) {
|
||||
len = -1;
|
||||
buf->SetLength(0);
|
||||
} else {
|
||||
@@ -489,8 +491,11 @@ static void ToUnicode(const FunctionCallbackInfo<Value>& args) {
|
||||
CHECK_GE(args.Length(), 1);
|
||||
CHECK(args[0]->IsString());
|
||||
Utf8Value val(env->isolate(), args[0]);
|
||||
// optional arg
|
||||
bool lenient = args[1]->BooleanValue(env->context()).FromJust();
|
||||
|
||||
MaybeStackBuffer<char> buf;
|
||||
int32_t len = ToUnicode(&buf, *val, val.length());
|
||||
int32_t len = ToUnicode(&buf, *val, val.length(), lenient);
|
||||
|
||||
if (len < 0) {
|
||||
return env->ThrowError("Cannot convert name to Unicode");
|
||||
@@ -508,8 +513,11 @@ static void ToASCII(const FunctionCallbackInfo<Value>& args) {
|
||||
CHECK_GE(args.Length(), 1);
|
||||
CHECK(args[0]->IsString());
|
||||
Utf8Value val(env->isolate(), args[0]);
|
||||
// optional arg
|
||||
bool lenient = args[1]->BooleanValue(env->context()).FromJust();
|
||||
|
||||
MaybeStackBuffer<char> buf;
|
||||
int32_t len = ToASCII(&buf, *val, val.length());
|
||||
int32_t len = ToASCII(&buf, *val, val.length(), lenient);
|
||||
|
||||
if (len < 0) {
|
||||
return env->ThrowError("Cannot convert name to ASCII");
|
||||
|
||||
@@ -18,10 +18,12 @@ bool InitializeICUDirectory(const std::string& path);
|
||||
|
||||
int32_t ToASCII(MaybeStackBuffer<char>* buf,
|
||||
const char* input,
|
||||
size_t length);
|
||||
size_t length,
|
||||
bool lenient = false);
|
||||
int32_t ToUnicode(MaybeStackBuffer<char>* buf,
|
||||
const char* input,
|
||||
size_t length);
|
||||
size_t length,
|
||||
bool lenient = false);
|
||||
|
||||
} // namespace i18n
|
||||
} // namespace node
|
||||
|
||||
Reference in New Issue
Block a user