@@ -227,6 +227,35 @@ void BindingData::Format(const FunctionCallbackInfo<Value>& args) {
227
227
.ToLocalChecked ());
228
228
}
229
229
230
+ void BindingData::ThrowInvalidURL (node::Environment* env,
231
+ std::string_view input,
232
+ std::optional<std::string> base) {
233
+ Local<Value> err = ERR_INVALID_URL (env->isolate (), " Invalid URL" );
234
+ DCHECK (err->IsObject ());
235
+
236
+ auto err_object = err.As <Object>();
237
+
238
+ USE (err_object->Set (env->context (),
239
+ env->input_string (),
240
+ v8::String::NewFromUtf8 (env->isolate (),
241
+ input.data (),
242
+ v8::NewStringType::kNormal ,
243
+ input.size ())
244
+ .ToLocalChecked ()));
245
+
246
+ if (base.has_value ()) {
247
+ USE (err_object->Set (env->context (),
248
+ env->base_string (),
249
+ v8::String::NewFromUtf8 (env->isolate (),
250
+ base.value ().c_str (),
251
+ v8::NewStringType::kNormal ,
252
+ base.value ().size ())
253
+ .ToLocalChecked ()));
254
+ }
255
+
256
+ env->isolate ()->ThrowException (err);
257
+ }
258
+
230
259
void BindingData::Parse (const FunctionCallbackInfo<Value>& args) {
231
260
CHECK_GE (args.Length (), 1 );
232
261
CHECK (args[0 ]->IsString ()); // input
@@ -235,23 +264,24 @@ void BindingData::Parse(const FunctionCallbackInfo<Value>& args) {
235
264
Realm* realm = Realm::GetCurrent (args);
236
265
BindingData* binding_data = realm->GetBindingData <BindingData>();
237
266
Isolate* isolate = realm->isolate ();
267
+ std::optional<std::string> base_{};
238
268
239
269
Utf8Value input (isolate, args[0 ]);
240
270
ada::result<ada::url_aggregator> base;
241
271
ada::url_aggregator* base_pointer = nullptr ;
242
272
if (args[1 ]->IsString ()) {
243
- base =
244
- ada::parse<ada::url_aggregator>(Utf8Value (isolate, args[ 1 ]). ToString () );
273
+ base_ = Utf8Value (isolate, args[ 1 ]). ToString ();
274
+ base = ada::parse<ada::url_aggregator>(*base_ );
245
275
if (!base) {
246
- return args. GetReturnValue (). Set ( false );
276
+ return ThrowInvalidURL (realm-> env (), input. ToStringView (), base_ );
247
277
}
248
278
base_pointer = &base.value ();
249
279
}
250
280
auto out =
251
281
ada::parse<ada::url_aggregator>(input.ToStringView (), base_pointer);
252
282
253
283
if (!out) {
254
- return args. GetReturnValue (). Set ( false );
284
+ return ThrowInvalidURL (realm-> env (), input. ToStringView (), base_ );
255
285
}
256
286
257
287
binding_data->UpdateComponents (out->get_components (), out->type );
0 commit comments