diff options
author | Stephan Szabo <stephan.szabo@sony.com> | 2021-01-20 10:08:49 -0800 |
---|---|---|
committer | Jay Satiro <raysatiro@yahoo.com> | 2021-02-09 02:45:51 -0500 |
commit | 1269c80af1dc45c3cee1dbbc76270ac7c7d6f1c3 (patch) | |
tree | 8376253c4116399f71fbfd820a940949f18117f9 | |
parent | d4a3b87c13da5db437dc66d646132bdeb902e196 (diff) | |
download | curl-1269c80af1dc45c3cee1dbbc76270ac7c7d6f1c3.tar.gz |
file: Support unicode urls on windows
Closes https://github.com/curl/curl/pull/6501
-rw-r--r-- | lib/curl_multibyte.c | 26 | ||||
-rw-r--r-- | lib/curl_setup.h | 4 | ||||
-rw-r--r-- | tests/FILEFORMAT.md | 1 | ||||
-rw-r--r-- | tests/data/Makefile.inc | 2 | ||||
-rw-r--r-- | tests/data/test1703 | 45 | ||||
-rwxr-xr-x | tests/runtests.pl | 5 |
6 files changed, 82 insertions, 1 deletions
diff --git a/lib/curl_multibyte.c b/lib/curl_multibyte.c index d327c8ba7..571f1d38a 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 22def2def..9cef5f7d0 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 ec0dc4815..b75a02a51 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 464eab2a9..6762c8dcc 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 000000000..ab4f0280f --- /dev/null +++ b/tests/data/test1703 @@ -0,0 +1,45 @@ +<testcase> +<info> +<keywords> +FILE +</keywords> +</info> + +<reply> +<data> +foo + bar +bar + foo +moo +</data> +</reply> + +# Client-side +<client> +<server> +file +</server> +<features> +Unicode +win32 +</features> +<name> +basic file:// file with UTF-8 characters +</name> +<command option="no-include"> +file://localhost%FILE_PWD/log/%E3%83%86%E3%82%B9%E3%83%881703.txt +</command> +<file name="log/ใในใ1703.txt"> +foo + bar +bar + foo +moo +</file> +</client> + +# Verify data after the test has been "shot" +<verify> +</verify> +</testcase> diff --git a/tests/runtests.pl b/tests/runtests.pl index e7ed435bc..ddee02ad3 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 |