#include #include "parseurl.h" #ifndef _AFXDLL #pragma comment(lib, "wininet.lib") #endif ///////////////////////////////////////////////////////////////////////////// // Global Functions static bool _ParseURLWorker(LPCTSTR pstrURL, LPURL_COMPONENTS lpComponents, DWORD& dwServiceType, INTERNET_PORT& nPort, DWORD dwFlags) { // this function will return bogus stuff if lpComponents // isn't set up to copy the components ASSERT(lpComponents != NULL && pstrURL != NULL); if (lpComponents == NULL || pstrURL == NULL) return false; ASSERT(lpComponents->dwHostNameLength == 0 || lpComponents->lpszHostName != NULL); ASSERT(lpComponents->dwUrlPathLength == 0 || lpComponents->lpszUrlPath != NULL); ASSERT(lpComponents->dwUserNameLength == 0 || lpComponents->lpszUserName != NULL); ASSERT(lpComponents->dwPasswordLength == 0 || lpComponents->lpszPassword != NULL); LPTSTR pstrCanonicalizedURL; TCHAR szCanonicalizedURL[INTERNET_MAX_URL_LENGTH]; DWORD dwNeededLength = INTERNET_MAX_URL_LENGTH; bool bRetVal; bool bMustFree = false; DWORD dwCanonicalizeFlags = dwFlags & (ICU_NO_ENCODE | ICU_DECODE | ICU_NO_META | ICU_ENCODE_SPACES_ONLY | ICU_BROWSER_MODE); DWORD dwCrackFlags = dwFlags & (ICU_ESCAPE | ICU_USERNAME); bRetVal = InternetCanonicalizeUrl(pstrURL, szCanonicalizedURL, &dwNeededLength, dwCanonicalizeFlags) ? true : false; if(!bRetVal) { if(::GetLastError() != ERROR_INSUFFICIENT_BUFFER) return false; pstrCanonicalizedURL = new TCHAR[dwNeededLength]; bMustFree = true; bRetVal = InternetCanonicalizeUrl(pstrURL, pstrCanonicalizedURL, &dwNeededLength, dwCanonicalizeFlags) ? true : false; if(!bRetVal) { delete [] pstrCanonicalizedURL; return false; } } else pstrCanonicalizedURL = szCanonicalizedURL; // now that it's safely canonicalized, crack it bRetVal = InternetCrackUrl(pstrCanonicalizedURL, 0, dwCrackFlags, lpComponents) ? true : false; if (bMustFree) delete [] pstrCanonicalizedURL; return bRetVal; } bool ParseURLEx(LPCTSTR pstrURL, DWORD& dwServiceType, string& strServer, string& strObject, INTERNET_PORT& nPort, string& strUsername, string& strPassword, DWORD dwFlags/* = 0*/) { ASSERT(pstrURL != NULL); if (pstrURL == NULL) return false; URL_COMPONENTS urlComponents; memset(&urlComponents, 0, sizeof(URL_COMPONENTS)); urlComponents.dwStructSize = sizeof(URL_COMPONENTS); urlComponents.dwHostNameLength = INTERNET_MAX_HOST_NAME_LENGTH; urlComponents.lpszHostName = strServer.get_buffer(INTERNET_MAX_HOST_NAME_LENGTH + 1); urlComponents.dwUrlPathLength = INTERNET_MAX_PATH_LENGTH; urlComponents.lpszUrlPath = strObject.get_buffer(INTERNET_MAX_PATH_LENGTH + 1); urlComponents.dwUserNameLength = INTERNET_MAX_USER_NAME_LENGTH; urlComponents.lpszUserName = strUsername.get_buffer(INTERNET_MAX_USER_NAME_LENGTH + 1); urlComponents.dwPasswordLength = INTERNET_MAX_PASSWORD_LENGTH; urlComponents.lpszPassword = strPassword.get_buffer(INTERNET_MAX_PASSWORD_LENGTH + 1); bool bRetVal = _ParseURLWorker(pstrURL, &urlComponents, dwServiceType, nPort, dwFlags); dwServiceType = urlComponents.nScheme; strServer.release_buffer(); strObject.release_buffer(); strUsername.release_buffer(); strPassword.release_buffer(); return bRetVal; } bool ParseURL(LPCTSTR pstrURL, DWORD& dwServiceType, string& strServer, string& strObject, INTERNET_PORT& nPort) { ASSERT(pstrURL != NULL); if (pstrURL == NULL) return FALSE; URL_COMPONENTS urlComponents; memset(&urlComponents, 0, sizeof(URL_COMPONENTS)); urlComponents.dwStructSize = sizeof(URL_COMPONENTS); urlComponents.dwHostNameLength = INTERNET_MAX_URL_LENGTH; urlComponents.lpszHostName = strServer.get_buffer(INTERNET_MAX_URL_LENGTH + 1); urlComponents.dwUrlPathLength = INTERNET_MAX_URL_LENGTH; urlComponents.lpszUrlPath = strObject.get_buffer(INTERNET_MAX_URL_LENGTH + 1); bool bRetVal = _ParseURLWorker(pstrURL, &urlComponents, dwServiceType, nPort, ICU_BROWSER_MODE); dwServiceType = urlComponents.nScheme; strServer.release_buffer(); strObject.release_buffer(); return bRetVal; }