As a repo url, we're accepting * raw windows paths (with both \ and /) c:\cygwin repo \\machine\share\cygwin repo * proper file: urls file:///c:/cygwin%20repo file://machine/share/cygwin%20repo
Most non-standard urls accepted by the old code should work, too. Paths longer than 260 characters are not supported anymore. --- netio.cc | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/netio.cc b/netio.cc index c8982de..1e784b1 100644 --- a/netio.cc +++ b/netio.cc @@ -25,6 +25,8 @@ #include <stdlib.h> #include <string.h> +#include <Shlwapi.h> + #include "resource.h" #include "state.h" #include "msg.h" @@ -72,11 +74,24 @@ NetIO::open (char const *url, bool cachable) else if (strncmp (url, "ftps://", 7) == 0) proto = ftps; else if (strncmp (url, "file://", 7) == 0) - proto = file; - else { proto = file; - file_url = (std::string("file://") + url); + + // WinInet expects a legacy file:// url + // (a windows path with "file://" prepended) + // https://blogs.msdn.microsoft.com/freeassociations/2005/05/19/the-bizarre-and-unhappy-story-of-file-urls/ + char path[MAX_PATH]; + DWORD len = MAX_PATH; + if (S_OK == PathCreateFromUrl(url, path, &len, 0)) + { + file_url = std::string("file://") + path; + url = file_url.c_str(); + } + } + else // treat everything else as a windows path + { + proto = file; + file_url = std::string("file://") + url; url = file_url.c_str(); } -- 2.16.1