From fac1457233c8ee56f08bd4b37a2ed028b5d9abdd Mon Sep 17 00:00:00 2001 From: Colin Finck Date: Thu, 4 Sep 2008 18:37:34 +0000 Subject: [PATCH] - Sync wininet to Wine HEAD - Remove a change from our "wininet_ros.diff" file, which has been applied to Wine as well in the meantime - Eliminate a warning in our "inet_ntop.c" (ROS glue code) svn path=/trunk/; revision=35943 --- reactos/dll/win32/wininet/cookie.c | 16 +- reactos/dll/win32/wininet/ftp.c | 10 +- reactos/dll/win32/wininet/http.c | 195 +++--- reactos/dll/win32/wininet/inet_ntop.c | 3 + reactos/dll/win32/wininet/internet.c | 779 +++++++++++---------- reactos/dll/win32/wininet/internet.h | 18 +- reactos/dll/win32/wininet/netconnection.c | 17 + reactos/dll/win32/wininet/rsrc.rc | 1 + reactos/dll/win32/wininet/urlcache.c | 2 +- reactos/dll/win32/wininet/utility.c | 14 + reactos/dll/win32/wininet/wininet_Ro.rc | 49 ++ reactos/dll/win32/wininet/wininet_ros.diff | 22 - 12 files changed, 617 insertions(+), 509 deletions(-) create mode 100644 reactos/dll/win32/wininet/wininet_Ro.rc diff --git a/reactos/dll/win32/wininet/cookie.c b/reactos/dll/win32/wininet/cookie.c index bd22bc625c4..12d841bc7b9 100644 --- a/reactos/dll/win32/wininet/cookie.c +++ b/reactos/dll/win32/wininet/cookie.c @@ -631,10 +631,10 @@ BOOL WINAPI InternetClearAllPerSiteCookieDecisions( VOID ) * * See InternetEnumPerSiteCookieDecisionW. */ -BOOL WINAPI InternetEnumPerSiteCookieDecisionA( LPSTR pszSiteName, unsigned long *pcSiteNameSize, - unsigned long *pdwDecision, unsigned long dwIndex ) +BOOL WINAPI InternetEnumPerSiteCookieDecisionA( LPSTR pszSiteName, ULONG *pcSiteNameSize, + ULONG *pdwDecision, ULONG dwIndex ) { - FIXME("(%s, %p, %p, 0x%08lx) stub\n", + FIXME("(%s, %p, %p, 0x%08x) stub\n", debugstr_a(pszSiteName), pcSiteNameSize, pdwDecision, dwIndex); return FALSE; } @@ -649,10 +649,10 @@ BOOL WINAPI InternetEnumPerSiteCookieDecisionA( LPSTR pszSiteName, unsigned long * FALSE on failure * */ -BOOL WINAPI InternetEnumPerSiteCookieDecisionW( LPWSTR pszSiteName, unsigned long *pcSiteNameSize, - unsigned long *pdwDecision, unsigned long dwIndex ) +BOOL WINAPI InternetEnumPerSiteCookieDecisionW( LPWSTR pszSiteName, ULONG *pcSiteNameSize, + ULONG *pdwDecision, ULONG dwIndex ) { - FIXME("(%s, %p, %p, 0x%08lx) stub\n", + FIXME("(%s, %p, %p, 0x%08x) stub\n", debugstr_w(pszSiteName), pcSiteNameSize, pdwDecision, dwIndex); return FALSE; } @@ -660,7 +660,7 @@ BOOL WINAPI InternetEnumPerSiteCookieDecisionW( LPWSTR pszSiteName, unsigned lon /*********************************************************************** * InternetGetPerSiteCookieDecisionA (WININET.@) */ -BOOL WINAPI InternetGetPerSiteCookieDecisionA( LPCSTR pwchHostName, unsigned long *pResult ) +BOOL WINAPI InternetGetPerSiteCookieDecisionA( LPCSTR pwchHostName, ULONG *pResult ) { FIXME("(%s, %p) stub\n", debugstr_a(pwchHostName), pResult); return FALSE; @@ -669,7 +669,7 @@ BOOL WINAPI InternetGetPerSiteCookieDecisionA( LPCSTR pwchHostName, unsigned lon /*********************************************************************** * InternetGetPerSiteCookieDecisionW (WININET.@) */ -BOOL WINAPI InternetGetPerSiteCookieDecisionW( LPCWSTR pwchHostName, unsigned long *pResult ) +BOOL WINAPI InternetGetPerSiteCookieDecisionW( LPCWSTR pwchHostName, ULONG *pResult ) { FIXME("(%s, %p) stub\n", debugstr_w(pwchHostName), pResult); return FALSE; diff --git a/reactos/dll/win32/wininet/ftp.c b/reactos/dll/win32/wininet/ftp.c index 36e90057008..cb24782fa4b 100644 --- a/reactos/dll/win32/wininet/ftp.c +++ b/reactos/dll/win32/wininet/ftp.c @@ -1227,8 +1227,7 @@ static DWORD FTPFILE_QueryOption(WININETHANDLEHEADER *hdr, DWORD option, void *b return ERROR_SUCCESS; } - FIXME("Not implemented option %d\n", option); - return ERROR_INTERNET_INVALID_OPTION; + return INET_QueryOption(option, buffer, size, unicode); } static DWORD FTPFILE_ReadFile(WININETHANDLEHEADER *hdr, void *buffer, DWORD size, DWORD *read) @@ -1553,6 +1552,7 @@ static BOOL FTP_FtpGetFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszRemoteFile, &iar, sizeof(INTERNET_ASYNC_RESULT)); } + if (!bSuccess) DeleteFileW(lpszNewFile); return bSuccess; } @@ -2194,8 +2194,7 @@ static DWORD FTPSESSION_QueryOption(WININETHANDLEHEADER *hdr, DWORD option, void return ERROR_SUCCESS; } - FIXME("Not implemented option %d\n", option); - return ERROR_INTERNET_INVALID_OPTION; + return INET_QueryOption(option, buffer, size, unicode); } static const HANDLEHEADERVtbl FTPSESSIONVtbl = { @@ -3275,8 +3274,7 @@ static DWORD FTPFINDNEXT_QueryOption(WININETHANDLEHEADER *hdr, DWORD option, voi return ERROR_SUCCESS; } - FIXME("Not implemented option %d\n", option); - return ERROR_INTERNET_INVALID_OPTION; + return INET_QueryOption(option, buffer, size, unicode); } static DWORD FTPFINDNEXT_FindNextFileW(WININETHANDLEHEADER *hdr, void *data) diff --git a/reactos/dll/win32/wininet/http.c b/reactos/dll/win32/wininet/http.c index a27997e84c8..f0ad6beddc1 100644 --- a/reactos/dll/win32/wininet/http.c +++ b/reactos/dll/win32/wininet/http.c @@ -1348,6 +1348,8 @@ static BOOL HTTP_ResolveName(LPWININETHTTPREQW lpwhr) INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, INTERNET_STATUS_NAME_RESOLVED, szaddr, strlen(szaddr)+1); + + TRACE("resolved %s to %s\n", debugstr_w(lpwhs->lpszServerName), szaddr); return TRUE; } @@ -1394,7 +1396,6 @@ static void HTTPREQ_Destroy(WININETHANDLEHEADER *hdr) static void HTTPREQ_CloseConnection(WININETHANDLEHEADER *hdr) { LPWININETHTTPREQW lpwhr = (LPWININETHTTPREQW) hdr; - LPWININETHTTPSESSIONW lpwhs = NULL; TRACE("%p\n",lpwhr); @@ -1426,8 +1427,6 @@ static void HTTPREQ_CloseConnection(WININETHANDLEHEADER *hdr) lpwhr->pProxyAuthInfo = NULL; } - lpwhs = lpwhr->lpHttpSession; - INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, INTERNET_STATUS_CLOSING_CONNECTION, 0, 0); @@ -1456,14 +1455,20 @@ static DWORD HTTPREQ_QueryOption(WININETHANDLEHEADER *hdr, DWORD option, void *b WCHAR url[INTERNET_MAX_URL_LENGTH]; HTTPHEADERW *host; DWORD len; + WCHAR *pch; - static const WCHAR formatW[] = {'h','t','t','p',':','/','/','%','s','%','s',0}; + static const WCHAR httpW[] = {'h','t','t','p',':','/','/',0}; static const WCHAR hostW[] = {'H','o','s','t',0}; TRACE("INTERNET_OPTION_URL\n"); host = HTTP_GetHeader(req, hostW); - sprintfW(url, formatW, host->lpszValue, req->lpszPath); + strcpyW(url, httpW); + strcatW(url, host->lpszValue); + if (NULL != (pch = strchrW(url + strlenW(httpW), ':'))) + *pch = 0; + strcatW(url, req->lpszPath); + TRACE("INTERNET_OPTION_URL: %s\n",debugstr_w(url)); if(unicode) { @@ -1576,8 +1581,7 @@ static DWORD HTTPREQ_QueryOption(WININETHANDLEHEADER *hdr, DWORD option, void *b } } - FIXME("Not implemented option %d\n", option); - return ERROR_INTERNET_INVALID_OPTION; + return INET_QueryOption(option, buffer, size, unicode); } static DWORD HTTPREQ_SetOption(WININETHANDLEHEADER *hdr, DWORD option, void *buffer, DWORD size) @@ -1886,13 +1890,10 @@ HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW lpwhs, { LPWININETAPPINFOW hIC = NULL; LPWININETHTTPREQW lpwhr; - LPWSTR lpszCookies; - LPWSTR lpszUrl = NULL; - DWORD nCookieSize; + LPWSTR lpszHostName = NULL; HINTERNET handle = NULL; - static const WCHAR szUrlForm[] = {'h','t','t','p',':','/','/','%','s',0}; + static const WCHAR szHostForm[] = {'%','s',':','%','u',0}; DWORD len; - LPHTTPHEADERW Host; TRACE("-->\n"); @@ -1917,6 +1918,14 @@ HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW lpwhs, lpwhr->lpHttpSession = lpwhs; list_add_head( &lpwhs->hdr.children, &lpwhr->hdr.entry ); + lpszHostName = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR) * + (strlenW(lpwhs->lpszHostName) + 7 /* length of ":65535" + 1 */)); + if (NULL == lpszHostName) + { + INTERNET_SetLastError(ERROR_OUTOFMEMORY); + goto lend; + } + handle = WININET_AllocHandle( &lpwhr->hdr ); if (NULL == handle) { @@ -1971,7 +1980,17 @@ HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW lpwhs, else lpwhr->lpszVersion = WININET_strdupW(g_szHttp1_1); - HTTP_ProcessHeader(lpwhr, szHost, lpwhs->lpszHostName, HTTP_ADDREQ_FLAG_ADD | HTTP_ADDHDR_FLAG_REQ); + if (lpwhs->nHostPort != INTERNET_INVALID_PORT_NUMBER && + lpwhs->nHostPort != INTERNET_DEFAULT_HTTP_PORT && + lpwhs->nHostPort != INTERNET_DEFAULT_HTTPS_PORT) + { + sprintfW(lpszHostName, szHostForm, lpwhs->lpszHostName, lpwhs->nHostPort); + HTTP_ProcessHeader(lpwhr, szHost, lpszHostName, + HTTP_ADDREQ_FLAG_ADD | HTTP_ADDHDR_FLAG_REQ); + } + else + HTTP_ProcessHeader(lpwhr, szHost, lpwhs->lpszHostName, + HTTP_ADDREQ_FLAG_ADD | HTTP_ADDHDR_FLAG_REQ); if (lpwhs->nServerPort == INTERNET_INVALID_PORT_NUMBER) lpwhs->nServerPort = (dwFlags & INTERNET_FLAG_SECURE ? @@ -1986,47 +2005,12 @@ HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW lpwhs, if (NULL != hIC->lpszProxy && hIC->lpszProxy[0] != 0) HTTP_DealWithProxy( hIC, lpwhs, lpwhr ); - Host = HTTP_GetHeader(lpwhr,szHost); - - len = lstrlenW(Host->lpszValue) + strlenW(szUrlForm); - lpszUrl = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR)); - sprintfW( lpszUrl, szUrlForm, Host->lpszValue ); - - if (!(lpwhr->hdr.dwFlags & INTERNET_FLAG_NO_COOKIES) && - InternetGetCookieW(lpszUrl, NULL, NULL, &nCookieSize)) - { - int cnt = 0; - static const WCHAR szCookie[] = {'C','o','o','k','i','e',':',' ',0}; - static const WCHAR szcrlf[] = {'\r','\n',0}; - - lpszCookies = HeapAlloc(GetProcessHeap(), 0, (nCookieSize + 1 + 8)*sizeof(WCHAR)); - - cnt += sprintfW(lpszCookies, szCookie); - InternetGetCookieW(lpszUrl, NULL, lpszCookies + cnt, &nCookieSize); - strcatW(lpszCookies, szcrlf); - - HTTP_HttpAddRequestHeadersW(lpwhr, lpszCookies, strlenW(lpszCookies), - HTTP_ADDREQ_FLAG_ADD); - HeapFree(GetProcessHeap(), 0, lpszCookies); - } - HeapFree(GetProcessHeap(), 0, lpszUrl); - - INTERNET_SendCallback(&lpwhs->hdr, dwContext, INTERNET_STATUS_HANDLE_CREATED, &handle, sizeof(handle)); - /* - * A STATUS_REQUEST_COMPLETE is NOT sent here as per my tests on windows - */ - - if (!HTTP_ResolveName(lpwhr)) - { - InternetCloseHandle( handle ); - handle = NULL; - } - lend: + HeapFree(GetProcessHeap(), 0, lpszHostName); if( lpwhr ) WININET_Release( &lpwhr->hdr ); @@ -3027,17 +3011,16 @@ static BOOL HTTP_HandleRedirect(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl) if (!using_proxy) { - HeapFree(GetProcessHeap(), 0, lpwhs->lpszServerName); - lpwhs->lpszServerName = WININET_strdupW(hostName); - lpwhs->nServerPort = urlComponents.nPort; - - if (!HTTP_ResolveName(lpwhr)) - return FALSE; - - NETCON_close(&lpwhr->netConnection); + if (strcmpiW(lpwhs->lpszServerName, hostName) || lpwhs->nServerPort != urlComponents.nPort) + { + HeapFree(GetProcessHeap(), 0, lpwhs->lpszServerName); + lpwhs->lpszServerName = WININET_strdupW(hostName); + lpwhs->nServerPort = urlComponents.nPort; - if (!NETCON_init(&lpwhr->netConnection,lpwhr->hdr.dwFlags & INTERNET_FLAG_SECURE)) - return FALSE; + NETCON_close(&lpwhr->netConnection); + if (!HTTP_ResolveName(lpwhr)) return FALSE; + if (!NETCON_init(&lpwhr->netConnection, lpwhr->hdr.dwFlags & INTERNET_FLAG_SECURE)) return FALSE; + } } else TRACE("Redirect through proxy\n"); @@ -3139,6 +3122,37 @@ static BOOL HTTP_SecureProxyConnect(LPWININETHTTPREQW lpwhr) return TRUE; } +static void HTTP_InsertCookies(LPWININETHTTPREQW lpwhr) +{ + static const WCHAR szUrlForm[] = {'h','t','t','p',':','/','/','%','s',0}; + LPWSTR lpszCookies, lpszUrl = NULL; + DWORD nCookieSize, size; + LPHTTPHEADERW Host = HTTP_GetHeader(lpwhr,szHost); + + size = (strlenW(Host->lpszValue) + strlenW(szUrlForm)) * sizeof(WCHAR); + if (!(lpszUrl = HeapAlloc(GetProcessHeap(), 0, size))) return; + sprintfW( lpszUrl, szUrlForm, Host->lpszValue ); + + if (InternetGetCookieW(lpszUrl, NULL, NULL, &nCookieSize)) + { + int cnt = 0; + static const WCHAR szCookie[] = {'C','o','o','k','i','e',':',' ',0}; + static const WCHAR szcrlf[] = {'\r','\n',0}; + + size = sizeof(szCookie) + nCookieSize * sizeof(WCHAR) + sizeof(szcrlf); + if ((lpszCookies = HeapAlloc(GetProcessHeap(), 0, size))) + { + cnt += sprintfW(lpszCookies, szCookie); + InternetGetCookieW(lpszUrl, NULL, lpszCookies + cnt, &nCookieSize); + strcatW(lpszCookies, szcrlf); + + HTTP_HttpAddRequestHeadersW(lpwhr, lpszCookies, strlenW(lpszCookies), HTTP_ADDREQ_FLAG_ADD); + HeapFree(GetProcessHeap(), 0, lpszCookies); + } + } + HeapFree(GetProcessHeap(), 0, lpszUrl); +} + /*********************************************************************** * HTTP_HttpSendRequestW (internal) * @@ -3159,7 +3173,6 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders, INT responseLen; BOOL loop_next; INTERNET_ASYNC_RESULT iar; - static const WCHAR szClose[] = { 'C','l','o','s','e',0 }; static const WCHAR szPost[] = { 'P','O','S','T',0 }; static const WCHAR szContentLength[] = { 'C','o','n','t','e','n','t','-','L','e','n','g','t','h',':',' ','%','l','i','\r','\n',0 }; @@ -3169,9 +3182,6 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders, assert(lpwhr->hdr.htype == WH_HHTTPREQ); - /* Clear any error information */ - INTERNET_SetLastError(0); - /* if the verb is NULL default to GET */ if (!lpwhr->lpszVerb) lpwhr->lpszVerb = WININET_strdupW(szGET); @@ -3194,6 +3204,17 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders, HTTP_HttpAddRequestHeadersW(lpwhr, agent_header, strlenW(agent_header), HTTP_ADDREQ_FLAG_ADD_IF_NEW); HeapFree(GetProcessHeap(), 0, agent_header); } + if (lpwhr->hdr.dwFlags & INTERNET_FLAG_PRAGMA_NOCACHE) + { + static const WCHAR pragma_nocache[] = {'P','r','a','g','m','a',':',' ','n','o','-','c','a','c','h','e','\r','\n',0}; + HTTP_HttpAddRequestHeadersW(lpwhr, pragma_nocache, strlenW(pragma_nocache), HTTP_ADDREQ_FLAG_ADD_IF_NEW); + } + if ((lpwhr->hdr.dwFlags & INTERNET_FLAG_NO_CACHE_WRITE) && !strcmpW(lpwhr->lpszVerb, szPost)) + { + static const WCHAR cache_control[] = {'C','a','c','h','e','-','C','o','n','t','r','o','l',':', + ' ','n','o','-','c','a','c','h','e','\r','\n',0}; + HTTP_HttpAddRequestHeadersW(lpwhr, cache_control, strlenW(cache_control), HTTP_ADDREQ_FLAG_ADD_IF_NEW); + } do { @@ -3214,13 +3235,16 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders, } HTTP_FixURL(lpwhr); - HTTP_ProcessHeader(lpwhr, szConnection, - lpwhr->hdr.dwFlags & INTERNET_FLAG_KEEP_CONNECTION ? szKeepAlive : szClose, - HTTP_ADDHDR_FLAG_REQ | HTTP_ADDHDR_FLAG_REPLACE); - + if (lpwhr->hdr.dwFlags & INTERNET_FLAG_KEEP_CONNECTION) + { + HTTP_ProcessHeader(lpwhr, szConnection, szKeepAlive, HTTP_ADDHDR_FLAG_REQ | HTTP_ADDHDR_FLAG_REPLACE); + } HTTP_InsertAuthorization(lpwhr, lpwhr->pAuthInfo, szAuthorization); HTTP_InsertAuthorization(lpwhr, lpwhr->pProxyAuthInfo, szProxy_Authorization); + if (!(lpwhr->hdr.dwFlags & INTERNET_FLAG_NO_COOKIES)) + HTTP_InsertCookies(lpwhr); + /* add the headers the caller supplied */ if( lpszHeaders && dwHeaderLength ) { @@ -3413,6 +3437,7 @@ lend: sizeof(INTERNET_ASYNC_RESULT)); TRACE("<--\n"); + if (bSuccess) INTERNET_SetLastError(ERROR_SUCCESS); return bSuccess; } @@ -3451,8 +3476,7 @@ static DWORD HTTPSESSION_QueryOption(WININETHANDLEHEADER *hdr, DWORD option, voi return ERROR_SUCCESS; } - FIXME("Not implemented option %d\n", option); - return ERROR_INTERNET_INVALID_OPTION; + return INET_QueryOption(option, buffer, size, unicode); } static const HANDLEHEADERVtbl HTTPSESSIONVtbl = { @@ -3598,6 +3622,7 @@ static BOOL HTTP_OpenConnection(LPWININETHTTPREQW lpwhr) bSuccess = TRUE; goto lend; } + if (!HTTP_ResolveName(lpwhr)) goto lend; lpwhs = lpwhr->lpHttpSession; @@ -3612,7 +3637,7 @@ static BOOL HTTP_OpenConnection(LPWININETHTTPREQW lpwhr) if (!NETCON_create(&lpwhr->netConnection, lpwhs->socketAddress.sin_family, SOCK_STREAM, 0)) { - WARN("Socket creation failed\n"); + WARN("Socket creation failed: %u\n", INTERNET_GetLastError()); goto lend; } @@ -3813,7 +3838,10 @@ lend: if (bSuccess) return rc; else + { + HeapFree(GetProcessHeap(), 0, lpszRawHeaders); return 0; + } } @@ -4026,7 +4054,9 @@ static BOOL HTTP_ProcessHeader(LPWININETHTTPREQW lpwhr, LPCWSTR field, LPCWSTR v BOOL HTTP_FinishedReading(LPWININETHTTPREQW lpwhr) { WCHAR szVersion[10]; + WCHAR szConnectionResponse[20]; DWORD dwBufferSize = sizeof(szVersion); + BOOL keepalive = FALSE; TRACE("\n"); @@ -4036,15 +4066,19 @@ BOOL HTTP_FinishedReading(LPWININETHTTPREQW lpwhr) &dwBufferSize, NULL) || strcmpiW(szVersion, g_szHttp1_1)) { - WCHAR szConnectionResponse[20]; - dwBufferSize = sizeof(szConnectionResponse); - if ((!HTTP_HttpQueryInfoW(lpwhr, HTTP_QUERY_CONNECTION, szConnectionResponse, &dwBufferSize, NULL) || - strcmpiW(szConnectionResponse, szKeepAlive)) && - (!HTTP_HttpQueryInfoW(lpwhr, HTTP_QUERY_PROXY_CONNECTION, szConnectionResponse, &dwBufferSize, NULL) || - strcmpiW(szConnectionResponse, szKeepAlive))) - { - HTTPREQ_CloseConnection(&lpwhr->hdr); - } + keepalive = TRUE; + } + + dwBufferSize = sizeof(szConnectionResponse); + if (HTTP_HttpQueryInfoW(lpwhr, HTTP_QUERY_PROXY_CONNECTION, szConnectionResponse, &dwBufferSize, NULL) || + HTTP_HttpQueryInfoW(lpwhr, HTTP_QUERY_CONNECTION, szConnectionResponse, &dwBufferSize, NULL)) + { + keepalive = !strcmpiW(szConnectionResponse, szKeepAlive); + } + + if (!keepalive) + { + HTTPREQ_CloseConnection(&lpwhr->hdr); } /* FIXME: store data in the URL cache here */ @@ -4142,6 +4176,9 @@ static BOOL HTTP_DeleteCustomHeader(LPWININETHTTPREQW lpwhr, DWORD index) return FALSE; lpwhr->nCustHeaders--; + HeapFree(GetProcessHeap(), 0, lpwhr->pCustHeaders[index].lpszField); + HeapFree(GetProcessHeap(), 0, lpwhr->pCustHeaders[index].lpszValue); + memmove( &lpwhr->pCustHeaders[index], &lpwhr->pCustHeaders[index+1], (lpwhr->nCustHeaders - index)* sizeof(HTTPHEADERW) ); memset( &lpwhr->pCustHeaders[lpwhr->nCustHeaders], 0, sizeof(HTTPHEADERW) ); diff --git a/reactos/dll/win32/wininet/inet_ntop.c b/reactos/dll/win32/wininet/inet_ntop.c index b13bdcce0c3..f29d46d1625 100644 --- a/reactos/dll/win32/wininet/inet_ntop.c +++ b/reactos/dll/win32/wininet/inet_ntop.c @@ -39,7 +39,10 @@ */ static const char *inet_ntop4(const u_char *src, char *dst, size_t size); + +#ifdef INET6 static const char *inet_ntop6(const u_char *src, char *dst, size_t size); +#endif /* char * * inet_ntop(af, src, dst, size) diff --git a/reactos/dll/win32/wininet/internet.c b/reactos/dll/win32/wininet/internet.c index 2301d9c8628..bad795ddbd4 100644 --- a/reactos/dll/win32/wininet/internet.c +++ b/reactos/dll/win32/wininet/internet.c @@ -181,9 +181,13 @@ BOOL WININET_Release( LPWININETHANDLEHEADER info ) TRACE( "closing connection %p\n", info); info->vtbl->CloseConnection( info ); } - INTERNET_SendCallback(info, info->dwContext, - INTERNET_STATUS_HANDLE_CLOSING, &info->hInternet, - sizeof(HINTERNET)); + /* Don't send a callback if this is a session handle created with InternetOpenUrl */ + if (info->htype != WH_HHTTPSESSION || !(info->dwInternalFlags & INET_OPENURL)) + { + INTERNET_SendCallback(info, info->dwContext, + INTERNET_STATUS_HANDLE_CLOSING, &info->hInternet, + sizeof(HINTERNET)); + } TRACE( "destroying object %p\n", info); if ( info->htype != WH_HINIT ) list_remove( &info->entry ); @@ -491,6 +495,8 @@ static VOID APPINFO_Destroy(WININETHANDLEHEADER *hdr) static DWORD APPINFO_QueryOption(WININETHANDLEHEADER *hdr, DWORD option, void *buffer, DWORD *size, BOOL unicode) { + LPWININETAPPINFOW ai = (LPWININETAPPINFOW)hdr; + switch(option) { case INTERNET_OPTION_HANDLE_TYPE: TRACE("INTERNET_OPTION_HANDLE_TYPE\n"); @@ -501,10 +507,98 @@ static DWORD APPINFO_QueryOption(WININETHANDLEHEADER *hdr, DWORD option, void *b *size = sizeof(DWORD); *(DWORD*)buffer = INTERNET_HANDLE_TYPE_INTERNET; return ERROR_SUCCESS; + + case INTERNET_OPTION_USER_AGENT: { + DWORD bufsize; + + TRACE("INTERNET_OPTION_USER_AGENT\n"); + + bufsize = *size; + + if (unicode) { + *size = (strlenW(ai->lpszAgent) + 1) * sizeof(WCHAR); + if(!buffer || bufsize < *size) + return ERROR_INSUFFICIENT_BUFFER; + + strcpyW(buffer, ai->lpszAgent); + }else { + *size = WideCharToMultiByte(CP_ACP, 0, ai->lpszAgent, -1, NULL, 0, NULL, NULL); + if(!buffer || bufsize < *size) + return ERROR_INSUFFICIENT_BUFFER; + + WideCharToMultiByte(CP_ACP, 0, ai->lpszAgent, -1, buffer, *size, NULL, NULL); + } + + return ERROR_SUCCESS; + } + + case INTERNET_OPTION_PROXY: + if (unicode) { + INTERNET_PROXY_INFOW *pi = (INTERNET_PROXY_INFOW *)buffer; + DWORD proxyBytesRequired = 0, proxyBypassBytesRequired = 0; + LPWSTR proxy, proxy_bypass; + + if (ai->lpszProxy) + proxyBytesRequired = (lstrlenW(ai->lpszProxy) + 1) * sizeof(WCHAR); + if (ai->lpszProxyBypass) + proxyBypassBytesRequired = (lstrlenW(ai->lpszProxyBypass) + 1) * sizeof(WCHAR); + if (*size < sizeof(INTERNET_PROXY_INFOW) + proxyBytesRequired + proxyBypassBytesRequired) + return ERROR_INSUFFICIENT_BUFFER; + + proxy = (LPWSTR)((LPBYTE)buffer + sizeof(INTERNET_PROXY_INFOW)); + proxy_bypass = (LPWSTR)((LPBYTE)buffer + sizeof(INTERNET_PROXY_INFOW) + proxyBytesRequired); + + pi->dwAccessType = ai->dwAccessType; + pi->lpszProxy = NULL; + pi->lpszProxyBypass = NULL; + if (ai->lpszProxy) { + lstrcpyW(proxy, ai->lpszProxy); + pi->lpszProxy = proxy; + } + + if (ai->lpszProxyBypass) { + lstrcpyW(proxy_bypass, ai->lpszProxyBypass); + pi->lpszProxyBypass = proxy_bypass; + } + + *size = sizeof(INTERNET_PROXY_INFOW) + proxyBytesRequired + proxyBypassBytesRequired; + return ERROR_SUCCESS; + }else { + INTERNET_PROXY_INFOA *pi = (INTERNET_PROXY_INFOA *)buffer; + DWORD proxyBytesRequired = 0, proxyBypassBytesRequired = 0; + LPSTR proxy, proxy_bypass; + + if (ai->lpszProxy) + proxyBytesRequired = WideCharToMultiByte(CP_ACP, 0, ai->lpszProxy, -1, NULL, 0, NULL, NULL); + if (ai->lpszProxyBypass) + proxyBypassBytesRequired = WideCharToMultiByte(CP_ACP, 0, ai->lpszProxyBypass, -1, + NULL, 0, NULL, NULL); + if (*size < sizeof(INTERNET_PROXY_INFOA) + proxyBytesRequired + proxyBypassBytesRequired) + return ERROR_INSUFFICIENT_BUFFER; + + proxy = (LPSTR)((LPBYTE)buffer + sizeof(INTERNET_PROXY_INFOA)); + proxy_bypass = (LPSTR)((LPBYTE)buffer + sizeof(INTERNET_PROXY_INFOA) + proxyBytesRequired); + + pi->dwAccessType = ai->dwAccessType; + pi->lpszProxy = NULL; + pi->lpszProxyBypass = NULL; + if (ai->lpszProxy) { + WideCharToMultiByte(CP_ACP, 0, ai->lpszProxy, -1, proxy, proxyBytesRequired, NULL, NULL); + pi->lpszProxy = proxy; + } + + if (ai->lpszProxyBypass) { + WideCharToMultiByte(CP_ACP, 0, ai->lpszProxyBypass, -1, proxy_bypass, + proxyBypassBytesRequired, NULL, NULL); + pi->lpszProxyBypass = proxy_bypass; + } + + *size = sizeof(INTERNET_PROXY_INFOA) + proxyBytesRequired + proxyBypassBytesRequired; + return ERROR_SUCCESS; + } } - FIXME("Not implemented option %d\n", option); - return ERROR_INTERNET_INVALID_OPTION; + return INET_QueryOption(option, buffer, size, unicode); } static const HANDLEHEADERVtbl APPINFOVtbl = { @@ -1046,14 +1140,14 @@ BOOL WINAPI InternetCloseHandle(HINTERNET hInternet) /*********************************************************************** * ConvertUrlComponentValue (Internal) * - * Helper function for InternetCrackUrlW + * Helper function for InternetCrackUrlA * */ static void ConvertUrlComponentValue(LPSTR* lppszComponent, LPDWORD dwComponentLen, LPWSTR lpwszComponent, DWORD dwwComponentLen, LPCSTR lpszStart, LPCWSTR lpwszStart) { - TRACE("%p %d %p %d %p %p\n", lppszComponent, *dwComponentLen, lpwszComponent, dwwComponentLen, lpszStart, lpwszStart); + TRACE("%p %d %p %d %p %p\n", *lppszComponent, *dwComponentLen, lpwszComponent, dwwComponentLen, lpszStart, lpwszStart); if (*dwComponentLen != 0) { DWORD nASCIILength=WideCharToMultiByte(CP_ACP,0,lpwszComponent,dwwComponentLen,NULL,0,NULL,NULL); @@ -1087,9 +1181,13 @@ BOOL WINAPI InternetCrackUrlA(LPCSTR lpszUrl, DWORD dwUrlLength, DWORD dwFlags, { DWORD nLength; URL_COMPONENTSW UCW; - WCHAR* lpwszUrl; + BOOL ret = FALSE; + WCHAR *lpwszUrl, *hostname = NULL, *username = NULL, *password = NULL, *path = NULL, + *scheme = NULL, *extra = NULL; - TRACE("(%s %u %x %p)\n", debugstr_a(lpszUrl), dwUrlLength, dwFlags, lpUrlComponents); + TRACE("(%s %u %x %p)\n", + lpszUrl ? debugstr_an(lpszUrl, dwUrlLength ? dwUrlLength : strlen(lpszUrl)) : "(null)", + dwUrlLength, dwFlags, lpUrlComponents); if (!lpszUrl || !*lpszUrl || !lpUrlComponents || lpUrlComponents->dwStructSize != sizeof(URL_COMPONENTSA)) @@ -1111,53 +1209,92 @@ BOOL WINAPI InternetCrackUrlA(LPCSTR lpszUrl, DWORD dwUrlLength, DWORD dwFlags, memset(&UCW,0,sizeof(UCW)); UCW.dwStructSize = sizeof(URL_COMPONENTSW); - if(lpUrlComponents->dwHostNameLength!=0) - UCW.dwHostNameLength= lpUrlComponents->dwHostNameLength; - if(lpUrlComponents->dwUserNameLength!=0) - UCW.dwUserNameLength=lpUrlComponents->dwUserNameLength; - if(lpUrlComponents->dwPasswordLength!=0) - UCW.dwPasswordLength=lpUrlComponents->dwPasswordLength; - if(lpUrlComponents->dwUrlPathLength!=0) - UCW.dwUrlPathLength=lpUrlComponents->dwUrlPathLength; - if(lpUrlComponents->dwSchemeLength!=0) - UCW.dwSchemeLength=lpUrlComponents->dwSchemeLength; - if(lpUrlComponents->dwExtraInfoLength!=0) - UCW.dwExtraInfoLength=lpUrlComponents->dwExtraInfoLength; - if(!InternetCrackUrlW(lpwszUrl,nLength,dwFlags,&UCW)) + if (lpUrlComponents->dwHostNameLength) { - HeapFree(GetProcessHeap(), 0, lpwszUrl); - return FALSE; + UCW.dwHostNameLength = lpUrlComponents->dwHostNameLength; + if (lpUrlComponents->lpszHostName) + { + hostname = HeapAlloc(GetProcessHeap(), 0, UCW.dwHostNameLength * sizeof(WCHAR)); + UCW.lpszHostName = hostname; + } + } + if (lpUrlComponents->dwUserNameLength) + { + UCW.dwUserNameLength = lpUrlComponents->dwUserNameLength; + if (lpUrlComponents->lpszUserName) + { + username = HeapAlloc(GetProcessHeap(), 0, UCW.dwUserNameLength * sizeof(WCHAR)); + UCW.lpszUserName = username; + } + } + if (lpUrlComponents->dwPasswordLength) + { + UCW.dwPasswordLength = lpUrlComponents->dwPasswordLength; + if (lpUrlComponents->lpszPassword) + { + password = HeapAlloc(GetProcessHeap(), 0, UCW.dwPasswordLength * sizeof(WCHAR)); + UCW.lpszPassword = password; + } + } + if (lpUrlComponents->dwUrlPathLength) + { + UCW.dwUrlPathLength = lpUrlComponents->dwUrlPathLength; + if (lpUrlComponents->lpszUrlPath) + { + path = HeapAlloc(GetProcessHeap(), 0, UCW.dwUrlPathLength * sizeof(WCHAR)); + UCW.lpszUrlPath = path; + } + } + if (lpUrlComponents->dwSchemeLength) + { + UCW.dwSchemeLength = lpUrlComponents->dwSchemeLength; + if (lpUrlComponents->lpszScheme) + { + scheme = HeapAlloc(GetProcessHeap(), 0, UCW.dwSchemeLength * sizeof(WCHAR)); + UCW.lpszScheme = scheme; + } + } + if (lpUrlComponents->dwExtraInfoLength) + { + UCW.dwExtraInfoLength = lpUrlComponents->dwExtraInfoLength; + if (lpUrlComponents->lpszExtraInfo) + { + extra = HeapAlloc(GetProcessHeap(), 0, UCW.dwExtraInfoLength * sizeof(WCHAR)); + UCW.lpszExtraInfo = extra; + } + } + if ((ret = InternetCrackUrlW(lpwszUrl, nLength, dwFlags, &UCW))) + { + ConvertUrlComponentValue(&lpUrlComponents->lpszHostName, &lpUrlComponents->dwHostNameLength, + UCW.lpszHostName, UCW.dwHostNameLength, lpszUrl, lpwszUrl); + ConvertUrlComponentValue(&lpUrlComponents->lpszUserName, &lpUrlComponents->dwUserNameLength, + UCW.lpszUserName, UCW.dwUserNameLength, lpszUrl, lpwszUrl); + ConvertUrlComponentValue(&lpUrlComponents->lpszPassword, &lpUrlComponents->dwPasswordLength, + UCW.lpszPassword, UCW.dwPasswordLength, lpszUrl, lpwszUrl); + ConvertUrlComponentValue(&lpUrlComponents->lpszUrlPath, &lpUrlComponents->dwUrlPathLength, + UCW.lpszUrlPath, UCW.dwUrlPathLength, lpszUrl, lpwszUrl); + ConvertUrlComponentValue(&lpUrlComponents->lpszScheme, &lpUrlComponents->dwSchemeLength, + UCW.lpszScheme, UCW.dwSchemeLength, lpszUrl, lpwszUrl); + ConvertUrlComponentValue(&lpUrlComponents->lpszExtraInfo, &lpUrlComponents->dwExtraInfoLength, + UCW.lpszExtraInfo, UCW.dwExtraInfoLength, lpszUrl, lpwszUrl); + + lpUrlComponents->nScheme = UCW.nScheme; + lpUrlComponents->nPort = UCW.nPort; + + TRACE("%s: scheme(%s) host(%s) path(%s) extra(%s)\n", lpszUrl, + debugstr_an(lpUrlComponents->lpszScheme, lpUrlComponents->dwSchemeLength), + debugstr_an(lpUrlComponents->lpszHostName, lpUrlComponents->dwHostNameLength), + debugstr_an(lpUrlComponents->lpszUrlPath, lpUrlComponents->dwUrlPathLength), + debugstr_an(lpUrlComponents->lpszExtraInfo, lpUrlComponents->dwExtraInfoLength)); } - - ConvertUrlComponentValue(&lpUrlComponents->lpszHostName, &lpUrlComponents->dwHostNameLength, - UCW.lpszHostName, UCW.dwHostNameLength, - lpszUrl, lpwszUrl); - ConvertUrlComponentValue(&lpUrlComponents->lpszUserName, &lpUrlComponents->dwUserNameLength, - UCW.lpszUserName, UCW.dwUserNameLength, - lpszUrl, lpwszUrl); - ConvertUrlComponentValue(&lpUrlComponents->lpszPassword, &lpUrlComponents->dwPasswordLength, - UCW.lpszPassword, UCW.dwPasswordLength, - lpszUrl, lpwszUrl); - ConvertUrlComponentValue(&lpUrlComponents->lpszUrlPath, &lpUrlComponents->dwUrlPathLength, - UCW.lpszUrlPath, UCW.dwUrlPathLength, - lpszUrl, lpwszUrl); - ConvertUrlComponentValue(&lpUrlComponents->lpszScheme, &lpUrlComponents->dwSchemeLength, - UCW.lpszScheme, UCW.dwSchemeLength, - lpszUrl, lpwszUrl); - ConvertUrlComponentValue(&lpUrlComponents->lpszExtraInfo, &lpUrlComponents->dwExtraInfoLength, - UCW.lpszExtraInfo, UCW.dwExtraInfoLength, - lpszUrl, lpwszUrl); - lpUrlComponents->nScheme=UCW.nScheme; - lpUrlComponents->nPort=UCW.nPort; HeapFree(GetProcessHeap(), 0, lpwszUrl); - - TRACE("%s: scheme(%s) host(%s) path(%s) extra(%s)\n", lpszUrl, - debugstr_an(lpUrlComponents->lpszScheme,lpUrlComponents->dwSchemeLength), - debugstr_an(lpUrlComponents->lpszHostName,lpUrlComponents->dwHostNameLength), - debugstr_an(lpUrlComponents->lpszUrlPath,lpUrlComponents->dwUrlPathLength), - debugstr_an(lpUrlComponents->lpszExtraInfo,lpUrlComponents->dwExtraInfoLength)); - - return TRUE; + HeapFree(GetProcessHeap(), 0, hostname); + HeapFree(GetProcessHeap(), 0, username); + HeapFree(GetProcessHeap(), 0, password); + HeapFree(GetProcessHeap(), 0, path); + HeapFree(GetProcessHeap(), 0, scheme); + HeapFree(GetProcessHeap(), 0, extra); + return ret; } static const WCHAR url_schemes[][7] = @@ -1264,10 +1401,10 @@ BOOL WINAPI InternetCrackUrlW(LPCWSTR lpszUrl_orig, DWORD dwUrlLength_orig, DWOR LPCWSTR lpszcp = NULL; LPWSTR lpszUrl_decode = NULL; DWORD dwUrlLength = dwUrlLength_orig; - const WCHAR lpszSeparators[3]={';','?',0}; - const WCHAR lpszSlash[2]={'/',0}; - TRACE("(%s %u %x %p)\n", debugstr_w(lpszUrl), dwUrlLength, dwFlags, lpUC); + TRACE("(%s %u %x %p)\n", + lpszUrl ? debugstr_wn(lpszUrl, dwUrlLength ? dwUrlLength : strlenW(lpszUrl)) : "(null)", + dwUrlLength, dwFlags, lpUC); if (!lpszUrl_orig || !*lpszUrl_orig || !lpUC) { @@ -1278,16 +1415,33 @@ BOOL WINAPI InternetCrackUrlW(LPCWSTR lpszUrl_orig, DWORD dwUrlLength_orig, DWOR if (dwFlags & ICU_DECODE) { - lpszUrl_decode=HeapAlloc( GetProcessHeap(), 0, dwUrlLength * sizeof (WCHAR) ); - if( InternetCanonicalizeUrlW(lpszUrl_orig, lpszUrl_decode, &dwUrlLength, dwFlags)) - { - lpszUrl = lpszUrl_decode; - } + WCHAR *url_tmp; + DWORD len = dwUrlLength + 1; + + if (!(url_tmp = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)))) + { + INTERNET_SetLastError(ERROR_OUTOFMEMORY); + return FALSE; + } + memcpy(url_tmp, lpszUrl_orig, dwUrlLength * sizeof(WCHAR)); + url_tmp[dwUrlLength] = 0; + if (!(lpszUrl_decode = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)))) + { + HeapFree(GetProcessHeap(), 0, url_tmp); + INTERNET_SetLastError(ERROR_OUTOFMEMORY); + return FALSE; + } + if (InternetCanonicalizeUrlW(url_tmp, lpszUrl_decode, &len, ICU_DECODE | ICU_NO_ENCODE)) + { + dwUrlLength = len; + lpszUrl = lpszUrl_decode; + } + HeapFree(GetProcessHeap(), 0, url_tmp); } lpszap = lpszUrl; /* Determine if the URI is absolute. */ - while (*lpszap != '\0') + while (lpszap - lpszUrl < dwUrlLength) { if (isalnumW(*lpszap)) { @@ -1311,7 +1465,9 @@ BOOL WINAPI InternetCrackUrlW(LPCWSTR lpszUrl_orig, DWORD dwUrlLength_orig, DWOR lpUC->nPort = INTERNET_INVALID_PORT_NUMBER; /* Parse */ - lpszParam = strpbrkW(lpszap, lpszSeparators); + if (!(lpszParam = memchrW(lpszap, ';', dwUrlLength - (lpszap - lpszUrl)))) + lpszParam = memchrW(lpszap, '?', dwUrlLength - (lpszap - lpszUrl)); + SetUrlComponentValueW(&lpUC->lpszExtraInfo, &lpUC->dwExtraInfoLength, lpszParam, lpszParam ? dwUrlLength-(lpszParam-lpszUrl) : 0); @@ -1332,7 +1488,7 @@ BOOL WINAPI InternetCrackUrlW(LPCWSTR lpszUrl_orig, DWORD dwUrlLength_orig, DWOR { lpszcp += 2; - lpszNetLoc = strpbrkW(lpszcp, lpszSlash); + lpszNetLoc = memchrW(lpszcp, '/', dwUrlLength - (lpszcp - lpszUrl)); if (lpszParam) { if (lpszNetLoc) @@ -1352,7 +1508,7 @@ BOOL WINAPI InternetCrackUrlW(LPCWSTR lpszUrl_orig, DWORD dwUrlLength_orig, DWOR /* [[<:password>]@][:] */ /* First find the user and password if they exist */ - lpszHost = strchrW(lpszcp, '@'); + lpszHost = memchrW(lpszcp, '@', dwUrlLength - (lpszcp - lpszUrl)); if (lpszHost == NULL || lpszHost > lpszNetLoc) { /* username and password not specified. */ @@ -1461,7 +1617,7 @@ BOOL WINAPI InternetCrackUrlW(LPCWSTR lpszUrl_orig, DWORD dwUrlLength_orig, DWOR * :[//][/path][;][?][#] * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ - if (lpszcp != 0 && *lpszcp != '\0' && (!lpszParam || lpszcp < lpszParam)) + if (lpszcp != 0 && lpszcp - lpszUrl < dwUrlLength && (!lpszParam || lpszcp < lpszParam)) { INT len; @@ -1475,7 +1631,7 @@ BOOL WINAPI InternetCrackUrlW(LPCWSTR lpszUrl_orig, DWORD dwUrlLength_orig, DWOR /* Leave the parameter list in lpszUrlPath. Strip off any trailing * newlines if necessary. */ - LPWSTR lpsznewline = strchrW(lpszcp, '\n'); + LPWSTR lpsznewline = memchrW(lpszcp, '\n', dwUrlLength - (lpszcp - lpszUrl)); if (lpsznewline != NULL) len = lpsznewline - lpszcp; else @@ -1486,6 +1642,8 @@ BOOL WINAPI InternetCrackUrlW(LPCWSTR lpszUrl_orig, DWORD dwUrlLength_orig, DWOR } else { + if (lpUC->lpszUrlPath && (lpUC->dwUrlPathLength > 0)) + lpUC->lpszUrlPath[0] = 0; lpUC->dwUrlPathLength = 0; } @@ -1586,7 +1744,7 @@ BOOL WINAPI InternetCanonicalizeUrlW(LPCWSTR lpszUrl, LPWSTR lpszBuffer, DWORD dwURLFlags = URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE; TRACE("(%s, %p, %p, 0x%08x) bufferlength: %d\n", debugstr_w(lpszUrl), lpszBuffer, - lpdwBufferLength, lpdwBufferLength ? *lpdwBufferLength : -1, dwFlags); + lpdwBufferLength, dwFlags, lpdwBufferLength ? *lpdwBufferLength : -1); if(dwFlags & ICU_DECODE) { @@ -1861,315 +2019,137 @@ BOOL WINAPI InternetReadFileExW(HINTERNET hFile, LPINTERNET_BUFFERSW lpBuffer, return FALSE; } -/*********************************************************************** - * INET_QueryOptionHelper (internal) - */ -static BOOL INET_QueryOptionHelper(BOOL bIsUnicode, HINTERNET hInternet, DWORD dwOption, - LPVOID lpBuffer, LPDWORD lpdwBufferLength) +DWORD INET_QueryOption(DWORD option, void *buffer, DWORD *size, BOOL unicode) { - LPWININETHANDLEHEADER lpwhh; - BOOL bSuccess = FALSE; + switch(option) { + case INTERNET_OPTION_REQUEST_FLAGS: + TRACE("INTERNET_OPTION_REQUEST_FLAGS\n"); - TRACE("(%p, 0x%08x, %p, %p)\n", hInternet, dwOption, lpBuffer, lpdwBufferLength); + if (*size < sizeof(ULONG)) + return ERROR_INSUFFICIENT_BUFFER; - lpwhh = WININET_GetObject( hInternet ); + *(ULONG*)buffer = 4; + *size = sizeof(ULONG); - switch (dwOption) - { - case INTERNET_OPTION_REQUEST_FLAGS: - { - ULONG flags = 4; - TRACE("INTERNET_OPTION_REQUEST_FLAGS: %d\n", flags); - if (*lpdwBufferLength < sizeof(ULONG)) - INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER); - else - { - memcpy(lpBuffer, &flags, sizeof(ULONG)); - bSuccess = TRUE; - } - *lpdwBufferLength = sizeof(ULONG); - break; - } + return ERROR_SUCCESS; - case INTERNET_OPTION_USER_AGENT: - { - DWORD required; - LPWININETAPPINFOW ai = (LPWININETAPPINFOW)lpwhh; + case INTERNET_OPTION_HTTP_VERSION: + if (*size < sizeof(HTTP_VERSION_INFO)) + return ERROR_INSUFFICIENT_BUFFER; - TRACE("INTERNET_OPTION_USER_AGENT\n"); + /* + * Presently hardcoded to 1.1 + */ + ((HTTP_VERSION_INFO*)buffer)->dwMajorVersion = 1; + ((HTTP_VERSION_INFO*)buffer)->dwMinorVersion = 1; + *size = sizeof(HTTP_VERSION_INFO); - if (lpwhh->htype != INTERNET_HANDLE_TYPE_INTERNET) - { - INTERNET_SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE); - return FALSE; - } - if (bIsUnicode) - { - required = (strlenW(ai->lpszAgent) + 1) * sizeof(WCHAR); - if (*lpdwBufferLength < required) - INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER); - else if (lpBuffer) - { - strcpyW(lpBuffer, ai->lpszAgent); - bSuccess = TRUE; - } - } - else - { - required = WideCharToMultiByte(CP_ACP, 0, ai->lpszAgent, -1, NULL, 0, NULL, NULL); - if (*lpdwBufferLength < required) - INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER); - else if (lpBuffer) - { - WideCharToMultiByte(CP_ACP, 0, ai->lpszAgent, -1, lpBuffer, required, NULL, NULL); - bSuccess = TRUE; - } - } - *lpdwBufferLength = required; - break; - } - case INTERNET_OPTION_HTTP_VERSION: - { - if (*lpdwBufferLength < sizeof(HTTP_VERSION_INFO)) - INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER); - else - { - /* - * Presently hardcoded to 1.1 - */ - ((HTTP_VERSION_INFO*)lpBuffer)->dwMajorVersion = 1; - ((HTTP_VERSION_INFO*)lpBuffer)->dwMinorVersion = 1; - bSuccess = TRUE; - } - *lpdwBufferLength = sizeof(HTTP_VERSION_INFO); - break; - } - case INTERNET_OPTION_CONNECTED_STATE: - { - DWORD *pdwConnectedState = (DWORD *)lpBuffer; - FIXME("INTERNET_OPTION_CONNECTED_STATE: semi-stub\n"); + return ERROR_SUCCESS; - if (*lpdwBufferLength < sizeof(*pdwConnectedState)) - INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER); - else - { - *pdwConnectedState = INTERNET_STATE_CONNECTED; - bSuccess = TRUE; - } - *lpdwBufferLength = sizeof(*pdwConnectedState); - break; - } - case INTERNET_OPTION_PROXY: - { - LPWININETAPPINFOW lpwai = (LPWININETAPPINFOW)lpwhh; - WININETAPPINFOW wai; + case INTERNET_OPTION_CONNECTED_STATE: + FIXME("INTERNET_OPTION_CONNECTED_STATE: semi-stub\n"); - if (lpwai == NULL) - { - TRACE("Getting global proxy info\n"); - memset(&wai, 0, sizeof(WININETAPPINFOW)); - INTERNET_ConfigureProxy( &wai ); - lpwai = &wai; - } + if (*size < sizeof(ULONG)) + return ERROR_INSUFFICIENT_BUFFER; - if (bIsUnicode) - { - INTERNET_PROXY_INFOW *pPI = (INTERNET_PROXY_INFOW *)lpBuffer; - DWORD proxyBytesRequired = 0, proxyBypassBytesRequired = 0; - - if (lpwai->lpszProxy) - proxyBytesRequired = (lstrlenW(lpwai->lpszProxy) + 1) * - sizeof(WCHAR); - if (lpwai->lpszProxyBypass) - proxyBypassBytesRequired = - (lstrlenW(lpwai->lpszProxyBypass) + 1) * sizeof(WCHAR); - if (*lpdwBufferLength < sizeof(INTERNET_PROXY_INFOW) + - proxyBytesRequired + proxyBypassBytesRequired) - INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER); - else - { - LPWSTR proxy = (LPWSTR)((LPBYTE)lpBuffer + - sizeof(INTERNET_PROXY_INFOW)); - LPWSTR proxy_bypass = (LPWSTR)((LPBYTE)lpBuffer + - sizeof(INTERNET_PROXY_INFOW) + - proxyBytesRequired); - - pPI->dwAccessType = lpwai->dwAccessType; - pPI->lpszProxy = NULL; - pPI->lpszProxyBypass = NULL; - if (lpwai->lpszProxy) - { - lstrcpyW(proxy, lpwai->lpszProxy); - pPI->lpszProxy = proxy; - } + *(ULONG*)buffer = INTERNET_STATE_CONNECTED; + *size = sizeof(ULONG); - if (lpwai->lpszProxyBypass) - { - lstrcpyW(proxy_bypass, lpwai->lpszProxyBypass); - pPI->lpszProxyBypass = proxy_bypass; - } - bSuccess = TRUE; - } - *lpdwBufferLength = sizeof(INTERNET_PROXY_INFOW) + - proxyBytesRequired + proxyBypassBytesRequired; - } - else - { - INTERNET_PROXY_INFOA *pPI = (INTERNET_PROXY_INFOA *)lpBuffer; - DWORD proxyBytesRequired = 0, proxyBypassBytesRequired = 0; - - if (lpwai->lpszProxy) - proxyBytesRequired = WideCharToMultiByte(CP_ACP, 0, - lpwai->lpszProxy, -1, NULL, 0, NULL, NULL); - if (lpwai->lpszProxyBypass) - proxyBypassBytesRequired = WideCharToMultiByte(CP_ACP, 0, - lpwai->lpszProxyBypass, -1, NULL, 0, NULL, NULL); - if (*lpdwBufferLength < sizeof(INTERNET_PROXY_INFOA) + - proxyBytesRequired + proxyBypassBytesRequired) - INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER); - else - { - LPSTR proxy = (LPSTR)((LPBYTE)lpBuffer + - sizeof(INTERNET_PROXY_INFOA)); - LPSTR proxy_bypass = (LPSTR)((LPBYTE)lpBuffer + - sizeof(INTERNET_PROXY_INFOA) + - proxyBytesRequired); - - pPI->dwAccessType = lpwai->dwAccessType; - pPI->lpszProxy = NULL; - pPI->lpszProxyBypass = NULL; - if (lpwai->lpszProxy) - { - WideCharToMultiByte(CP_ACP, 0, lpwai->lpszProxy, -1, - proxy, proxyBytesRequired, NULL, NULL); - pPI->lpszProxy = proxy; - } + return ERROR_SUCCESS; - if (lpwai->lpszProxyBypass) - { - WideCharToMultiByte(CP_ACP, 0, lpwai->lpszProxyBypass, - -1, proxy_bypass, proxyBypassBytesRequired, - NULL, NULL); - pPI->lpszProxyBypass = proxy_bypass; - } - bSuccess = TRUE; - } - *lpdwBufferLength = sizeof(INTERNET_PROXY_INFOA) + - proxyBytesRequired + proxyBypassBytesRequired; - } - break; - } - case INTERNET_OPTION_MAX_CONNS_PER_SERVER: - { - ULONG conn = 2; - TRACE("INTERNET_OPTION_MAX_CONNS_PER_SERVER: %d\n", conn); - if (*lpdwBufferLength < sizeof(ULONG)) - INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER); - else - { - memcpy(lpBuffer, &conn, sizeof(ULONG)); - bSuccess = TRUE; - } - *lpdwBufferLength = sizeof(ULONG); - break; - } - case INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER: - { - ULONG conn = 4; - TRACE("INTERNET_OPTION_MAX_CONNS_1_0_SERVER: %d\n", conn); - if (*lpdwBufferLength < sizeof(ULONG)) - INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER); - else - { - memcpy(lpBuffer, &conn, sizeof(ULONG)); - bSuccess = TRUE; - } - *lpdwBufferLength = sizeof(ULONG); - break; - } - case INTERNET_OPTION_SECURITY_FLAGS: - FIXME("INTERNET_OPTION_SECURITY_FLAGS: Stub\n"); - bSuccess = TRUE; - break; + case INTERNET_OPTION_PROXY: { + WININETAPPINFOW ai; - case INTERNET_OPTION_VERSION: - { - TRACE("INTERNET_OPTION_VERSION\n"); - if (*lpdwBufferLength < sizeof(INTERNET_VERSION_INFO)) - INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER); - else - { - static const INTERNET_VERSION_INFO info = { 1, 2 }; - memcpy(lpBuffer, &info, sizeof(info)); - *lpdwBufferLength = sizeof(info); - bSuccess = TRUE; - } - break; - } - case INTERNET_OPTION_PER_CONNECTION_OPTION: - FIXME("INTERNET_OPTION_PER_CONNECTION_OPTION stub\n"); - if (*lpdwBufferLength < sizeof(INTERNET_PER_CONN_OPTION_LISTW)) - INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER); - else - { - INTERNET_PER_CONN_OPTION_LISTW *con = lpBuffer; - int x; - bSuccess = TRUE; - for (x = 0; x < con->dwOptionCount; ++x) - { - INTERNET_PER_CONN_OPTIONW *option = con->pOptions + x; - switch (option->dwOption) - { - case INTERNET_PER_CONN_FLAGS: - option->Value.dwValue = PROXY_TYPE_DIRECT; - break; - - case INTERNET_PER_CONN_PROXY_SERVER: - case INTERNET_PER_CONN_PROXY_BYPASS: - case INTERNET_PER_CONN_AUTOCONFIG_URL: - case INTERNET_PER_CONN_AUTODISCOVERY_FLAGS: - case INTERNET_PER_CONN_AUTOCONFIG_SECONDARY_URL: - case INTERNET_PER_CONN_AUTOCONFIG_RELOAD_DELAY_MINS: - case INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_TIME: - case INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_URL: - FIXME("Unhandled dwOption %d\n", option->dwOption); - option->Value.dwValue = 0; - bSuccess = FALSE; - break; - - default: - FIXME("Unknown dwOption %d\n", option->dwOption); - bSuccess = FALSE; - break; - } - } - if (!bSuccess) - INTERNET_SetLastError(ERROR_INVALID_PARAMETER); - } - break; - case 66: - FIXME("66\n"); - bSuccess = TRUE; - break; - default: { - if(lpwhh) { - DWORD res; + TRACE("Getting global proxy info\n"); + memset(&ai, 0, sizeof(WININETAPPINFOW)); + INTERNET_ConfigureProxy(&ai); - res = lpwhh->vtbl->QueryOption(lpwhh, dwOption, lpBuffer, lpdwBufferLength, bIsUnicode); - if(res == ERROR_SUCCESS) - bSuccess = TRUE; - else - SetLastError(res); - }else { - FIXME("Stub! %d\n", dwOption); + return APPINFO_QueryOption(&ai.hdr, INTERNET_OPTION_PROXY, buffer, size, unicode); /* FIXME */ + } + + case INTERNET_OPTION_MAX_CONNS_PER_SERVER: + TRACE("INTERNET_OPTION_MAX_CONNS_PER_SERVER\n"); + + if (*size < sizeof(ULONG)) + return ERROR_INSUFFICIENT_BUFFER; + + *(ULONG*)buffer = 2; + *size = sizeof(ULONG); + + return ERROR_SUCCESS; + + case INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER: + TRACE("INTERNET_OPTION_MAX_CONNS_1_0_SERVER\n"); + + if (*size < sizeof(ULONG)) + return ERROR_INSUFFICIENT_BUFFER; + + *(ULONG*)size = 4; + *size = sizeof(ULONG); + + return ERROR_SUCCESS; + + case INTERNET_OPTION_SECURITY_FLAGS: + FIXME("INTERNET_OPTION_SECURITY_FLAGS: Stub\n"); + return ERROR_SUCCESS; + + case INTERNET_OPTION_VERSION: { + static const INTERNET_VERSION_INFO info = { 1, 2 }; + + TRACE("INTERNET_OPTION_VERSION\n"); + + if (*size < sizeof(INTERNET_VERSION_INFO)) + return ERROR_INSUFFICIENT_BUFFER; + + memcpy(buffer, &info, sizeof(info)); + *size = sizeof(info); + + return ERROR_SUCCESS; + } + + case INTERNET_OPTION_PER_CONNECTION_OPTION: { + INTERNET_PER_CONN_OPTION_LISTW *con = buffer; + DWORD res = ERROR_SUCCESS, i; + + FIXME("INTERNET_OPTION_PER_CONNECTION_OPTION stub\n"); + + if (*size < sizeof(INTERNET_PER_CONN_OPTION_LISTW)) + return ERROR_INSUFFICIENT_BUFFER; + + for (i = 0; i < con->dwOptionCount; i++) { + INTERNET_PER_CONN_OPTIONW *option = con->pOptions + i; + + switch (option->dwOption) { + case INTERNET_PER_CONN_FLAGS: + option->Value.dwValue = PROXY_TYPE_DIRECT; + break; + + case INTERNET_PER_CONN_PROXY_SERVER: + case INTERNET_PER_CONN_PROXY_BYPASS: + case INTERNET_PER_CONN_AUTOCONFIG_URL: + case INTERNET_PER_CONN_AUTODISCOVERY_FLAGS: + case INTERNET_PER_CONN_AUTOCONFIG_SECONDARY_URL: + case INTERNET_PER_CONN_AUTOCONFIG_RELOAD_DELAY_MINS: + case INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_TIME: + case INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_URL: + FIXME("Unhandled dwOption %d\n", option->dwOption); + option->Value.dwValue = 0; + res = ERROR_INVALID_PARAMETER; + break; + + default: + FIXME("Unknown dwOption %d\n", option->dwOption); + res = ERROR_INVALID_PARAMETER; break; } } + + return res; + } } - if (lpwhh) - WININET_Release( lpwhh ); - return bSuccess; + FIXME("Stub for %d\n", option); + return ERROR_INTERNET_INCORRECT_HANDLE_TYPE; } /*********************************************************************** @@ -2185,7 +2165,24 @@ static BOOL INET_QueryOptionHelper(BOOL bIsUnicode, HINTERNET hInternet, DWORD d BOOL WINAPI InternetQueryOptionW(HINTERNET hInternet, DWORD dwOption, LPVOID lpBuffer, LPDWORD lpdwBufferLength) { - return INET_QueryOptionHelper(TRUE, hInternet, dwOption, lpBuffer, lpdwBufferLength); + LPWININETHANDLEHEADER hdr; + DWORD res = ERROR_INVALID_HANDLE; + + TRACE("%p %d %p %p\n", hInternet, dwOption, lpBuffer, lpdwBufferLength); + + if(hInternet) { + hdr = WININET_GetObject(hInternet); + if (hdr) { + res = hdr->vtbl->QueryOption(hdr, dwOption, lpBuffer, lpdwBufferLength, TRUE); + WININET_Release(hdr); + } + }else { + res = INET_QueryOption(dwOption, lpBuffer, lpdwBufferLength, TRUE); + } + + if(res != ERROR_SUCCESS) + SetLastError(res); + return res == ERROR_SUCCESS; } /*********************************************************************** @@ -2201,7 +2198,24 @@ BOOL WINAPI InternetQueryOptionW(HINTERNET hInternet, DWORD dwOption, BOOL WINAPI InternetQueryOptionA(HINTERNET hInternet, DWORD dwOption, LPVOID lpBuffer, LPDWORD lpdwBufferLength) { - return INET_QueryOptionHelper(FALSE, hInternet, dwOption, lpBuffer, lpdwBufferLength); + LPWININETHANDLEHEADER hdr; + DWORD res = ERROR_INVALID_HANDLE; + + TRACE("%p %d %p %p\n", hInternet, dwOption, lpBuffer, lpdwBufferLength); + + if(hInternet) { + hdr = WININET_GetObject(hInternet); + if (hdr) { + res = hdr->vtbl->QueryOption(hdr, dwOption, lpBuffer, lpdwBufferLength, FALSE); + WININET_Release(hdr); + } + }else { + res = INET_QueryOption(dwOption, lpBuffer, lpdwBufferLength, FALSE); + } + + if(res != ERROR_SUCCESS) + SetLastError(res); + return res == ERROR_SUCCESS; } @@ -2254,44 +2268,44 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption, break; case INTERNET_OPTION_ERROR_MASK: { - unsigned long flags=*(unsigned long*)lpBuffer; - FIXME("Option INTERNET_OPTION_ERROR_MASK(%ld): STUB\n",flags); + ULONG flags = *(ULONG *)lpBuffer; + FIXME("Option INTERNET_OPTION_ERROR_MASK(%d): STUB\n", flags); } break; case INTERNET_OPTION_CODEPAGE: { - unsigned long codepage=*(unsigned long*)lpBuffer; - FIXME("Option INTERNET_OPTION_CODEPAGE (%ld): STUB\n",codepage); + ULONG codepage = *(ULONG *)lpBuffer; + FIXME("Option INTERNET_OPTION_CODEPAGE (%d): STUB\n", codepage); } break; case INTERNET_OPTION_REQUEST_PRIORITY: { - unsigned long priority=*(unsigned long*)lpBuffer; - FIXME("Option INTERNET_OPTION_REQUEST_PRIORITY (%ld): STUB\n",priority); + ULONG priority = *(ULONG *)lpBuffer; + FIXME("Option INTERNET_OPTION_REQUEST_PRIORITY (%d): STUB\n", priority); } break; case INTERNET_OPTION_CONNECT_TIMEOUT: { - unsigned long connecttimeout=*(unsigned long*)lpBuffer; - FIXME("Option INTERNET_OPTION_CONNECT_TIMEOUT (%ld): STUB\n",connecttimeout); + ULONG connecttimeout = *(ULONG *)lpBuffer; + FIXME("Option INTERNET_OPTION_CONNECT_TIMEOUT (%d): STUB\n", connecttimeout); } break; case INTERNET_OPTION_DATA_RECEIVE_TIMEOUT: { - unsigned long receivetimeout=*(unsigned long*)lpBuffer; - FIXME("Option INTERNET_OPTION_DATA_RECEIVE_TIMEOUT (%ld): STUB\n",receivetimeout); + ULONG receivetimeout = *(ULONG *)lpBuffer; + FIXME("Option INTERNET_OPTION_DATA_RECEIVE_TIMEOUT (%d): STUB\n", receivetimeout); } break; case INTERNET_OPTION_MAX_CONNS_PER_SERVER: { - unsigned long conns=*(unsigned long*)lpBuffer; - FIXME("Option INTERNET_OPTION_MAX_CONNS_PER_SERVER (%ld): STUB\n",conns); + ULONG conns = *(ULONG *)lpBuffer; + FIXME("Option INTERNET_OPTION_MAX_CONNS_PER_SERVER (%d): STUB\n", conns); } break; case INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER: { - unsigned long conns=*(unsigned long*)lpBuffer; - FIXME("Option INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER (%ld): STUB\n",conns); + ULONG conns = *(ULONG *)lpBuffer; + FIXME("Option INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER (%d): STUB\n", conns); } break; case INTERNET_OPTION_RESET_URLCACHE_SESSION: @@ -2308,17 +2322,26 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption, break; case INTERNET_OPTION_SEND_TIMEOUT: case INTERNET_OPTION_RECEIVE_TIMEOUT: - FIXME("INTERNET_OPTION_SEND/RECEIVE_TIMEOUT\n"); + { + ULONG timeout = *(ULONG *)lpBuffer; + FIXME("INTERNET_OPTION_SEND/RECEIVE_TIMEOUT %d\n", timeout); break; + } case INTERNET_OPTION_CONNECT_RETRIES: - FIXME("Option INTERNET_OPTION_CONNECT_RETRIES: STUB\n"); + { + ULONG retries = *(ULONG *)lpBuffer; + FIXME("INTERNET_OPTION_CONNECT_RETRIES %d\n", retries); break; + } case INTERNET_OPTION_CONTEXT_VALUE: FIXME("Option INTERNET_OPTION_CONTEXT_VALUE; STUB\n"); break; case INTERNET_OPTION_SECURITY_FLAGS: FIXME("Option INTERNET_OPTION_SECURITY_FLAGS; STUB\n"); break; + case INTERNET_OPTION_DISABLE_AUTODIAL: + FIXME("Option INTERNET_OPTION_DISABLE_AUTODIAL; STUB\n"); + break; case 86: FIXME("86\n"); break; @@ -2638,7 +2661,7 @@ BOOL WINAPI InternetCheckConnectionW( LPCWSTR lpszUrl, DWORD dwFlags, DWORD dwRe URL_COMPONENTSW components; ZeroMemory(&components,sizeof(URL_COMPONENTSW)); - components.lpszHostName = (LPWSTR)&hostW; + components.lpszHostName = (LPWSTR)hostW; components.dwHostNameLength = 1024; if (!InternetCrackUrlW(lpszUrl,0,0,&components)) @@ -3353,7 +3376,7 @@ static LPCWSTR INTERNET_GetSchemeString(INTERNET_SCHEME scheme) index = scheme - INTERNET_SCHEME_FIRST; if (index >= sizeof(url_schemes)/sizeof(url_schemes[0])) return NULL; - return (LPCWSTR)&url_schemes[index]; + return (LPCWSTR)url_schemes[index]; } /* we can calculate using ansi strings because we're just diff --git a/reactos/dll/win32/wininet/internet.h b/reactos/dll/win32/wininet/internet.h index 5d4d7e89b6b..2e7f642b32a 100644 --- a/reactos/dll/win32/wininet/internet.h +++ b/reactos/dll/win32/wininet/internet.h @@ -41,18 +41,6 @@ # include # include #endif -#ifdef HAVE_OPENSSL_SSL_H -#define DSA __ssl_DSA /* avoid conflict with commctrl.h */ -#undef FAR -/* avoid conflict with wincrypt.h */ -#undef PKCS7_SIGNER_INFO -#undef X509_NAME -#undef X509_CERT_PAIR -# include -#undef FAR -#define FAR do_not_use_this_in_wine -#undef DSA -#endif #ifdef HAVE_SYS_SOCKET_H # include #endif @@ -72,12 +60,10 @@ typedef struct { BOOL useSSL; int socketFD; -#ifdef HAVE_OPENSSL_SSL_H - SSL *ssl_s; + void *ssl_s; char *peek_msg; char *peek_msg_mem; size_t peek_len; -#endif } WININET_NETCONNECTION; static inline LPWSTR WININET_strdupW( LPCWSTR str ) @@ -364,6 +350,8 @@ LPWININETHANDLEHEADER WININET_AddRef( LPWININETHANDLEHEADER info ); BOOL WININET_Release( LPWININETHANDLEHEADER info ); BOOL WININET_FreeHandle( HINTERNET hinternet ); +DWORD INET_QueryOption(DWORD,void*,DWORD*,BOOL); + time_t ConvertTimeString(LPCWSTR asctime); HINTERNET FTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR lpszServerName, diff --git a/reactos/dll/win32/wininet/netconnection.c b/reactos/dll/win32/wininet/netconnection.c index 45dc40d025d..5d8b4d75534 100644 --- a/reactos/dll/win32/wininet/netconnection.c +++ b/reactos/dll/win32/wininet/netconnection.c @@ -23,6 +23,7 @@ #include "config.h" #include "wine/port.h" +#include #ifdef HAVE_POLL_H #include #endif @@ -42,6 +43,22 @@ #ifdef HAVE_SYS_IOCTL_H # include #endif +#include +#ifdef HAVE_NETDB_H +# include +#endif +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_OPENSSL_SSL_H +# include +#undef FAR +#undef DSA +#endif +#ifdef HAVE_SYS_SOCKET_H +# include +#endif + #include #include #include diff --git a/reactos/dll/win32/wininet/rsrc.rc b/reactos/dll/win32/wininet/rsrc.rc index c160c476447..866159d813f 100644 --- a/reactos/dll/win32/wininet/rsrc.rc +++ b/reactos/dll/win32/wininet/rsrc.rc @@ -57,6 +57,7 @@ #include "wininet_No.rc" #include "wininet_Pl.rc" #include "wininet_Pt.rc" +#include "wininet_Ro.rc" #include "wininet_Ru.rc" #include "wininet_Si.rc" #include "wininet_Sv.rc" diff --git a/reactos/dll/win32/wininet/urlcache.c b/reactos/dll/win32/wininet/urlcache.c index 6e768933a07..75bcf342d3f 100644 --- a/reactos/dll/win32/wininet/urlcache.c +++ b/reactos/dll/win32/wininet/urlcache.c @@ -2339,7 +2339,7 @@ static BOOL WINAPI CommitUrlCacheEntryInternal( /* skip container path prefix */ lpszLocalFileName += lstrlenW(pContainer->path); - WideCharToMultiByte(CP_ACP, 0, lpszLocalFileName, -1, achFile, -1, NULL, NULL); + WideCharToMultiByte(CP_ACP, 0, lpszLocalFileName, -1, achFile, MAX_PATH, NULL, NULL); pchLocalFileName = achFile; for (cDirectory = 0; cDirectory < pHeader->DirectoryCount; cDirectory++) diff --git a/reactos/dll/win32/wininet/utility.c b/reactos/dll/win32/wininet/utility.c index 25972688a1e..b0d9c9c91c6 100644 --- a/reactos/dll/win32/wininet/utility.c +++ b/reactos/dll/win32/wininet/utility.c @@ -40,6 +40,16 @@ WINE_DEFAULT_DEBUG_CHANNEL(wininet); +/* critical section to protect non-reentrant gethostbyname() */ +static CRITICAL_SECTION cs_gethostbyname; +static CRITICAL_SECTION_DEBUG critsect_debug = +{ + 0, 0, &cs_gethostbyname, + { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList }, + 0, 0, { (DWORD_PTR)(__FILE__ ": cs_gethostbyname") } +}; +static CRITICAL_SECTION cs_gethostbyname = { &critsect_debug, -1, 0, 0, 0, 0 }; + #define TIME_STRING_LEN 30 time_t ConvertTimeString(LPCWSTR asctime) @@ -151,12 +161,15 @@ BOOL GetAddress(LPCWSTR lpszServerName, INTERNET_PORT nServerPort, name = HeapAlloc(GetProcessHeap(), 0, sz+1); WideCharToMultiByte( CP_UNIXCP, 0, lpszServerName, len, name, sz, NULL, NULL ); name[sz] = 0; + + EnterCriticalSection( &cs_gethostbyname ); phe = gethostbyname(name); HeapFree( GetProcessHeap(), 0, name ); if (NULL == phe) { TRACE("Failed to get hostname: (%s)\n", debugstr_w(lpszServerName) ); + LeaveCriticalSection( &cs_gethostbyname ); return FALSE; } @@ -165,6 +178,7 @@ BOOL GetAddress(LPCWSTR lpszServerName, INTERNET_PORT nServerPort, psa->sin_family = phe->h_addrtype; psa->sin_port = htons(nServerPort); + LeaveCriticalSection( &cs_gethostbyname ); return TRUE; } diff --git a/reactos/dll/win32/wininet/wininet_Ro.rc b/reactos/dll/win32/wininet/wininet_Ro.rc new file mode 100644 index 00000000000..367bbb5955a --- /dev/null +++ b/reactos/dll/win32/wininet/wininet_Ro.rc @@ -0,0 +1,49 @@ +/* + * Copyright 2003 Mike McCormack for CodeWeavers + * Copyright 2008 Michael Stefaniuc + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL + +#pragma code_page(65001) + +IDD_PROXYDLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 250, 154 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Introducere parolă de rețea" +FONT 8, "MS Shell Dlg" +{ + LTEXT "Introduceți numele de utilizator și parola:", -1, 40, 6, 150, 15 + LTEXT "Proxy", -1, 40, 26, 50, 10 + LTEXT "Realm", -1, 40, 46, 50, 10 + LTEXT "Utilizator", -1, 40, 66, 50, 10 + LTEXT "Parolă", -1, 40, 86, 50, 10 + LTEXT "" IDC_PROXY, 80, 26, 150, 14, 0 + LTEXT "" IDC_REALM, 80, 46, 150, 14, 0 + EDITTEXT IDC_USERNAME, 80, 66, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP + EDITTEXT IDC_PASSWORD, 80, 86, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP | ES_PASSWORD + CHECKBOX "&Salvează această parolă (nesigur)", IDC_SAVEPASSWORD, + 80, 106, 150, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + PUSHBUTTON "OK", IDOK, 98, 126, 56, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "Renunță", IDCANCEL, 158, 126, 56, 14, WS_GROUP | WS_TABSTOP +} + +STRINGTABLE DISCARDABLE +{ + IDS_LANCONNECTION "Conexiune LAN" +} + +#pragma code_page(default) diff --git a/reactos/dll/win32/wininet/wininet_ros.diff b/reactos/dll/win32/wininet/wininet_ros.diff index f83345b96fc..11b26d0c71a 100644 --- a/reactos/dll/win32/wininet/wininet_ros.diff +++ b/reactos/dll/win32/wininet/wininet_ros.diff @@ -9,28 +9,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(wininet); static const WCHAR g_szHttp1_0[] = {'H','T','T','P','/','1','.','0',0}; -@@ -1617,8 +1619,9 @@ - - if(req->lpszCacheFile) { - BOOL res; -+ DWORD dwBytesWritten; - -- res = WriteFile(req->hCacheFile, buffer, bytes_read, NULL, NULL); -+ res = WriteFile(req->hCacheFile, buffer, bytes_read, &dwBytesWritten, NULL); - if(!res) - WARN("WriteFile failed: %u\n", GetLastError()); - } -@@ -1686,7 +1689,9 @@ - - if (req->lpszCacheFile) - { -- if (!WriteFile(req->hCacheFile, p, bytes_read, NULL, NULL)) -+ DWORD dwBytesWritten; -+ -+ if (!WriteFile(req->hCacheFile, p, bytes_read, &dwBytesWritten, NULL)) - WARN("WriteFile failed: %u\n", GetLastError()); - } - p += bytes_read; --- D:/Wine-CVS/wine/dlls/wininet/internet.c Wed May 28 14:33:28 2008 +++ D:/ReactOS-Trunk/reactos/dll/win32/wininet/internet.c Fri May 30 18:04:29 2008 @@ -3101,19 +3101,22 @@ -- 2.17.1