url: show input in parse error message · nodejs/node@f675518 · GitHub
Skip to content

Commit f675518

Browse files
joyeecheungMylesBorins
authored andcommitted
url: show input in parse error message
PR-URL: #11934 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Timothy Gu <timothygu99@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Daijiro Wachi <daijiro.wachi@gmail.com>
1 parent bb2de4a commit f675518

4 files changed

Lines changed: 71 additions & 46 deletions

File tree

lib/internal/url.js

Lines changed: 7 additions & 17 deletions

src/node_url.cc

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1246,7 +1246,8 @@ namespace url {
12461246
enum url_parse_state state_override,
12471247
Local<Value> base_obj,
12481248
Local<Value> context_obj,
1249-
Local<Function> cb) {
1249+
Local<Function> cb,
1250+
Local<Value> error_cb) {
12501251
Isolate* isolate = env->isolate();
12511252
Local<Context> context = env->context();
12521253
HandleScope handle_scope(isolate);
@@ -1267,20 +1268,19 @@ namespace url {
12671268

12681269
// Define the return value placeholders
12691270
const Local<Value> undef = Undefined(isolate);
1270-
Local<Value> argv[9] = {
1271-
undef,
1272-
undef,
1273-
undef,
1274-
undef,
1275-
undef,
1276-
undef,
1277-
undef,
1278-
undef,
1279-
undef,
1280-
};
1281-
1282-
argv[ARG_FLAGS] = Integer::NewFromUnsigned(isolate, url.flags);
12831271
if (!(url.flags & URL_FLAGS_FAILED)) {
1272+
Local<Value> argv[9] = {
1273+
undef,
1274+
undef,
1275+
undef,
1276+
undef,
1277+
undef,
1278+
undef,
1279+
undef,
1280+
undef,
1281+
undef,
1282+
};
1283+
argv[ARG_FLAGS] = Integer::NewFromUnsigned(isolate, url.flags);
12841284
if (url.flags & URL_FLAGS_HAS_SCHEME)
12851285
argv[ARG_PROTOCOL] = OneByteString(isolate, url.scheme.c_str());
12861286
if (url.flags & URL_FLAGS_HAS_USERNAME)
@@ -1297,22 +1297,31 @@ namespace url {
12971297
argv[ARG_PORT] = Integer::New(isolate, url.port);
12981298
if (url.flags & URL_FLAGS_HAS_PATH)
12991299
argv[ARG_PATH] = Copy(env, url.path);
1300+
(void)cb->Call(context, recv, arraysize(argv), argv);
1301+
} else if (error_cb->IsFunction()) {
1302+
Local<Value> argv[2] = { undef, undef };
1303+
argv[ERR_ARG_FLAGS] = Integer::NewFromUnsigned(isolate, url.flags);
1304+
argv[ERR_ARG_INPUT] =
1305+
String::NewFromUtf8(env->isolate(),
1306+
input,
1307+
v8::NewStringType::kNormal).ToLocalChecked();
1308+
(void)error_cb.As<Function>()->Call(context, recv, arraysize(argv), argv);
13001309
}
1301-
1302-
(void)cb->Call(context, recv, 9, argv);
13031310
}
13041311

13051312
static void Parse(const FunctionCallbackInfo<Value>& args) {
13061313
Environment* env = Environment::GetCurrent(args);
13071314
CHECK_GE(args.Length(), 5);
1308-
CHECK(args[0]->IsString());
1309-
CHECK(args[2]->IsUndefined() ||
1315+
CHECK(args[0]->IsString()); // input
1316+
CHECK(args[2]->IsUndefined() || // base context
13101317
args[2]->IsNull() ||
13111318
args[2]->IsObject());
1312-
CHECK(args[3]->IsUndefined() ||
1319+
CHECK(args[3]->IsUndefined() || // context
13131320
args[3]->IsNull() ||
13141321
args[3]->IsObject());
1315-
CHECK(args[4]->IsFunction());
1322+
CHECK(args[4]->IsFunction()); // complete callback
1323+
CHECK(args[5]->IsUndefined() || args[5]->IsFunction()); // error callback
1324+
13161325
Utf8Value input(env->isolate(), args[0]);
13171326
enum url_parse_state state_override = kUnknownState;
13181327
if (args[1]->IsNumber()) {
@@ -1325,7 +1334,8 @@ namespace url {
13251334
state_override,
13261335
args[2],
13271336
args[3],
1328-
args[4].As<Function>());
1337+
args[4].As<Function>(),
1338+
args[5]);
13291339
}
13301340

13311341
static void EncodeAuthSet(const FunctionCallbackInfo<Value>& args) {

src/node_url.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,10 @@ static inline void PercentDecode(const char* input,
463463
XX(ARG_QUERY) \
464464
XX(ARG_FRAGMENT)
465465

466+
#define ERR_ARGS(XX) \
467+
XX(ERR_ARG_FLAGS) \
468+
XX(ERR_ARG_INPUT) \
469+
466470
static const char kEOL = -1;
467471

468472
enum url_parse_state {
@@ -484,6 +488,12 @@ enum url_cb_args {
484488
#undef XX
485489
};
486490

491+
enum url_error_cb_args {
492+
#define XX(name) name,
493+
ERR_ARGS(XX)
494+
#undef XX
495+
} url_error_cb_args;
496+
487497
static inline bool IsSpecial(std::string scheme) {
488498
#define XX(name, _) if (scheme == name) return true;
489499
SPECIALS(XX);

test/parallel/test-whatwg-url-parsing.js

Lines changed: 23 additions & 8 deletions

0 commit comments

Comments
 (0)