@@ -1209,21 +1209,33 @@ inline url_data HarvestBase(Environment* env, Local<Object> base_obj) { |
1209 | 1209 | base_obj->Get(env->context(), env->scheme_string()).ToLocalChecked(); |
1210 | 1210 | base.scheme = Utf8Value(env->isolate(), scheme).out(); |
1211 | 1211 |
|
1212 | | - auto GetStr = [&](std::string url_data::* member, |
| 1212 | + auto GetStr = [&](std::string url_data::*member, |
1213 | 1213 | int flag, |
1214 | | - Local<String> name) { |
| 1214 | + Local<String> name, |
| 1215 | + bool empty_as_present) { |
1215 | 1216 | Local<Value> value = base_obj->Get(env->context(), name).ToLocalChecked(); |
1216 | 1217 | if (value->IsString()) { |
1217 | 1218 | Utf8Value utf8value(env->isolate(), value.As<String>()); |
1218 | 1219 | (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 | + } |
1220 | 1223 | } |
1221 | 1224 | }; |
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); |
1227 | 1239 |
|
1228 | 1240 | Local<Value> port = |
1229 | 1241 | base_obj->Get(env->context(), env->port_string()).ToLocalChecked(); |
|