Skip to content

Commit

Permalink
parse url on windows: fix bug where and absolute path got prefixed wi…
Browse files Browse the repository at this point in the history
…th "./"

RFC 3986 §4.2
A path segment that contains a colon character (e.g., "this:that") cannot be used as the first segment of a relative-path reference, as it would be mistaken for a scheme name. Such a segment must be preceded by a dot-segment (e.g., "./this:that") to make a relative-path reference.

Read "net/url".URL.String() for more info
  • Loading branch information
azr committed Jan 31, 2019
1 parent dde89f9 commit 72fcb20
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 10 deletions.
4 changes: 2 additions & 2 deletions helper/url/url_test.go
Expand Up @@ -36,10 +36,10 @@ var parseTests = []parseTest{
var winParseTests = []parseTest{
{
rawURL: `C:\`,
scheme: ``,
scheme: `file`,
host: ``,
path: `C:/`,
str: `C:/`,
str: `file://C:/`,
err: false,
},
{
Expand Down
15 changes: 7 additions & 8 deletions helper/url/url_windows.go
Expand Up @@ -11,19 +11,18 @@ func parse(rawURL string) (*url.URL, error) {
// Make sure we're using "/" since URLs are "/"-based.
rawURL = filepath.ToSlash(rawURL)

if len(rawURL) > 1 && rawURL[1] == ':' {
// Assume we're dealing with a drive letter. In which case we
// force the 'file' scheme to avoid "net/url" URL.String() prepending
// our url with "./".
rawURL = "file://" + rawURL
}

u, err := url.Parse(rawURL)
if err != nil {
return nil, err
}

if len(rawURL) > 1 && rawURL[1] == ':' {
// Assume we're dealing with a drive letter file path where the drive
// letter has been parsed into the URL Scheme, and the rest of the path
// has been parsed into the URL Path without the leading ':' character.
u.Path = fmt.Sprintf("%s:%s", string(rawURL[0]), u.Path)
u.Scheme = ""
}

if len(u.Host) > 1 && u.Host[1] == ':' && strings.HasPrefix(rawURL, "file://") {
// Assume we're dealing with a drive letter file path where the drive
// letter has been parsed into the URL Host.
Expand Down

0 comments on commit 72fcb20

Please sign in to comment.