Robert Shearman : wininet:
Parse the scheme the string in InternetCreateFileW.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Mar 9 16:06:10 CST 2006
Module: wine
Branch: refs/heads/master
Commit: e58a448c4a11c1d5058c81e1c786f10f4a80cf42
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=e58a448c4a11c1d5058c81e1c786f10f4a80cf42
Author: Robert Shearman <rob at codeweavers.com>
Date: Thu Mar 9 15:16:41 2006 +0000
wininet: Parse the scheme the string in InternetCreateFileW.
Parse the scheme the string in InternetCreateFileW and rewrite
url_uses_default_port using schemes instead of strings.
---
dlls/wininet/internet.c | 59 +++++++++++++++++++++++++++------------------
dlls/wininet/tests/http.c | 2 --
2 files changed, 35 insertions(+), 26 deletions(-)
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c
index 3255384..4a2f001 100644
--- a/dlls/wininet/internet.c
+++ b/dlls/wininet/internet.c
@@ -3685,28 +3685,19 @@ BOOL WINAPI InternetCombineUrlW(LPCWSTR
#define URL_GET_COMP_LENGTHA(url, component) ((url)->dw##component##Length ? \
(url)->dw##component##Length : strlen((url)->lpsz##component))
-static BOOL url_uses_default_port(LPURL_COMPONENTSW lpUrlComponents)
+static BOOL url_uses_default_port(INTERNET_SCHEME nScheme, INTERNET_PORT nPort)
{
- static const WCHAR httpW[] = {'h','t','t','p',0};
- static const WCHAR httpsW[] = {'h','t','t','p','s',0};
- static const WCHAR ftpW[] = {'f','t','p',0};
- static const WCHAR gopherW[] = {'g','o','p','h','e','r',0};
- DWORD len;
-
- if (!lpUrlComponents->lpszScheme) return FALSE;
-
- len = URL_GET_COMP_LENGTH(lpUrlComponents, Scheme);
- if (!strncmpW(lpUrlComponents->lpszScheme, httpW, len) &&
- (lpUrlComponents->nPort == INTERNET_DEFAULT_HTTP_PORT))
+ if ((nScheme == INTERNET_SCHEME_HTTP) &&
+ (nPort == INTERNET_DEFAULT_HTTP_PORT))
return TRUE;
- if (!strncmpW(lpUrlComponents->lpszScheme, httpsW, len) &&
- (lpUrlComponents->nPort == INTERNET_DEFAULT_HTTPS_PORT))
+ if ((nScheme == INTERNET_SCHEME_HTTPS) &&
+ (nPort == INTERNET_DEFAULT_HTTPS_PORT))
return TRUE;
- if (!strncmpW(lpUrlComponents->lpszScheme, ftpW, len) &&
- (lpUrlComponents->nPort == INTERNET_DEFAULT_FTP_PORT))
+ if ((nScheme == INTERNET_SCHEME_FTP) &&
+ (nPort == INTERNET_DEFAULT_FTP_PORT))
return TRUE;
- if (!strncmpW(lpUrlComponents->lpszScheme, gopherW, len) &&
- (lpUrlComponents->nPort == INTERNET_DEFAULT_GOPHER_PORT))
+ if ((nScheme == INTERNET_SCHEME_GOPHER) &&
+ (nPort == INTERNET_DEFAULT_GOPHER_PORT))
return TRUE;
return FALSE;
@@ -3729,14 +3720,25 @@ static LPCWSTR INTERNET_GetSchemeString(
static BOOL calc_url_length(LPURL_COMPONENTSW lpUrlComponents,
LPDWORD lpdwUrlLength)
{
+ INTERNET_SCHEME nScheme;
+
*lpdwUrlLength = 0;
if (lpUrlComponents->lpszScheme)
- *lpdwUrlLength += URL_GET_COMP_LENGTH(lpUrlComponents, Scheme);
+ {
+ DWORD dwLen = URL_GET_COMP_LENGTH(lpUrlComponents, Scheme);
+ *lpdwUrlLength += dwLen;
+ nScheme = GetInternetSchemeW(lpUrlComponents->lpszScheme, dwLen);
+ }
else
{
- LPCWSTR scheme = INTERNET_GetSchemeString(lpUrlComponents->nScheme);
- TRACE("got scheme %s\n", debugstr_w(scheme));
+ LPCWSTR scheme;
+
+ nScheme = lpUrlComponents->nScheme;
+
+ if (nScheme == INTERNET_SCHEME_DEFAULT)
+ nScheme = INTERNET_SCHEME_HTTP;
+ scheme = INTERNET_GetSchemeString(nScheme);
*lpdwUrlLength += strlenW(scheme);
}
@@ -3765,7 +3767,7 @@ static BOOL calc_url_length(LPURL_COMPON
if (lpUrlComponents->lpszHostName)
*lpdwUrlLength += URL_GET_COMP_LENGTH(lpUrlComponents, HostName);
- if (!url_uses_default_port(lpUrlComponents))
+ if (!url_uses_default_port(nScheme, lpUrlComponents->nPort))
{
char szPort[MAX_WORD_DIGITS];
@@ -3905,6 +3907,7 @@ BOOL WINAPI InternetCreateUrlW(LPURL_COM
LPWSTR lpszUrl, LPDWORD lpdwUrlLength)
{
DWORD dwLen;
+ INTERNET_SCHEME nScheme;
static const WCHAR colonSlashW[] = {':','/','/'};
static const WCHAR percentD[] = {'%','d',0};
@@ -3940,10 +3943,18 @@ BOOL WINAPI InternetCreateUrlW(LPURL_COM
dwLen = URL_GET_COMP_LENGTH(lpUrlComponents, Scheme);
memcpy(lpszUrl, lpUrlComponents->lpszScheme, dwLen * sizeof(WCHAR));
lpszUrl += dwLen;
+
+ nScheme = GetInternetSchemeW(lpUrlComponents->lpszScheme, dwLen);
}
else
{
- LPCWSTR scheme = INTERNET_GetSchemeString(lpUrlComponents->nScheme);
+ LPCWSTR scheme;
+ nScheme = lpUrlComponents->nScheme;
+
+ if (nScheme == INTERNET_SCHEME_DEFAULT)
+ nScheme = INTERNET_SCHEME_HTTP;
+
+ scheme = INTERNET_GetSchemeString(nScheme);
dwLen = strlenW(scheme);
memcpy(lpszUrl, scheme, dwLen * sizeof(WCHAR));
lpszUrl += dwLen;
@@ -3979,7 +3990,7 @@ BOOL WINAPI InternetCreateUrlW(LPURL_COM
lpszUrl += dwLen;
}
- if (!url_uses_default_port(lpUrlComponents))
+ if (!url_uses_default_port(nScheme, lpUrlComponents->nPort))
{
WCHAR szPort[MAX_WORD_DIGITS];
diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c
index 92f4c60..72ab72c 100644
--- a/dlls/wininet/tests/http.c
+++ b/dlls/wininet/tests/http.c
@@ -917,13 +917,11 @@ static void InternetCreateUrlA_test(void
SetLastError(0xdeadbeef);
urlComp.lpszScheme = NULL;
ret = InternetCreateUrlA(&urlComp, 0, szUrl, &len);
- todo_wine {
ok(ret, "Expected success\n");
ok(GetLastError() == 0xdeadbeef,
"Expected 0xdeadbeef, got %ld\n", GetLastError());
ok(len == 50, "Expected len 50, got %ld\n", len);
ok(!strcmp(szUrl, CREATE_URL1), "Expected %s, got %s\n", CREATE_URL1, szUrl);
- }
/* alloced szUrl, invalid nScheme
* any nScheme out of range seems ignored
More information about the wine-cvs
mailing list