@@ -1209,21 +1209,33 @@ inline url_data HarvestBase(Environment* env, Local<Object> base_obj) {
12091209 base_obj->Get (env->context (), env->scheme_string ()).ToLocalChecked ();
12101210 base.scheme = Utf8Value (env->isolate (), scheme).out ();
12111211
1212- auto GetStr = [&](std::string url_data::* member,
1212+ auto GetStr = [&](std::string url_data::*member,
12131213 int flag,
1214- Local<String> name) {
1214+ Local<String> name,
1215+ bool empty_as_present) {
12151216 Local<Value> value = base_obj->Get (env->context (), name).ToLocalChecked ();
12161217 if (value->IsString ()) {
12171218 Utf8Value utf8value (env->isolate (), value.As <String>());
12181219 (base.*member).assign (*utf8value, utf8value.length ());
1219- base.flags |= flag;
1220+ if (empty_as_present || value.As <String>()->Length () != 0 ) {
1221+ base.flags |= flag;
1222+ }
12201223 }
12211224 };
1222- GetStr (&url_data::username, URL_FLAGS_HAS_USERNAME, env->username_string ());
1223- GetStr (&url_data::password, URL_FLAGS_HAS_PASSWORD, env->password_string ());
1224- GetStr (&url_data::host, URL_FLAGS_HAS_HOST, env->host_string ());
1225- GetStr (&url_data::query, URL_FLAGS_HAS_QUERY, env->query_string ());
1226- GetStr (&url_data::fragment, URL_FLAGS_HAS_FRAGMENT, env->fragment_string ());
1225+ GetStr (&url_data::username,
1226+ URL_FLAGS_HAS_USERNAME,
1227+ env->username_string (),
1228+ false );
1229+ GetStr (&url_data::password,
1230+ URL_FLAGS_HAS_PASSWORD,
1231+ env->password_string (),
1232+ false );
1233+ GetStr (&url_data::host, URL_FLAGS_HAS_HOST, env->host_string (), true );
1234+ GetStr (&url_data::query, URL_FLAGS_HAS_QUERY, env->query_string (), true );
1235+ GetStr (&url_data::fragment,
1236+ URL_FLAGS_HAS_FRAGMENT,
1237+ env->fragment_string (),
1238+ true );
12271239
12281240 Local<Value> port =
12291241 base_obj->Get (env->context (), env->port_string ()).ToLocalChecked ();
0 commit comments