Skip to content

Commit

Permalink
url: change path parsing for non-special URLs
Browse files Browse the repository at this point in the history
This changes to the way path parsing for non-special URLs.
It allows paths to be empty for non-special URLs and also
takes that into account when serializing.

Fixes: nodejs#11962
Refs: whatwg/url#213
  • Loading branch information
watilde committed Apr 2, 2017
1 parent 0ea4570 commit 66feed8
Showing 1 changed file with 23 additions and 5 deletions.
28 changes: 23 additions & 5 deletions src/node_url.cc
Original file line number Diff line number Diff line change
Expand Up @@ -862,8 +862,10 @@ namespace url {
}
break;
case kRelativeSlash:
if (ch == '/' || special_back_slash) {
if (IsSpecial(url->scheme) && (ch == '/' || ch == '\\')) {
state = kSpecialAuthorityIgnoreSlashes;
} else if (ch == '/') {
state = kAuthority;
} else {
if (base->flags & URL_FLAGS_HAS_USERNAME) {
url->flags |= URL_FLAGS_HAS_USERNAME;
Expand Down Expand Up @@ -1145,9 +1147,25 @@ namespace url {
}
break;
case kPathStart:
state = kPath;
if (ch != '/' && !special_back_slash)
continue;
if (IsSpecial(url->scheme)) {
state = kPath;
if (ch != '/' && ch != '\\') {
continue;
}
} else if (!has_state_override && ch == '?') {
url->flags |= URL_FLAGS_HAS_QUERY;
url->query.clear();
state = kQuery;
} else if (!has_state_override && ch == '#') {
url->flags |= URL_FLAGS_HAS_FRAGMENT;
url->fragment.clear();
state = kFragment;
} else if (ch != kEOL) {
state = kPath;
if (ch != '/') {
continue;
}
}
break;
case kPath:
if (ch == kEOL ||
Expand All @@ -1165,7 +1183,7 @@ namespace url {
url->flags |= URL_FLAGS_HAS_PATH;
url->path.push_back("");
}
} else {
} else if (!IsSingleDotSegment(buffer)) {
if (url->scheme == "file:" &&
url->path.empty() &&
buffer.size() == 2 &&
Expand Down

0 comments on commit 66feed8

Please sign in to comment.