package url import ( "fmt" "net/url" "path/filepath" "strings" ) 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(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. u.Path = fmt.Sprintf("%s%s", u.Host, u.Path) u.Host = "" } // Remove leading slash for absolute file paths. if len(u.Path) > 2 && u.Path[0] == '/' && u.Path[2] == ':' { u.Path = u.Path[1:] } return u, err }