From 1269c80af1dc45c3cee1dbbc76270ac7c7d6f1c3 Mon Sep 17 00:00:00 2001 From: Stephan Szabo Date: Wed, 20 Jan 2021 10:08:49 -0800 Subject: [PATCH] file: Support unicode urls on windows Closes https://github.com/curl/curl/pull/6501 --- lib/curl_multibyte.c | 26 ++++++++++++++++++++++++ lib/curl_setup.h | 4 ++++ tests/FILEFORMAT.md | 1 + tests/data/Makefile.inc | 2 +- tests/data/test1703 | 45 +++++++++++++++++++++++++++++++++++++++++ tests/runtests.pl | 5 +++++ 6 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 tests/data/test1703 diff --git a/lib/curl_multibyte.c b/lib/curl_multibyte.c index d327c8ba77..571f1d38a6 100644 --- a/lib/curl_multibyte.c +++ b/lib/curl_multibyte.c @@ -82,6 +82,32 @@ char *curlx_convert_wchar_to_UTF8(const wchar_t *str_w) #if defined(USE_WIN32_LARGE_FILES) || defined(USE_WIN32_SMALL_FILES) +int curlx_win32_open(const char *filename, int oflag, ...) +{ + int pmode = 0; + +#ifdef _UNICODE + int result = -1; + wchar_t *filename_w = curlx_convert_UTF8_to_wchar(filename); +#endif + + va_list param; + va_start(param, oflag); + if(oflag & O_CREAT) + pmode = va_arg(param, int); + va_end(param); + +#ifdef _UNICODE + if(filename_w) + result = _wopen(filename_w, oflag, pmode); + free(filename_w); + if(result != -1) + return result; +#endif + + return (_open)(filename, oflag, pmode); +} + FILE *curlx_win32_fopen(const char *filename, const char *mode) { #ifdef _UNICODE diff --git a/lib/curl_setup.h b/lib/curl_setup.h index 22def2defa..9cef5f7d0f 100644 --- a/lib/curl_setup.h +++ b/lib/curl_setup.h @@ -335,8 +335,10 @@ # define stat(fname,stp) curlx_win32_stat(fname, stp) # define struct_stat struct _stati64 # define LSEEK_ERROR (__int64)-1 +# define open curlx_win32_open # define fopen(fname,mode) curlx_win32_fopen(fname, mode) # define access(fname,mode) curlx_win32_access(fname, mode) + int curlx_win32_open(const char *filename, int oflag, ...); int curlx_win32_stat(const char *path, struct_stat *buffer); FILE *curlx_win32_fopen(const char *filename, const char *mode); int curlx_win32_access(const char *path, int mode); @@ -356,9 +358,11 @@ # define fstat(fdes,stp) _fstat(fdes, stp) # define stat(fname,stp) curlx_win32_stat(fname, stp) # define struct_stat struct _stat +# define open curlx_win32_open # define fopen(fname,mode) curlx_win32_fopen(fname, mode) # define access(fname,mode) curlx_win32_access(fname, mode) int curlx_win32_stat(const char *path, struct_stat *buffer); + int curlx_win32_open(const char *filename, int oflag, ...); FILE *curlx_win32_fopen(const char *filename, const char *mode); int curlx_win32_access(const char *path, int mode); # endif diff --git a/tests/FILEFORMAT.md b/tests/FILEFORMAT.md index ec0dc4815a..b75a02a51a 100644 --- a/tests/FILEFORMAT.md +++ b/tests/FILEFORMAT.md @@ -406,6 +406,7 @@ Features testable here are: - `TLS-SRP` - `TrackMemory` - `typecheck` +- `Unicode` - `unittest` - `unix-sockets` - `verbose-strings` diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc index 464eab2a9b..6762c8dcc1 100644 --- a/tests/data/Makefile.inc +++ b/tests/data/Makefile.inc @@ -201,7 +201,7 @@ test1630 test1631 test1632 test1633 test1634 \ test1650 test1651 test1652 test1653 test1654 test1655 \ test1660 \ \ -test1700 test1701 test1702 \ +test1700 test1701 test1702 test1703 \ \ test1800 test1801 \ \ diff --git a/tests/data/test1703 b/tests/data/test1703 new file mode 100644 index 0000000000..ab4f0280f0 --- /dev/null +++ b/tests/data/test1703 @@ -0,0 +1,45 @@ + + + +FILE + + + + + +foo + bar +bar + foo +moo + + + +# Client-side + + +file + + +Unicode +win32 + + +basic file:// file with UTF-8 characters + + +file://localhost%FILE_PWD/log/%E3%83%86%E3%82%B9%E3%83%881703.txt + + +foo + bar +bar + foo +moo + + + +# Verify data after the test has been "shot" + + + diff --git a/tests/runtests.pl b/tests/runtests.pl index e7ed435bc5..ddee02ad36 100755 --- a/tests/runtests.pl +++ b/tests/runtests.pl @@ -268,6 +268,7 @@ my $has_manual; # set if built with built-in manual my $has_win32; # set if built for Windows my $has_mingw; # set if built with MinGW (as opposed to MinGW-w64) my $has_hyper = 0; # set if built with Hyper +my $has_unicode; # set if libcurl is built with Unicode support # this version is decided by the particular nghttp2 library that is being used my $h2cver = "h2c"; @@ -2826,6 +2827,7 @@ sub setupfeatures { $feature{"threaded-resolver"} = $has_threadedres; $feature{"TLS-SRP"} = $has_tls_srp; $feature{"TrackMemory"} = $has_memory_tracking; + $feature{"Unicode"} = $has_unicode; $feature{"unittest"} = $debug_build; $feature{"unix-sockets"} = $has_unix; $feature{"win32"} = $has_win32; @@ -3093,6 +3095,9 @@ sub checksystem { # 'https-proxy' is used as "server" so consider it a protocol push @protocols, 'https-proxy'; } + if($feat =~ /Unicode/i) { + $has_unicode = 1; + } } # # Test harness currently uses a non-stunnel server in order to