Module: wine Branch: master Commit: 3590a4227fb7eed98199c387439ad608c136afd4 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3590a4227fb7eed98199c38743...
Author: Aric Stewart aric@codeweavers.com Date: Tue Nov 11 09:17:29 2008 -0600
winhttp: Correct another difference between InternetCrackurl and WinHttpCrackUrl.
---
dlls/winhttp/request.c | 2 +- dlls/winhttp/tests/url.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++ dlls/winhttp/url.c | 12 +++++++ 3 files changed, 90 insertions(+), 1 deletions(-)
diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c index 1f91c99..d2d515f 100644 --- a/dlls/winhttp/request.c +++ b/dlls/winhttp/request.c @@ -1104,7 +1104,7 @@ static BOOL handle_redirect( request_t *request )
heap_free( request->path ); request->path = NULL; - if (uc.lpszUrlPath) + if (uc.dwUrlPathLength) { len = uc.dwUrlPathLength + uc.dwExtraInfoLength; if (!(request->path = heap_alloc( (len + 1) * sizeof(WCHAR) ))) goto end; diff --git a/dlls/winhttp/tests/url.c b/dlls/winhttp/tests/url.c index 20ff7f6..5d88614 100644 --- a/dlls/winhttp/tests/url.c +++ b/dlls/winhttp/tests/url.c @@ -60,6 +60,13 @@ static const WCHAR url9[] = {'h','t','t','p',':','/','/','u','s','e','r','n','a','m','e',':','p','a','s','s','w','o','r','d', '@','w','w','w','.','w','i','n','e','h','q','.','o','r','g',':','0','/','s','i','t','e','/','a','b','o','u','t','?','q','u','e','r','y',0};
+static const WCHAR url_k1[] = + {'h','t','t','p',':','/','/','u','s','e','r','n','a','m','e',':','p','a','s','s','w','o','r','d', + '@','w','w','w','.','w','i','n','e','h','q','.','o','r','g','/','s','i','t','e','/','a','b','o','u','t',0}; + +static const WCHAR url_k2[] = + {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g',0}; + static void fill_url_components( URL_COMPONENTS *uc ) { uc->dwStructSize = sizeof(URL_COMPONENTS); @@ -269,7 +276,77 @@ static void WinHttpCreateUrl_test( void ) HeapFree( GetProcessHeap(), 0, url ); }
+static void WinHttpCrackUrl_test( void ) +{ + URL_COMPONENTSW uc; + DWORD Len = 0; + BOOL ret; + + /* NULL components */ + SetLastError( 0xdeadbeef ); + memset(&uc,0,sizeof(uc)); + uc.dwStructSize = sizeof(URL_COMPONENTSW); + uc.dwSchemeLength = -1; + uc.dwHostNameLength = -1; + uc.dwUserNameLength = -1; + uc.dwPasswordLength = -1; + uc.dwUrlPathLength = -1; + uc.dwExtraInfoLength = -1; + + ret = WinHttpCrackUrl( url_k1, 0, 0,&uc); + + Len = 0; + ok (ret!=0,"WinHttpCrackUrl failed\n"); + ok (uc.lpszScheme == url_k1,"Failed to get uc.lpszScheme\n"); + ok (uc.dwSchemeLength == 4, "Unexpected dwSchemeLength\n"); + Len += uc.dwSchemeLength + 3; + ok (uc.lpszUserName== &url_k1[Len],"Failed to get uc.lpszUserName\n"); + ok (uc.dwUserNameLength == 8, "Unexpected dwUserNameLength\n"); + Len +=uc.dwUserNameLength + 1; + ok (uc.lpszPassword==&url_k1[Len],"Failed to get uc.lpszPassword\n"); + ok (uc.dwPasswordLength == 8, "Unexpected dwPasswordLength\n"); + Len +=uc.dwPasswordLength + 1; + ok (uc.lpszHostName == &url_k1[Len],"Failed to get uc.lpszHostName\n"); + ok (uc.dwHostNameLength == 14, "Unexpected dwHostNameLength\n"); + Len += uc.dwHostNameLength; + ok (uc.lpszUrlPath == &url_k1[Len],"Failed to get uc.lpszUrlPath\n"); + ok (uc.dwUrlPathLength == 11, "Unexpected dwUrlPathLength\n"); + Len += uc.dwUrlPathLength; + ok (uc.lpszExtraInfo == &url_k1[Len],"Failed to get uc.lpszExtraInfo\n"); + ok (uc.dwExtraInfoLength == 0, "Unexpected dwExtraInfoLength\n"); + + memset(&uc,0,sizeof(uc)); + uc.dwStructSize = sizeof(URL_COMPONENTSW); + uc.dwSchemeLength = -1; + uc.dwHostNameLength = -1; + uc.dwUserNameLength = -1; + uc.dwPasswordLength = -1; + uc.dwUrlPathLength = -1; + uc.dwExtraInfoLength = -1; + + ret = WinHttpCrackUrl( url_k2, 0, 0,&uc); + + Len = 0; + ok (ret!=0,"WinHttpCrackUrl failed\n"); + ok (uc.lpszScheme == url_k2,"Failed to get uc.lpszScheme\n"); + ok (uc.dwSchemeLength == 4, "Unexpected dwSchemeLength\n"); + Len += uc.dwSchemeLength + 3; + ok (uc.lpszUserName == NULL ,"Got uc.lpszUserName\n"); + ok (uc.dwUserNameLength == 0, "Unexpected dwUserNameLength\n"); + ok (uc.lpszPassword == NULL,"Got uc.lpszPassword\n"); + ok (uc.dwPasswordLength == 0, "Unexpected dwPasswordLength\n"); + ok (uc.lpszHostName == &url_k2[Len],"Failed to get uc.lpszHostName\n"); + ok (uc.dwHostNameLength == 14, "Unexpected dwHostNameLength\n"); + Len += uc.dwHostNameLength; + ok (uc.lpszUrlPath == &url_k2[Len],"Failed to get uc.lpszUrlPath\n"); + ok (uc.dwUrlPathLength == 0, "Unexpected dwUrlPathLength\n"); + Len += uc.dwUrlPathLength; + ok (uc.lpszExtraInfo == &url_k2[Len],"Failed to get uc.lpszExtraInfo\n"); + ok (uc.dwExtraInfoLength == 0, "Unexpected dwExtraInfoLength\n"); +} + START_TEST(url) { WinHttpCreateUrl_test(); + WinHttpCrackUrl_test(); } diff --git a/dlls/winhttp/url.c b/dlls/winhttp/url.c index 7d739d5..ac25f2c 100644 --- a/dlls/winhttp/url.c +++ b/dlls/winhttp/url.c @@ -40,8 +40,12 @@ BOOL WINAPI InternetCrackUrlW( LPCWSTR, DWORD, DWORD, LPURL_COMPONENTSW ); BOOL WINAPI WinHttpCrackUrl( LPCWSTR url, DWORD len, DWORD flags, LPURL_COMPONENTSW components ) { BOOL ret; + INT upLen; + INT exLen;
TRACE("%s, %d, %x, %p\n", debugstr_w(url), len, flags, components); + upLen = components->dwUrlPathLength; + exLen = components->dwExtraInfoLength;
if ((ret = InternetCrackUrlW( url, len, flags, components ))) { @@ -53,6 +57,14 @@ BOOL WINAPI WinHttpCrackUrl( LPCWSTR url, DWORD len, DWORD flags, LPURL_COMPONEN set_last_error( ERROR_WINHTTP_UNRECOGNIZED_SCHEME ); return FALSE; } + if (!len) + len = lstrlenW(url); + /* WinHttpCrackUrl actually returns pointers to the end of the string for components, + other than UserName and Password, that are missing */ + if (upLen && components->lpszUrlPath == NULL) + components->lpszUrlPath = (LPWSTR)&url[len]; + if (exLen && components->lpszExtraInfo == NULL) + components->lpszExtraInfo = (LPWSTR)&url[len]; } return ret; }