diff --git a/fibjs/src/net/Url.cpp b/fibjs/src/net/Url.cpp index 407242bdd4..a739c0e7dc 100644 --- a/fibjs/src/net/Url.cpp +++ b/fibjs/src/net/Url.cpp @@ -448,14 +448,19 @@ result_t Url::parse(exlib::string url, bool parseQueryString, bool slashesDenote } bool getString(Isolate* isolate, v8::Local& args, - const char* key, exlib::string& retVal) + const char* key, exlib::string& retVal, bool allowNumber = false) { v8::Local context = isolate->context(); JSValue v = args->Get(context, isolate->NewString(key)); - if (!v.IsEmpty() && (v->IsString() || v->IsStringObject())) { - retVal = isolate->toString(v); - return true; + if (!v.IsEmpty()) { + if (v->IsString() || v->IsStringObject()) { + retVal = isolate->toString(v); + return true; + } else if (allowNumber && (v->IsNumber() || v->IsNumberObject())) { + retVal = isolate->toString(v); + return true; + } } return false; @@ -481,7 +486,7 @@ result_t Url::format(v8::Local args) if (getString(isolate, args, "host", str)) set__host(str); - if (getString(isolate, args, "port", str)) + if (getString(isolate, args, "port", str, true)) set_port(str); if (getString(isolate, args, "hostname", str)) diff --git a/test/url_test.js b/test/url_test.js index f62b51f38c..4bdd08415c 100644 --- a/test/url_test.js +++ b/test/url_test.js @@ -630,6 +630,15 @@ describe("url", () => { 'hash': 'h', 'query': 's' }, + 'https://a.com:447/a/b/c?s#h': { + 'href': 'https://a.com:447/a/b/c?s#h', + 'protocol': 'https', + 'hostname': 'a.com', + 'pathname': 'a/b/c', + 'port': 447, + 'hash': 'h', + 'query': 's' + }, 'http://atpass:foo%40bar@127.0.0.1/': { 'href': 'http://atpass:foo%40bar@127.0.0.1/', 'username': 'atpass',