fsInternetResult fsHttpFile::Write(LPBYTE pBuffer, DWORD dwSize, DWORD *pdwWritten) { if (m_hFile == NULL) { if (pdwWritten) *pdwWritten = 0; return IR_NOTINITIALIZED; } if (m_uLeftToUpload == 0) return IR_S_FALSE; DWORD dwWritten; BOOL bRet = InternetWriteFile (m_hFile, pBuffer, dwSize, &dwWritten); if (pdwWritten) *pdwWritten = dwWritten; if (!bRet) return fsWinInetErrorToIR (); m_uLeftToUpload -= dwWritten; if (m_uLeftToUpload == 0) { if (m_bUseMultipart) { fsString str = "\r\n"; str += m_strLabel; str += "--\r\n"; DWORD dw; if (FALSE == InternetWriteFile (m_hFile, str, str.GetLength (), &dw)) return fsWinInetErrorToIR (); } bRet = HttpEndRequest (m_hFile, NULL, 0, NULL); if (!bRet) return fsWinInetErrorToIR (); } return IR_SUCCESS; }
fsInternetResult fsHttpFile::Read(LPBYTE pBuffer, DWORD dwToRead, DWORD *pdwRead) { if (m_hFile == NULL) { *pdwRead = 0; return IR_NOTINITIALIZED; } if (!InternetReadFile (m_hFile, pBuffer, dwToRead, pdwRead)) return fsWinInetErrorToIR (); return IR_SUCCESS; }
fsInternetResult fsFtpFiles::BuildList() { fsInternetResult ir = IR_SUCCESS; WIN32_FIND_DATA wfd; m_vFiles.clear (); if (m_bAbort) return IR_S_FALSE; HINTERNET hFind = FtpFindFirstFile (m_pServer->GetHandle (), NULL, &wfd, m_bReload ? INTERNET_FLAG_RELOAD : 0, NULL); if (hFind) { do { fsFileInfo file; if (_tcscmp (wfd.cFileName, _T(".")) == 0 || _tcscmp (wfd.cFileName, _T("..")) == 0) continue; file.strName = wfd.cFileName; file.uSize = wfd.nFileSizeLow; file.date = wfd.ftLastWriteTime; file.bAvailable = TRUE; file.bFolder = wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; if (file.strName == NULL) { InternetCloseHandle (hFind); return IR_OUTOFMEMORY; } m_vFiles.add (file); } while (InternetFindNextFile (hFind, &wfd) && m_bAbort == FALSE); if (::GetLastError () != ERROR_NO_MORE_FILES && m_bAbort == FALSE) ir = fsWinInetErrorToIR (); InternetCloseHandle (hFind); } if (m_bAbort) m_vFiles.clear (); return m_bAbort ? IR_S_FALSE : ir; }
fsInternetResult fsHttpFile::OpenEx(LPCSTR pszFilePath, UINT64 uStartPos, UINT64 uUploadPartSize, UINT64 uUploadTotalSize) { if (uUploadTotalSize == _UI64_MAX) return Open_imp (pszFilePath, uStartPos, 0); if (uStartPos + uUploadPartSize > uUploadTotalSize) return IR_INVALIDPARAM; if (!m_pServer) return IR_NOTINITIALIZED; HINTERNET hServer = m_pServer->GetHandle (); if (!hServer) return IR_NOTINITIALIZED; CloseHandle (); if (lstrlen (pszFilePath) > 9000) return IR_BADURL; fsString strFilePath = pszFilePath; fsString strFileName; if (m_bUseMultipart) { LPSTR psz = strrchr (strFilePath, '/'); if (psz) { strFileName = psz + 1; psz [1] = 0; } else strFileName = pszFilePath; } LPTSTR ppszAcceptedTypes [2] = { "*/*", NULL }; m_hFile = HttpOpenRequest (hServer, "POST", strFilePath, m_pszHttpVersion, NULL, (LPCSTR*)ppszAcceptedTypes, INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_KEEP_CONNECTION, 0); if (m_hFile == NULL) return fsWinInetErrorToIR (); fsInternetResult ir = SetupProxy (); if (ir != IR_SUCCESS) { CloseHandle (); return ir; } CHAR szHdr [10000] = ""; if (m_bUseMultipart) lstrcpy (szHdr, "Content-Type: multipart/form-data; boundary=---------------------------284583012225247"); else { lstrcpy (szHdr, "Content-Type: application/x-www-form-urlencoded"); if (m_strCharset.IsEmpty () == FALSE) { lstrcat (szHdr, "; charset="); lstrcat (szHdr, m_strCharset); } } if (uStartPos || uUploadPartSize != uUploadTotalSize) { if (*szHdr) lstrcat (szHdr, "\r\n"); sprintf (szHdr + lstrlen (szHdr), "Range: bytes=%I64u-%I64u/%I64u", uStartPos, uStartPos + uUploadPartSize - 1, uUploadTotalSize); } if (m_pszCookies) { if (*szHdr) lstrcat (szHdr, "\r\n"); sprintf (szHdr + lstrlen (szHdr), "Cookie: %s", m_pszCookies); } if (m_pszAdditionalHeaders) { if (*szHdr) lstrcat (szHdr, "\r\n"); lstrcat (szHdr, m_pszAdditionalHeaders); } IgnoreSecurityProblems (); int nSizeAdd = 0; fsString strMultipartHdr; if (m_bUseMultipart) { m_strLabel = "-----------------------------284583012225247"; strMultipartHdr = m_strLabel; strMultipartHdr += "\r\n"; strMultipartHdr += "Content-Disposition: form-data; name=\"uploadFormFile\"; filename=\""; strMultipartHdr += strFileName; strMultipartHdr += "\"\r\n"; strMultipartHdr += "Content-Type: application/octet-stream\r\n\r\n"; nSizeAdd = strMultipartHdr.GetLength () + m_strLabel.GetLength () + 6; } INTERNET_BUFFERS BufferIn = {0}; BufferIn.dwStructSize = sizeof (INTERNET_BUFFERS); BufferIn.lpcszHeader = szHdr; BufferIn.dwHeadersLength = BufferIn.dwHeadersTotal = lstrlen (szHdr); BufferIn.dwBufferTotal = (DWORD) (uUploadPartSize + nSizeAdd); if (!HttpSendRequestEx (m_hFile, &BufferIn, NULL, HSR_INITIATE, 0)) { ir = fsWinInetErrorToIR (); CloseHandle (); return ir; } if (m_bUseMultipart) { DWORD dw; if (FALSE == InternetWriteFile (m_hFile, strMultipartHdr, strMultipartHdr.GetLength (), &dw)) { ir = fsWinInetErrorToIR (); CloseHandle (); return ir; } } m_uLeftToUpload = uUploadPartSize; return IR_SUCCESS; }
fsInternetResult fsHttpFile::Open_imp(LPCSTR pszFilePath, UINT64 uStartPos, int cTryings) { if (!m_pServer) return IR_NOTINITIALIZED; HINTERNET hServer = m_pServer->GetHandle (); if (!hServer) return IR_NOTINITIALIZED; CloseHandle (); if (lstrlen (pszFilePath) > 9000) return IR_BADURL; if (cTryings > 1) return IR_WININETUNKERROR; DWORD dwFlags = m_dwFlags; if (m_pszCookies) dwFlags |= INTERNET_FLAG_NO_COOKIES; if (m_bEnableAutoRedirect == FALSE) dwFlags |= INTERNET_FLAG_NO_AUTO_REDIRECT; LPTSTR ppszAcceptedTypes [2] = { "*/*", NULL }; LPCSTR pszVerb = "GET"; if (m_pszPostData) pszVerb = "POST"; else if (m_bHeadersOnly) pszVerb = "HEAD"; m_hFile = HttpOpenRequest (hServer, pszVerb, pszFilePath, m_pszHttpVersion, m_pszReferer, (LPCSTR*) ppszAcceptedTypes, dwFlags | INTERNET_FLAG_RELOAD | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_NO_CACHE_WRITE, NULL); if (m_hFile == NULL) return fsWinInetErrorToIR (); fsInternetResult ir = SetupProxy (); if (ir != IR_SUCCESS) { CloseHandle (); return ir; } CHAR szHdr [20000] = ""; if (uStartPos) sprintf (szHdr, "Range: bytes=%I64u-\r\n", uStartPos); if (m_pszCookies) sprintf (szHdr + lstrlen (szHdr), "Cookie: %s\r\n", m_pszCookies); if (m_pszPostData) strcat (szHdr, "Content-Type: application/x-www-form-urlencoded\r\n"); if (m_pszAdditionalHeaders) strcat (szHdr, m_pszAdditionalHeaders); if (cTryings == 0) { char szReq [90000]; sprintf (szReq, "%s %s %s\r\nReferer: %s", pszVerb, pszFilePath, m_pszHttpVersion, m_pszReferer ? m_pszReferer : "-"); if (*szHdr) { strcat (szReq, "\r\n"); strcat (szReq, szHdr); szReq [strlen (szReq) - 2] = 0; } if ((dwFlags & INTERNET_FLAG_NO_COOKIES) == 0) { char szUrl [10000]; DWORD dw = sizeof (szUrl); fsURL url; url.Create (m_dwFlags & INTERNET_FLAG_SECURE ? INTERNET_SCHEME_HTTPS : INTERNET_SCHEME_HTTP, m_pServer->GetServerName (), m_pServer->GetServerPort (), NULL, NULL, pszFilePath, szUrl, &dw); char szCookie [10000]; dw = sizeof (szCookie); *szCookie = 0; InternetGetCookie (szUrl, NULL, szCookie, &dw); if (*szCookie) { strcat (szReq, "\r\n"); strcat (szReq, "Cookie: "); strcat (szReq, szCookie); } } strcat (szReq, "\r\nHost: "); strcat (szReq, m_pServer->GetServerName ()); if (m_pszPostData) { strcat (szReq, "\r\n"); strcat (szReq, m_pszPostData); } Dialog (IFDD_TOSERVER, szReq); } IgnoreSecurityProblems (); if (!HttpSendRequest (m_hFile, *szHdr ? szHdr : NULL, (UINT)-1, m_pszPostData, m_pszPostData ? lstrlen (m_pszPostData) : 0)) { ir = fsWinInetErrorToIR (); DialogHttpResponse (m_hFile); CloseHandle (); return ir; } char szResp [10000]; DWORD dwRespLen = sizeof (szResp), dwIndex = 0; if (HttpQueryInfo (m_hFile, HTTP_QUERY_RAW_HEADERS_CRLF, szResp, &dwRespLen, &dwIndex)) { int cLines = 0; LPCSTR pszLine = szResp; while (pszLine) { pszLine = strchr (pszLine, '\n'); if (pszLine) { while (*pszLine == '\r' || *pszLine == '\n') pszLine++; cLines++; } } if (cLines == 0 || cLines == 1) { return Open_imp (pszFilePath, uStartPos, ++cTryings); } } DialogHttpResponse (m_hFile); DWORD dwStatusCode; DWORD dwSize = sizeof (DWORD); if (!HttpQueryInfo(m_hFile, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &dwStatusCode, &dwSize, NULL)) return fsWinInetErrorToIR (); if (dwStatusCode < 200 || dwStatusCode >= 300) { ir = fsHttpStatusCodeToIR (dwStatusCode); if (ir == IR_NEEDREDIRECT) { DWORD dwNeedLen = 0; HttpQueryInfo (m_hFile, HTTP_QUERY_LOCATION, NULL, &dwNeedLen, NULL); if (::GetLastError () == ERROR_INSUFFICIENT_BUFFER) { SAFE_DELETE_ARRAY (m_pszLastError); try { m_pszLastError = new char [++dwNeedLen]; }catch (...) {return IR_OUTOFMEMORY;} if (m_pszLastError == NULL) return IR_OUTOFMEMORY; if (!HttpQueryInfo (m_hFile, HTTP_QUERY_LOCATION, m_pszLastError, &dwNeedLen, NULL)) return IR_SERVERUNKERROR; } else return IR_SERVERUNKERROR; } return ir; } char szContLen [1000]; DWORD dwLen = sizeof (szContLen); if (HttpQueryInfo (m_hFile, HTTP_QUERY_CONTENT_LENGTH, szContLen, &dwLen, NULL)) { __int64 iSize = _atoi64 (szContLen); if (iSize < 0) return IR_SERVERUNKERROR; m_uFileSize = (UINT64) iSize; } else m_uFileSize = _UI64_MAX; ir = IR_SUCCESS; if (uStartPos) { ir = ProcessRangesResponse (); if (ir == IR_RANGESNOTAVAIL) return ir; } else { CHAR sz [10000]; DWORD dw = sizeof (sz); if (HttpQueryInfo (m_hFile, HTTP_QUERY_ACCEPT_RANGES, sz, &dw, NULL)) { if (stricmp (sz, "bytes") == 0) m_enRST = RST_PRESENT; else m_enRST = RST_NONE; } else m_enRST = RST_UNKNOWN; } m_bContentTypeValid = FALSE; m_bDateValid = FALSE; CHAR szContentType [10000]; DWORD dwCL = sizeof (szContentType); if (HttpQueryInfo (m_hFile, HTTP_QUERY_CONTENT_TYPE, szContentType, &dwCL, NULL)) { m_strContentType = szContentType; m_bContentTypeValid = TRUE; } SYSTEMTIME time; DWORD dwTL = sizeof (time); if (HttpQueryInfo (m_hFile, HTTP_QUERY_LAST_MODIFIED | HTTP_QUERY_FLAG_SYSTEMTIME, &time, &dwTL, NULL)) { SystemTimeToFileTime (&time, &m_date); m_bDateValid = TRUE; } RetreiveSuggFileName (); return ir; }
fsInternetResult fsWinInetErrorToIR () { return fsWinInetErrorToIR (GetLastError ()); }
fsInternetResult CCreateTPDownloadDlg::Crack(LPCSTR pszUrl) { CHAR m_szScheme [URL_SCHEME_SIZE]; CHAR m_szHost [URL_HOSTNAME_SIZE]; CHAR m_szUser [URL_USERNAME_SIZE]; CHAR m_szPassword [URL_PASSWORD_SIZE]; CHAR m_szPath [URL_PATH_SIZE]; DWORD urlLen = strlen (pszUrl) * 2; CHAR *pszCanUrl = NULL; fsString strUrl; if (*pszUrl == '"' || *pszUrl == '\'') { strUrl = pszUrl + 1; if (strUrl [0] == 0) return IR_BADURL; strUrl [strUrl.Length () - 1] = 0; m_strUrl = pszUrl = strUrl; } fsnew (pszCanUrl, CHAR, urlLen); if (!InternetCanonicalizeUrl (pszUrl, pszCanUrl, &urlLen, ICU_BROWSER_MODE)) { delete pszCanUrl; if (GetLastError () == ERROR_INSUFFICIENT_BUFFER) { fsnew (pszCanUrl, CHAR, urlLen+1); if (!InternetCanonicalizeUrl (pszUrl, pszCanUrl, &urlLen, ICU_BROWSER_MODE)) { delete pszCanUrl; return fsWinInetErrorToIR (); } } else return fsWinInetErrorToIR (); } URL_COMPONENTS m_url; ZeroMemory (&m_url, sizeof (m_url)); m_url.dwStructSize = sizeof (m_url); m_url.lpszHostName = m_szHost; m_url.lpszPassword = m_szPassword; m_url.lpszScheme = m_szScheme; m_url.lpszUrlPath = m_szPath; m_url.lpszUserName = m_szUser; m_url.dwHostNameLength = URL_HOSTNAME_SIZE; m_url.dwPasswordLength = URL_PASSWORD_SIZE; m_url.dwSchemeLength = URL_SCHEME_SIZE; m_url.dwUrlPathLength = URL_PATH_SIZE; m_url.dwUserNameLength = URL_USERNAME_SIZE; if (!InternetCrackUrl (pszCanUrl, urlLen, 0, &m_url)) { delete pszCanUrl; return fsWinInetErrorToIR (); } delete pszCanUrl; if (strstr (m_url.lpszScheme, "mmsh") == NULL && strstr (m_url.lpszScheme, "mmst") == NULL && strstr (m_url.lpszScheme, "mms") == NULL && strstr (m_url.lpszScheme, "rtsp") == NULL || m_url.dwHostNameLength == 0) return IR_BADURL; return IR_SUCCESS; }