@@ -227,6 +227,35 @@ void BindingData::Format(const FunctionCallbackInfo<Value>& args) {
227227 .ToLocalChecked ());
228228}
229229
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+
230259void BindingData::Parse (const FunctionCallbackInfo<Value>& args) {
231260 CHECK_GE (args.Length (), 1 );
232261 CHECK (args[0 ]->IsString ()); // input
@@ -235,23 +264,24 @@ void BindingData::Parse(const FunctionCallbackInfo<Value>& args) {
235264 Realm* realm = Realm::GetCurrent (args);
236265 BindingData* binding_data = realm->GetBindingData <BindingData>();
237266 Isolate* isolate = realm->isolate ();
267+ std::optional<std::string> base_{};
238268
239269 Utf8Value input (isolate, args[0 ]);
240270 ada::result<ada::url_aggregator> base;
241271 ada::url_aggregator* base_pointer = nullptr ;
242272 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_ );
245275 if (!base) {
246- return args. GetReturnValue (). Set ( false );
276+ return ThrowInvalidURL (realm-> env (), input. ToStringView (), base_ );
247277 }
248278 base_pointer = &base.value ();
249279 }
250280 auto out =
251281 ada::parse<ada::url_aggregator>(input.ToStringView (), base_pointer);
252282
253283 if (!out) {
254- return args. GetReturnValue (). Set ( false );
284+ return ThrowInvalidURL (realm-> env (), input. ToStringView (), base_ );
255285 }
256286
257287 binding_data->UpdateComponents (out->get_components (), out->type );
0 commit comments