diff options
author | Michał Cichoń <michcic@gmail.com> | 2017-05-18 18:16:20 +0200 |
---|---|---|
committer | Michał Cichoń <michcic@gmail.com> | 2017-05-18 18:16:20 +0200 |
commit | e1eed89e03c0aadbd6c7781ce680768a16be7c03 (patch) | |
tree | a0e44a81c7590e6a1d66faec80af4a0ee18e2549 /src | |
parent | aa2d42f83607d7eae63cc7d860b919e60e1defd8 (diff) | |
download | pianobar-windows-e1eed89e03c0aadbd6c7781ce680768a16be7c03.tar.gz pianobar-windows-e1eed89e03c0aadbd6c7781ce680768a16be7c03.tar.bz2 pianobar-windows-e1eed89e03c0aadbd6c7781ce680768a16be7c03.zip |
Handle escaped authority url components. pianobar-windows-binaries/#3
Authority username and password now can be escaped to handle special characters.
Diffstat (limited to 'src')
-rw-r--r-- | src/http/http.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/http/http.c b/src/http/http.c index 609317f..4576d04 100644 --- a/src/http/http.c +++ b/src/http/http.c @@ -250,6 +250,32 @@ bool HttpSetAutoProxy (http_t http, const char* url) { return false; } +static void HttpUrlDecodeInplace (wchar_t* url) +{ + wchar_t* input = url; + wchar_t* output = url; + size_t size = wcslen (url); + while (size > 0) { + if (input[0] == '%' && iswxdigit(input[1]) && iswxdigit(input[2])) { + wchar_t hex[3]; + hex[0] = input[1]; + hex[1] = input[2]; + hex[2] = 0; + *output++ = (wchar_t)(wcstol (hex, NULL, 16)); + input += 3; + size -= 3; + } + else { + *output++ = *input++; + --size; + } + } + + if (output < input) { + *output = '\0'; + } +} + bool HttpSetProxy (http_t http, const char* url) { URL_COMPONENTS urlComponents; wchar_t* wideUrl = NULL; @@ -267,10 +293,12 @@ bool HttpSetProxy (http_t http, const char* url) { if (urlComponents.lpszUserName && urlComponents.dwUserNameLength > 0) { wideUsername = wcsdup(urlComponents.lpszUserName); wideUsername[urlComponents.dwUserNameLength] = 0; + HttpUrlDecodeInplace (wideUsername); } if (urlComponents.lpszPassword && urlComponents.dwPasswordLength > 0) { widePassword = wcsdup(urlComponents.lpszPassword); widePassword[urlComponents.dwPasswordLength] = 0; + HttpUrlDecodeInplace (widePassword); } } |