@@ -494,7 +494,9 @@ namespace url {
494
494
if (flags->IsInt32 ())
495
495
base->flags = flags->Int32Value (context).FromJust ();
496
496
497
- GET_AND_SET (env, base_obj, scheme, base, URL_FLAGS_HAS_SCHEME);
497
+ Local<Value> scheme = GET (env, base_obj, " scheme" );
498
+ base->scheme = Utf8Value (env->isolate (), scheme).out ();
499
+
498
500
GET_AND_SET (env, base_obj, username, base, URL_FLAGS_HAS_USERNAME);
499
501
GET_AND_SET (env, base_obj, password, base, URL_FLAGS_HAS_PASSWORD);
500
502
GET_AND_SET (env, base_obj, host, base, URL_FLAGS_HAS_HOST);
@@ -644,7 +646,7 @@ namespace url {
644
646
state = kNoScheme ;
645
647
continue ;
646
648
} else {
647
- url->flags |= URL_FLAGS_TERMINATED ;
649
+ url->flags |= URL_FLAGS_FAILED ;
648
650
return ;
649
651
}
650
652
break ;
@@ -654,10 +656,12 @@ namespace url {
654
656
p++;
655
657
continue ;
656
658
} else if (ch == ' :' || (has_state_override && ch == kEOL )) {
657
- buffer += ' :' ;
658
659
if (buffer.size () > 0 ) {
659
- url-> flags |= URL_FLAGS_HAS_SCHEME ;
660
+ buffer += ' : ' ;
660
661
url->scheme = buffer;
662
+ } else if (has_state_override) {
663
+ url->flags |= URL_FLAGS_TERMINATED;
664
+ return ;
661
665
}
662
666
if (IsSpecial (url->scheme )) {
663
667
url->flags |= URL_FLAGS_SPECIAL;
@@ -672,7 +676,6 @@ namespace url {
672
676
state = kFile ;
673
677
} else if (special &&
674
678
has_base &&
675
- base->flags & URL_FLAGS_HAS_SCHEME &&
676
679
url->scheme == base->scheme ) {
677
680
state = kSpecialRelativeOrAuthority ;
678
681
} else if (special) {
@@ -692,7 +695,7 @@ namespace url {
692
695
p = input;
693
696
continue ;
694
697
} else {
695
- url->flags |= URL_FLAGS_TERMINATED ;
698
+ url->flags |= URL_FLAGS_FAILED ;
696
699
return ;
697
700
}
698
701
break ;
@@ -702,7 +705,6 @@ namespace url {
702
705
url->flags |= URL_FLAGS_FAILED;
703
706
return ;
704
707
} else if (cannot_be_base && ch == ' #' ) {
705
- url->flags |= URL_FLAGS_HAS_SCHEME;
706
708
url->scheme = base->scheme ;
707
709
if (IsSpecial (url->scheme )) {
708
710
url->flags |= URL_FLAGS_SPECIAL;
@@ -725,12 +727,10 @@ namespace url {
725
727
url->flags |= URL_FLAGS_CANNOT_BE_BASE;
726
728
state = kFragment ;
727
729
} else if (has_base &&
728
- base->flags & URL_FLAGS_HAS_SCHEME &&
729
730
base->scheme != " file:" ) {
730
731
state = kRelative ;
731
732
continue ;
732
733
} else {
733
- url->flags |= URL_FLAGS_HAS_SCHEME;
734
734
url->scheme = " file:" ;
735
735
url->flags |= URL_FLAGS_SPECIAL;
736
736
special = true ;
@@ -756,7 +756,6 @@ namespace url {
756
756
}
757
757
break ;
758
758
case kRelative :
759
- url->flags |= URL_FLAGS_HAS_SCHEME;
760
759
url->scheme = base->scheme ;
761
760
if (IsSpecial (url->scheme )) {
762
761
url->flags |= URL_FLAGS_SPECIAL;
@@ -951,7 +950,6 @@ namespace url {
951
950
buffer.clear ();
952
951
state = kPort ;
953
952
if (state_override == kHostname ) {
954
- url->flags |= URL_FLAGS_TERMINATED;
955
953
return ;
956
954
}
957
955
} else if (ch == kEOL ||
@@ -972,7 +970,6 @@ namespace url {
972
970
buffer.clear ();
973
971
state = kPathStart ;
974
972
if (has_state_override) {
975
- url->flags |= URL_FLAGS_TERMINATED;
976
973
return ;
977
974
}
978
975
} else {
@@ -996,13 +993,26 @@ namespace url {
996
993
int port = 0 ;
997
994
for (size_t i = 0 ; i < buffer.size (); i++)
998
995
port = port * 10 + buffer[i] - ' 0' ;
999
- if (port >= 0 && port <= 0xffff ) {
1000
- url->port = NormalizePort (url->scheme , port);
1001
- } else if (!has_state_override) {
1002
- url->flags |= URL_FLAGS_FAILED;
996
+ if (port < 0 || port > 0xffff ) {
997
+ // TODO(TimothyGu): This hack is currently needed for the host
998
+ // setter since it needs access to hostname if it is valid, and
999
+ // if the FAILED flag is set the entire response to JS layer
1000
+ // will be empty.
1001
+ if (state_override == kHost )
1002
+ url->port = -1 ;
1003
+ else
1004
+ url->flags |= URL_FLAGS_FAILED;
1003
1005
return ;
1004
1006
}
1007
+ url->port = NormalizePort (url->scheme , port);
1005
1008
buffer.clear ();
1009
+ } else if (has_state_override) {
1010
+ // TODO(TimothyGu): Similar case as above.
1011
+ if (state_override == kHost )
1012
+ url->port = -1 ;
1013
+ else
1014
+ url->flags |= URL_FLAGS_TERMINATED;
1015
+ return ;
1006
1016
}
1007
1017
state = kPathStart ;
1008
1018
continue ;
@@ -1014,7 +1024,6 @@ namespace url {
1014
1024
case kFile :
1015
1025
base_is_file = (
1016
1026
has_base &&
1017
- base->flags & URL_FLAGS_HAS_SCHEME &&
1018
1027
base->scheme == " file:" );
1019
1028
switch (ch) {
1020
1029
case kEOL :
@@ -1097,7 +1106,6 @@ namespace url {
1097
1106
state = kFileHost ;
1098
1107
} else {
1099
1108
if (has_base &&
1100
- base->flags & URL_FLAGS_HAS_SCHEME &&
1101
1109
base->scheme == " file:" &&
1102
1110
base->flags & URL_FLAGS_HAS_PATH &&
1103
1111
base->path .size () > 0 &&
@@ -1158,8 +1166,7 @@ namespace url {
1158
1166
url->path .push_back (" " );
1159
1167
}
1160
1168
} else {
1161
- if (url->flags & URL_FLAGS_HAS_SCHEME &&
1162
- url->scheme == " file:" &&
1169
+ if (url->scheme == " file:" &&
1163
1170
url->path .empty () &&
1164
1171
buffer.size () == 2 &&
1165
1172
WINDOWS_DRIVE_LETTER (buffer[0 ], buffer[1 ])) {
@@ -1233,8 +1240,7 @@ namespace url {
1233
1240
const struct url_data * url) {
1234
1241
Isolate* isolate = env->isolate ();
1235
1242
argv[ARG_FLAGS] = Integer::NewFromUnsigned (isolate, url->flags );
1236
- if (url->flags & URL_FLAGS_HAS_SCHEME)
1237
- argv[ARG_PROTOCOL] = OneByteString (isolate, url->scheme .c_str ());
1243
+ argv[ARG_PROTOCOL] = OneByteString (isolate, url->scheme .c_str ());
1238
1244
if (url->flags & URL_FLAGS_HAS_USERNAME)
1239
1245
argv[ARG_USERNAME] = UTF8STRING (isolate, url->username );
1240
1246
if (url->flags & URL_FLAGS_HAS_PASSWORD)
@@ -1275,7 +1281,9 @@ namespace url {
1275
1281
HarvestBase (env, &base, base_obj.As <Object>());
1276
1282
1277
1283
URL::Parse (input, len, state_override, &url, &base, has_base);
1278
- if (url.flags & URL_FLAGS_INVALID_PARSE_STATE)
1284
+ if ((url.flags & URL_FLAGS_INVALID_PARSE_STATE) ||
1285
+ ((state_override != kUnknownState ) &&
1286
+ (url.flags & URL_FLAGS_TERMINATED)))
1279
1287
return ;
1280
1288
1281
1289
// Define the return value placeholders
0 commit comments