UINT CMMSSender::PostHTTP(CString csURL, BYTE* strPostData, long lDataSize, CString csHeaders, CString& csRetHeaders, CString& csRetData) { UINT nCode=0; DWORD dwService; CString csServer; CString csPath; INTERNET_PORT nPort; CString csUser; CString csPwd; AfxParseURLEx(csURL,dwService,csServer,csPath,nPort,csUser,csPwd,0); CHttpConnection* pConnection = NULL; pConnection=m_pSession->GetHttpConnection(csServer,0, nPort, NULL, NULL); if(pConnection) { BOOL bResult=FALSE; CHttpFile* pFile = NULL; pFile=pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST,csPath,NULL,1,NULL,"HTTP/1.1",INTERNET_FLAG_NO_AUTO_REDIRECT); if(pFile) { try { bResult=pFile->SendRequest(csHeaders, strPostData, lDataSize); if(bResult) { CString csCode; pFile->QueryInfo(HTTP_QUERY_STATUS_CODE,csCode); nCode=atoi(csCode); CString csHeaders; pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF,csRetHeaders); csRetData=ReadData(pFile); } } catch(CInternetException* e) { } pFile->Close(); delete pFile; } pConnection->Close(); delete pConnection; } return nCode; }
UINT CCopiagenda::GetHTTPS(CString csURL, CString csHeaders, CString& csRetHeaders, CString& csRetData) { UINT nCode; DWORD dwService; CString csServer; CString csPath; INTERNET_PORT nPort; CString csUser; CString csPwd; AfxParseURLEx(csURL,dwService,csServer,csPath,nPort,csUser,csPwd,0); CHttpConnection* pConnection = NULL; pConnection=m_pSession->GetHttpConnection(csServer,INTERNET_FLAG_RELOAD|INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_KEEP_CONNECTION|INTERNET_FLAG_SECURE,nPort, NULL, NULL); if(pConnection) { BOOL bResult=FALSE; CHttpFile* pFile = NULL; pFile=pConnection->OpenRequest(CHttpConnection::HTTP_VERB_GET,csPath,NULL,1,NULL,"HTTP/1.1",INTERNET_FLAG_EXISTING_CONNECT|INTERNET_FLAG_RELOAD|INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_KEEP_CONNECTION|INTERNET_FLAG_NO_AUTO_REDIRECT|INTERNET_FLAG_SECURE); if(pFile) { try { bResult=pFile->SendRequest(csHeaders, NULL, 0); if(bResult) { CString csCode; pFile->QueryInfo(HTTP_QUERY_STATUS_CODE,csCode); nCode=atoi(csCode); pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF,csRetHeaders); csRetData=ReadData(pFile); } } catch(CInternetException* e) { } pFile->Close(); delete pFile; } pConnection->Close(); delete pConnection; } return nCode; }
BOOL CAutoUpdateDlg::DownloadFile(LPCTSTR lpURL,LPCTSTR lpDestFile) { CFile cUdpFile; if(!cUdpFile.Open(lpDestFile,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::shareDenyWrite)) return FALSE; BOOL bResult = FALSE; CInternetSession sessionDownload; try { CHttpFile* pFile = (CHttpFile*)sessionDownload.OpenURL(lpURL,1,INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_RELOAD|INTERNET_FLAG_DONT_CACHE); CString query = _T(""); pFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH,query); long file_len=_ttol(query); m_dwTotalSize = file_len; PostMessage(WM_POSMESSAGE,0,0); DWORD dwStatus; if (pFile->QueryInfoStatusCode(dwStatus)) { if (dwStatus == 200) { pFile->SetReadBufferSize(10240); if (TRUE) { DWORD dwLen = 0; char buf[BLOCKSIZE]; while (TRUE) { DWORD dwTemp = pFile->Read(buf,BLOCKSIZE); if (dwTemp) { cUdpFile.Write(buf,dwTemp); } m_dwDownloadedSize += dwTemp; PostMessage(WM_POSMESSAGE,0,0); if (dwTemp < BLOCKSIZE) { break; } } } } } pFile->Close(); bResult = TRUE; } catch(CInternetException* pException) { pException->Delete(); return bResult; } sessionDownload.Close(); cUdpFile.Close(); return bResult; }
CHAR* WebFetcher::GetHttp(LPCSTR lpServerName) { CInternetSession sess; // 统一以二进制方式下载 DWORD dwFlag = INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_RELOAD; CHttpFile *pF = (CHttpFile*)sess.OpenURL(lpServerName, 1, dwFlag); ASSERT(pF); if (!pF) { AfxThrowInternetException(1); } // 得到文件大小 CString str; pF->QueryInfo(HTTP_QUERY_CONTENT_LENGTH, str); int nFileSize = _ttoi(str); char *p = new char[nFileSize]; while (true) { // 每次下载8Kb int n = pF->Read(p, (nFileSize < 8192) ? nFileSize : 8192); if (n <= 0) { break; } p += n; nFileSize -= n; } //delete[] p; pF->Close(); delete pF; return p; }
static DWORD WINAPI URLGetAsyncThread( LPVOID lpParam ) { URLGetAsyncData *data = (URLGetAsyncData *)lpParam; if (!data->url.IsEmpty()) { CInternetSession session; try { CHttpFile* pFile; pFile = (CHttpFile*)session.OpenURL(data->url, NULL, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE); if (pFile) { pFile->QueryInfoStatusCode(data->statusCode); CStringA buf; char pBuf[256]; int i; do { i = pFile->Read(pBuf,255); pBuf[i] = 0; data->body.AppendFormat("%s",pBuf); } while (i>0); //-- pFile->QueryInfo( HTTP_QUERY_RAW_HEADERS_CRLF, data->headers ); pFile->Close(); } session.Close(); } catch (CInternetException *e) { data->statusCode = 0; } } if (data->message) { SendMessage(data->hWnd,data->message,(WPARAM)data,0); } delete data; return 0; }
// 初始化更新列表 BOOL CUpdaterApp::_InitFileList() { BOOL bReturn(FALSE); CString strFileList(m_szServer); strFileList += _T("/Filelist.txt"); CInternetSession sess; sess.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 5000); sess.SetOption(INTERNET_OPTION_SEND_TIMEOUT, 1000); sess.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT, 5000); sess.SetOption(INTERNET_OPTION_DATA_SEND_TIMEOUT, 1000); sess.SetOption(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, 5000); sess.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1); try { CHttpFile* pHttpFile = (CHttpFile*)sess.OpenURL(strFileList, 1, INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_TRANSFER_ASCII, NULL, 0); if (pHttpFile) { DWORD dwErrCode(0); pHttpFile->QueryInfo(HTTP_QUERY_STATUS_CODE, dwErrCode); if (dwErrCode >= 200 && dwErrCode < 300) { CStringA strLineA; while (pHttpFile->ReadString((LPTSTR)strLineA.GetBuffer(512), 511)) { strLineA.ReleaseBuffer(); // MFC-bug CString strLine(strLineA); strLine.TrimLeft(); if (strLine.GetLength() > 0 && strLine[0] != _T('\\')) { continue; } std::vector<CString> vecStrs = Split(strLine, _T("^^^^^^")); if (vecStrs.size() >= 2) { LPUPDATEITEM pUpdateItem = new UPDATEITEM; ZeroMemory(pUpdateItem, sizeof(*pUpdateItem)); lstrcpyn(pUpdateItem->szFileName, vecStrs[0], MAX_PATH); lstrcpyn(pUpdateItem->szServerMD5, vecStrs[1], 33); m_arrUpdate.Add(pUpdateItem); } } pHttpFile->Close(); sess.Close(); bReturn = TRUE; } else { LOG(_T("网站访问错误码:%d"), dwErrCode); } } } catch (...) { LOG(_T("下载列表异常!")); } return bReturn; }
int main(int argc, char* argv[]) { ShowBanner(); if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { cerr << _T("MFC Failed to initialize.\n"); return 1; } if (argc < 2 || !ParseOptions(argc, argv) || pszURL == NULL) ShowUsage(); int nRetCode = 0; CTearSession session(_T("TEAR - MFC Sample App"), dwAccessType); CHttpConnection* pServer = NULL; CHttpFile* pFile = NULL; try { // check to see if this is a reasonable URL CString strServerName; CString strObject; INTERNET_PORT nPort; DWORD dwServiceType; if (!AfxParseURL(pszURL, dwServiceType, strServerName, strObject, nPort) || dwServiceType != INTERNET_SERVICE_HTTP) { cerr << _T("Error: can only use URLs beginning with http://") << endl; ThrowTearException(1); } if (bProgressMode) { cerr << _T("Opening Internet..."); VERIFY(session.EnableStatusCallback(TRUE)); } pServer = session.GetHttpConnection(strServerName, nPort); pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject, NULL, 1, NULL, NULL, dwHttpRequestFlags); pFile->AddRequestHeaders(szHeaders); pFile->SendRequest(); DWORD dwRet; pFile->QueryInfoStatusCode(dwRet); // if access was denied, prompt the user for the password if (dwRet == HTTP_STATUS_DENIED) { DWORD dwPrompt; dwPrompt = pFile->ErrorDlg(NULL, ERROR_INTERNET_INCORRECT_PASSWORD, FLAGS_ERROR_UI_FLAGS_GENERATE_DATA | FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS, NULL); // if the user cancelled the dialog, bail out if (dwPrompt != ERROR_INTERNET_FORCE_RETRY) { cerr << _T("Access denied: Invalid password\n"); ThrowTearException(1); } pFile->SendRequest(); pFile->QueryInfoStatusCode(dwRet); } CString strNewLocation; pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF, strNewLocation); // were we redirected? // these response status codes come from WININET.H if (dwRet == HTTP_STATUS_MOVED || dwRet == HTTP_STATUS_REDIRECT || dwRet == HTTP_STATUS_REDIRECT_METHOD) { CString strNewLocation; pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF, strNewLocation); int nPlace = strNewLocation.Find(_T("Location: ")); if (nPlace == -1) { cerr << _T("Error: Site redirects with no new location") << endl; ThrowTearException(2); } strNewLocation = strNewLocation.Mid(nPlace + 10); nPlace = strNewLocation.Find('\n'); if (nPlace > 0) strNewLocation = strNewLocation.Left(nPlace); // close up the redirected site pFile->Close(); delete pFile; pServer->Close(); delete pServer; if (bProgressMode) { cerr << _T("Caution: redirected to "); cerr << (LPCTSTR) strNewLocation << endl; } // figure out what the old place was if (!AfxParseURL(strNewLocation, dwServiceType, strServerName, strObject, nPort)) { cerr << _T("Error: the redirected URL could not be parsed.") << endl; ThrowTearException(2); } if (dwServiceType != INTERNET_SERVICE_HTTP) { cerr << _T("Error: the redirected URL does not reference a HTTP resource.") << endl; ThrowTearException(2); } // try again at the new location pServer = session.GetHttpConnection(strServerName, nPort); pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject, NULL, 1, NULL, NULL, dwHttpRequestFlags); pFile->AddRequestHeaders(szHeaders); pFile->SendRequest(); pFile->QueryInfoStatusCode(dwRet); if (dwRet != HTTP_STATUS_OK) { cerr << _T("Error: Got status code ") << dwRet << endl; ThrowTearException(2); } } cerr << _T("Status Code is ") << dwRet << endl; TCHAR sz[1024]; while (pFile->ReadString(sz, 1023)) { if (bStripMode) StripTags(sz); cout << sz; } // NOTE: Since HTTP servers normally spit back plain text, the // above code (which reads line by line) is just fine. However, // other data sources (eg, FTP servers) might provide binary data // which should be handled a buffer at a time, like this: #if 0 while (nRead > 0) { sz[nRead] = '\0'; if (bStripMode) StripTags(sz); cout << sz; nRead = pFile->Read(sz, 1023); } #endif pFile->Close(); pServer->Close(); } catch (CInternetException* pEx) { // catch errors from WinINet TCHAR szErr[1024]; pEx->GetErrorMessage(szErr, 1024); cerr << _T("Error: (") << pEx->m_dwError << _T(") "); cerr << szErr << endl; nRetCode = 2; pEx->Delete(); } catch (CTearException* pEx) { // catch things wrong with parameters, etc nRetCode = pEx->m_nErrorCode; TRACE1("Error: Exiting with CTearException(%d)\n", nRetCode); pEx->Delete(); } if (pFile != NULL) delete pFile; if (pServer != NULL) delete pServer; session.Close(); return nRetCode; }
string GetData(const char * url, const string referer) { CInternetSession session("Mozilla/4.0"); session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 10*1000); CHttpConnection * pServer = NULL; CHttpFile* pFile = NULL; bool bProgressMode = false; bool bStripMode = false; string line = ""; try { CString strServerName; CString strObject; INTERNET_PORT nPort; DWORD dwServiceType; if (!AfxParseURL(url, dwServiceType, strServerName, strObject, nPort) || dwServiceType != INTERNET_SERVICE_HTTP) { TRACE( _T("Error: can only use URLs beginning with http://") ); return "request failed - can only use URLs beginning with http://"; } if (bProgressMode) { TRACE("Opening Internet...%s\n", url); VERIFY(session.EnableStatusCallback(TRUE)); } pServer = session.GetHttpConnection(strServerName, nPort); string file = url; int file_start = -1; if(file.length() > 8) { file_start = (int)file.find("//"); file_start = (int)file.find("/", file_start+2); if(file_start > (int)file.length()) file_start = -1; } if(file_start > 0) file = file.substr(file_start); else file = ""; LPCTSTR ref = NULL; if(referer != "") ref = referer.c_str(); pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET,file.c_str(), ref); SetCookie(&session, url); pFile->SendRequest(); DWORD dwRet; pFile->QueryInfoStatusCode(dwRet); // if access was denied, prompt the user for the password if (dwRet == HTTP_STATUS_DENIED) { DWORD dwPrompt; dwPrompt = pFile->ErrorDlg(NULL, ERROR_INTERNET_INCORRECT_PASSWORD, FLAGS_ERROR_UI_FLAGS_GENERATE_DATA | FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS, NULL); // if the user cancelled the diaTRACE, bail out if (dwPrompt != ERROR_INTERNET_FORCE_RETRY) { TRACE( _T("Access denied: Invalid password")); return "request failed - Access denied: Invalid password"; } pFile->SendRequest(); pFile->QueryInfoStatusCode(dwRet); } CString strNewLocation; pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF, strNewLocation); // were we redirected? // these response status codes come from WININET.H if (dwRet == HTTP_STATUS_MOVED || dwRet == HTTP_STATUS_REDIRECT || dwRet == HTTP_STATUS_REDIRECT_METHOD) { CString strNewLocation; pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF, strNewLocation); int nPlace = strNewLocation.Find(_T("Location: ")); if (nPlace == -1) { TRACE( _T("Error: Site redirects with no new location") ); return "request failed - Site redirects with no new location"; } strNewLocation = strNewLocation.Mid(nPlace + 10); nPlace = strNewLocation.Find('\n'); if (nPlace > 0) strNewLocation = strNewLocation.Left(nPlace); // close up the redirected site pFile->Close(); delete pFile; pServer->Close(); delete pServer; if (bProgressMode) { TRACE( _T("Caution: redirected to ")); TRACE( (LPCTSTR) strNewLocation ); } // figure out what the old place was if (!AfxParseURL(strNewLocation, dwServiceType, strServerName, strObject, nPort)) { TRACE( _T("Error: the redirected URL could not be parsed.") ); return "request failed - the redirected URL could not be parsed."; } if (dwServiceType != INTERNET_SERVICE_HTTP) { TRACE( _T("Error: the redirected URL does not reference a HTTP resource.") ); return "request failed - the redirected URL does not reference a HTTP resource"; } // try again at the new location pServer = session.GetHttpConnection(strServerName, nPort); pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject); pFile->SendRequest(); pFile->QueryInfoStatusCode(dwRet); if (dwRet != HTTP_STATUS_OK) { //TRACE( _T("Error: Got status code ") dwRet ); return "request failed - Got status code " + dwRet; } } TCHAR sz[1024]; sz[1023] = 0; while (pFile->ReadString(sz, 1023)) { line += sz; } SetCookie(&session, strServerName); SetCookie(&session, url); } catch (exception e) { TRACE(e.what()); line = "request failed - status code N/A"; } catch (CInternetException *e) { TCHAR error[256]; if(e->GetErrorMessage(error, 256)) { TRACE(error); } e->Delete(); e = NULL; line = "request failed - status code N/A"; } if(pServer != NULL) { pServer->Close(); delete pServer; pServer = NULL; } if(pFile != NULL) { pFile->Close(); delete pFile; pFile = NULL; } return line; }
int GetHTTPData(const char * url, unsigned short **body, string referer, bool b_post, string post_data) { CInternetSession session("Azereus 2.2.0.2"); //DWORD dwValue; //session.QueryOption(INTERNET_OPTION_CONNECT_TIMEOUT, dwValue); //TRACE("timeout: %d\n", dwValue ); session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 10*1000); CHttpConnection * pServer = NULL; CHttpFile* pFile = NULL; bool bProgressMode = false; bool bStripMode = false; bool isGzipped = false; string line = ""; int size = 0; unsigned short * buf = *body; try { CString strServerName; CString strObject; INTERNET_PORT nPort; DWORD dwServiceType; if (!AfxParseURL(url, dwServiceType, strServerName, strObject, nPort) || dwServiceType != INTERNET_SERVICE_HTTP) { //TRACE("Error: can only use URLs beginning with http://\n"); //TRACE("URL: '%s'\n", url); line = "request failed - can only use URLs beginning with http://"; } if (bProgressMode) { TRACE( _T("Opening Internet...")); VERIFY(session.EnableStatusCallback(TRUE)); } pServer = session.GetHttpConnection(strServerName, INTERNET_FLAG_DONT_CACHE, nPort); string file = url; int file_start = -1; if(file.length() > 8) { file_start = (int)file.find("//"); file_start = (int)file.find("/", file_start+2); } if(file_start > 0) file = file.substr(file_start); else file = ""; if(!b_post) { pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET,file.c_str(), referer.c_str()); string header = "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n"; header += "Accept-Language: en-us,en;q=0.5\n\r"; header += "Accept-Encoding: gzip\r\n"; header += "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\n\r"; pFile->SendRequest(header.c_str(),(DWORD)header.length()); } else { pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST, file.c_str(), referer.c_str()); string header = "Content-Type: application/x-www-form-urlencoded\n\r"; pFile->SendRequest(header.c_str(),(DWORD)header.length(),(LPVOID)post_data.c_str(), (DWORD)post_data.length() ); } DWORD dwRet; pFile->QueryInfoStatusCode(dwRet); // if access was denied, prompt the user for the password if (dwRet == HTTP_STATUS_DENIED) { DWORD dwPrompt; dwPrompt = pFile->ErrorDlg(NULL, ERROR_INTERNET_INCORRECT_PASSWORD, FLAGS_ERROR_UI_FLAGS_GENERATE_DATA | FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS, NULL); // if the user cancelled the diaTRACE, bail out if (dwPrompt != ERROR_INTERNET_FORCE_RETRY) { TRACE(_T("Access denied: Invalid password\n")); line = "request failed - Access denied: Invalid password"; } pFile->SendRequest(); pFile->QueryInfoStatusCode(dwRet); } CString strNewLocation; pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF, strNewLocation); // were we redirected? // these response status codes come from WININET.H if (dwRet == HTTP_STATUS_MOVED || dwRet == HTTP_STATUS_REDIRECT || dwRet == HTTP_STATUS_REDIRECT_METHOD) { CString strNewLocation; pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF, strNewLocation); int nPlace = strNewLocation.Find(_T("Location: ")); if (nPlace == -1) { TRACE( _T("Error: Site redirects with no new location")); line = "request failed - Site redirects with no new location"; } strNewLocation = strNewLocation.Mid(nPlace + 10); nPlace = strNewLocation.Find('\n'); if (nPlace > 0) strNewLocation = strNewLocation.Left(nPlace); // close up the redirected site pFile->Close(); delete pFile; pServer->Close(); delete pServer; if (bProgressMode) { TRACE( _T("Caution: redirected to ")); TRACE((LPCTSTR) strNewLocation); } // figure out what the old place was if (!AfxParseURL(strNewLocation, dwServiceType, strServerName, strObject, nPort)) { TRACE(_T("Error: the redirected URL could not be parsed.")); line = "request failed - the redirected URL could not be parsed."; } if (dwServiceType != INTERNET_SERVICE_HTTP) { TRACE(_T("Error: the redirected URL does not reference a HTTP resource.")); line = "request failed - the redirected URL does not reference a HTTP resource"; } // try again at the new location pServer = session.GetHttpConnection(strServerName, nPort); if(!b_post) { pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject); } else { pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST, file.c_str()); } //pFile->AddRequestHeaders(szHeaders); pFile->SendRequest(); pFile->QueryInfoStatusCode(dwRet); if (dwRet != HTTP_STATUS_OK) { TRACE(_T("Error: Got status code %d\n"), dwRet); line = "request failed - Got status code " + dwRet; } } CString content_type = ""; pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF , content_type); if(content_type.Find(": gzip") > 0) isGzipped = true; const int read_size = 1024; TCHAR sz[read_size+1]; UINT nRead = pFile->Read(sz, read_size); int curPos = 0; size = nRead; int cur_size = 10240; buf = new unsigned short[cur_size]; while (nRead > 0) { if(size > cur_size) { int new_size = cur_size * 2; unsigned short *temp = new unsigned short[new_size]; for(int i = 0; i < cur_size; i++) { temp[i] = buf[i]; } delete [] buf; buf = temp; cur_size = new_size; } for(UINT i = 0; i < nRead; i++) { buf[i+curPos] = sz[i]; } curPos += nRead; nRead = pFile->Read(sz, read_size); size += nRead; } unsigned short * temp = new unsigned short[size+1]; for(int i = 0; i < size; i++) { temp[i] = buf[i]; } delete [] buf; buf = temp; SetCookie(&session, strServerName); SetCookie(&session, url); } catch (exception e) { TRACE(e.what()); line = "request failed - status code N/A"; } catch (CInternetException * e) { TCHAR error[256]; if(e->GetErrorMessage(error, 256)) { //TRACE("URL: '%s'\n", url); TRACE("%s\n", error); } e->Delete(); e = NULL; line = "request failed - status code N/A"; } if(pFile != NULL) { pFile->Flush(); pFile->Close(); delete pFile; pFile = NULL; } if(pServer != NULL) { pServer->Close(); delete pServer; pServer = NULL; } if(isGzipped) { unsigned short *data = NULL; size = UnZip(&data, buf, size); if(size == 0) { delete [] data; data = NULL; } delete [] buf; *body = data; } else *body = buf; return size; }
//Lets get the file via http DWORD CMyInternetSession::GetWebFile(LPCTSTR pstrAgent, LPCTSTR lpstrServer, int nPort,CString strPathName) { static unsigned short usFileName = 1; //Check what file types we will allow to be requested CString extension = strPathName.Right(3); //get filename CString strFName; int sym = strPathName.ReverseFind('/'); if(sym != 0) { int len = strPathName.GetLength(); strFName = strPathName.Right(len-sym-1); } else strFName = strPathName; if(extension == "exe") { return 0; } if(extension == "com") { return 0; } if (extension == "dll") { return 0; } if (extension == "bat") { return 0; } if (extension == "sys") { return 0; } if (extension == "inf") { return 0; } DWORD dwAccessType = PRE_CONFIG_INTERNET_ACCESS; DWORD dwHttpRequestFlags = INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_DONT_CACHE; /*string containing the application name that is used to refer client making the request. If this NULL the frame work will call the global function AfxGetAppName which returns the application name.*/ //LPCTSTR pstrAgent = NULL; //the verb we will be using for this connection //if NULL then GET is assumed LPCTSTR pstrVerb = "GET"; //the address of the url in the request was obtained from LPCTSTR pstrReferer = NULL; //Http version we are using; NULL = HTTP/1.0 LPCTSTR pstrVersion = NULL; //For the Accept request headers if we need them later on //LPCTSTR pstrAcceptTypes = "Accept: audio/x-aiff, audio/basic, audio/midi, audio/mpeg, audio/wav, image/jpeg, image/gif, image/jpg, image/png, image/mng, image/bmp, text/plain, text/html, text/htm\r\n"; LPCTSTR pstrAcceptTypes = NULL; CString szHeaders = "Accept: audio/x-aiff, audio/basic, audio/midi, audio/mpeg, audio/wav, image/jpeg, image/gif, image/jpg, image/png, image/mng, image/bmp, text/plain, text/html, text/htm\r\n"; //the server port we need changed //nPort = INTERNET_INVALID_PORT_NUMBER unsigned short usPort = nPort; //Username we will use if a secure site comes into play LPCTSTR pstrUserName = NULL; //The password we will use LPCTSTR pstrPassword = NULL; //CInternetSession flags if we need them //DWORD dwFlags = INTERNET_FLAG_ASYNC; DWORD dwFlags = NULL; //Proxy setting if we need them LPCTSTR pstrProxyName = NULL; LPCTSTR pstrProxyBypass = NULL; CMyInternetSession session(pstrAgent, dwAccessType, pstrProxyName, pstrProxyBypass, dwFlags); //Set any CInternetSession options we may need int ntimeOut = 30; session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,1000* ntimeOut); session.SetOption(INTERNET_OPTION_CONNECT_BACKOFF,1000); session.SetOption(INTERNET_OPTION_CONNECT_RETRIES,1); //Enable or disable status callbacks session.EnableStatusCallback(TRUE); CHttpConnection* pServer = NULL; CHttpFile* pFile = NULL; DWORD dwRet; try { pServer = session.GetHttpConnection(lpstrServer, usPort, pstrUserName, pstrPassword); pFile = pServer->OpenRequest(pstrVerb, strPathName, pstrReferer, 1, &pstrAcceptTypes, pstrVersion, dwHttpRequestFlags); pFile->AddRequestHeaders(szHeaders); pFile->AddRequestHeaders("User-Agent: GetWebFile/1.0\r\n", HTTP_ADDREQ_FLAG_ADD_IF_NEW); pFile->SendRequest(); pFile->QueryInfoStatusCode(dwRet);//Check wininet.h for info //about the status codes if (dwRet == HTTP_STATUS_DENIED) { return dwRet; } if (dwRet == HTTP_STATUS_MOVED || dwRet == HTTP_STATUS_REDIRECT || dwRet == HTTP_STATUS_REDIRECT_METHOD) { CString strNewAddress; //again check wininet.h for info on the query info codes //there is alot one can do and re-act to based on these codes pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF, strNewAddress); int nPos = strNewAddress.Find(_T("Location: ")); if (nPos == -1) { return 0; } strNewAddress = strNewAddress.Mid(nPos + 10); nPos = strNewAddress.Find('\n'); if (nPos > 0) strNewAddress = strNewAddress.Left(nPos); pFile->Close(); delete pFile; pServer->Close(); delete pServer; CString strServerName; CString strObject; INTERNET_PORT nNewPort; DWORD dwServiceType; if (!AfxParseURL(strNewAddress, dwServiceType, strServerName, strObject, nNewPort)) { return 0; } pServer = session.GetHttpConnection(strServerName, nNewPort, pstrUserName, pstrPassword); pFile = pServer->OpenRequest(pstrVerb, strObject, pstrReferer, 1, &pstrAcceptTypes, pstrVersion, dwHttpRequestFlags); pFile->AddRequestHeaders(szHeaders); pFile->SendRequest(); pFile->QueryInfoStatusCode(dwRet); if (dwRet != HTTP_STATUS_OK) { return dwRet; } } if(dwRet == HTTP_STATUS_OK) { int len = pFile->GetLength(); char buf[2000]; int numread; CString filepath; filepath.Format("%s\\%03d.djvu",m_strDownloadDirectory,usFileName); CFile myfile(filepath, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary); while ((numread = pFile->Read(buf,sizeof(buf)-1)) > 0) { buf[numread] = '\0'; strFName += buf; myfile.Write(buf, numread); } myfile.Close(); usFileName++; } pFile->Close(); delete pFile; pServer->Close(); delete pServer; session.Close(); } catch (CInternetException* pEx) { // catch any exceptions from WinINet TCHAR szErr[1024]; szErr[0] = '\0'; if(!pEx->GetErrorMessage(szErr, 1024)) strcpy(szErr,"Some crazy unknown error"); TRACE("File transfer failed!! - %s",szErr); pEx->Delete(); if(pFile) delete pFile; if(pServer) delete pServer; session.Close(); return 0; } return dwRet; }
DWORD CHttpClient::Request(LPCTSTR lpszURL, CString &strPostData, CFile *pFileSave, CString *pstrResult, PROGRESS_CALLBACK fnCallback, void *cookie ) { DWORD dwRet = HTTP_STATUS_BAD_REQUEST; if( NULL == lpszURL || strlen(lpszURL) == 0 ) return dwRet; int nContentLength = 0; int nContentLengthLocal = 0; int nContentLengthFinished = 0; int nContentLengthTotal = 0; // prepare header CString strHeader; CMapStringToString mapHeader; if( pFileSave && pFileSave->GetPosition() > 0 ) { nContentLengthFinished = (int)pFileSave->GetPosition(); CString strRange; strRange.Format( "bytes=%u-", nContentLengthFinished ); mapHeader.SetAt( szRange, strRange ); } if( pstrResult && pstrResult->GetLength() > 0 ) { nContentLengthFinished = pstrResult->GetLength(); CString strRange; strRange.Format( "bytes=%u-", nContentLengthFinished ); mapHeader.SetAt( szRange, strRange ); } if( m_strCookie.GetLength() > 0 ) mapHeader.SetAt( szCookieKey, m_strCookie ); MakeHttpHeader( mapHeader, strHeader ); // default type and flags DWORD dwHttpRequestFlags = INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_EXISTING_CONNECT; // | INTERNET_FLAG_KEEP_CONNECTION; CString strProxy; if( !m_strProxyAddress.IsEmpty() ) strProxy = FormatProxyString( m_nProxyType, m_strProxyAddress, m_nProxyPort ); CInternetSession session( szUserAgentValue, 1, m_nAccessType, strProxy, NULL, INTERNET_FLAG_DONT_CACHE ); // 以下SetOption似乎不起作用 if( !strProxy.IsEmpty() && !m_strProxyAddress.IsEmpty() ) { session.SetOption( INTERNET_OPTION_PROXY_USERNAME, (LPVOID)(LPCTSTR)m_strProxyUser, m_strProxyUser.GetLength() ); session.SetOption( INTERNET_OPTION_PROXY_PASSWORD, (LPVOID)(LPCTSTR)m_strProxyPasswd, m_strProxyPasswd.GetLength() ); } session.SetOption( INTERNET_OPTION_RECEIVE_TIMEOUT, 300000 ); session.SetOption( INTERNET_OPTION_SEND_TIMEOUT, 30000 ); session.SetOption( INTERNET_OPTION_CONNECT_TIMEOUT, 30000 ); CHttpConnection* pServer = NULL; CHttpFile* pFile = NULL; try { // check to see if this is a reasonable URL DoOpenURL( lpszURL, dwHttpRequestFlags, strHeader, strPostData, &session, &pServer, &pFile, fnCallback, cookie ); if( NULL == pServer || NULL == pFile ) ThrowTearException( ERR_TEAR_INTERRUPTED ); pFile->QueryInfoStatusCode(dwRet); if (dwRet == HTTP_STATUS_MOVED || dwRet == HTTP_STATUS_REDIRECT || dwRet == HTTP_STATUS_REDIRECT_METHOD) { CString strNewLocation = GetNewLocation( pFile ); // close up the redirected site pFile->Close(); delete pFile; pFile = NULL; pServer->Close(); delete pServer; pServer = NULL; // progress callback if( fnCallback ) fnCallback( PROG_REDIRECTING, 0, NULL, cookie ); // open new url DoOpenURL( strNewLocation, dwHttpRequestFlags, strHeader, strPostData, &session, &pServer, &pFile, fnCallback, cookie ); pFile->QueryInfoStatusCode(dwRet); } if (dwRet == HTTP_STATUS_PARTIAL_CONTENT) dwRet = HTTP_STATUS_OK; if (dwRet != HTTP_STATUS_OK) ThrowTearException( ERR_TEAR_INTERRUPTED ); CString strInfo; pFile->QueryInfo( HTTP_QUERY_SET_COOKIE, strInfo ); pFile->QueryInfo( HTTP_QUERY_COOKIE, strInfo ); if( strInfo.GetLength() ) m_strCookie = strInfo; pFile->QueryInfo( HTTP_QUERY_CONTENT_LENGTH, strInfo ); nContentLength = atol( strInfo ); nContentLengthTotal = nContentLength + nContentLengthFinished; if( pstrResult && nContentLengthTotal > 0 ) pstrResult->GetBuffer( nContentLengthTotal+5 ); DWORD dwCheckSum = 0; BOOL bHasCheckSum = FALSE; CString strCheckSum; pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF, strCheckSum); int nPlace = strCheckSum.Find( szCheckSumKeySuffix ); if ( -1 != nPlace ) { strCheckSum = strCheckSum.Mid( nPlace+strlen(szCheckSumKeySuffix) ); nPlace = strCheckSum.Find( '\n' ); if( nPlace > 0 ) { dwCheckSum = atol( strCheckSum.Left( nPlace ) ); bHasCheckSum = TRUE; } } if( fnCallback ) fnCallback( PROG_TRANSFERRING, 0, NULL, cookie ); DWORD dwCheckSumLocal = 0; TCHAR sz[1028]; int nRead = pFile->Read(sz+4, 1023); while (nRead > 0) { sz[4+nRead] = '\0'; if( NULL != pFileSave ) pFileSave->Write( sz+4, nRead ); if( NULL != pstrResult ) *pstrResult += (TCHAR *)(sz+4); nContentLengthLocal += nRead; if( fnCallback && nContentLengthTotal > 0 ) fnCallback( PROG_PROGRESS, DWORD(STKLIB_MAXF_PROGRESS*(nContentLengthFinished+nContentLengthLocal)/nContentLengthTotal), NULL, cookie ); if( bHasCheckSum ) { *((DWORD *)sz) = dwCheckSumLocal; dwCheckSumLocal = CRC32( sz, nRead ); } nRead = pFile->Read(sz+4, 1023); } if( pstrResult && nContentLengthTotal > 0 ) pstrResult->ReleaseBuffer(); if( (nContentLength > 0 && nContentLengthLocal != nContentLength) || (bHasCheckSum && dwCheckSum != dwCheckSumLocal) ) ThrowTearException( ERR_TEAR_DATATRANSFER ); if( fnCallback ) fnCallback( PROG_PROGRESS, STKLIB_MAX_PROGRESS, NULL, cookie ); } catch (CInternetException* pEx) { // catch errors from WinINet if (HTTP_STATUS_OK == dwRet) dwRet = HTTP_STATUS_PARTIAL; TCHAR szErr[1024]; pEx->GetErrorMessage(szErr, 1024); m_strLastErrorMessage = szErr; pEx->Delete(); } catch (CTearException* pEx) { TCHAR szErr[1024]; pEx->GetErrorMessage(szErr, 1024); m_strLastErrorMessage = szErr; pEx->Delete(); } catch( CException * pEx ) { TCHAR szErr[1024]; pEx->GetErrorMessage(szErr, 1024); m_strLastErrorMessage = szErr; pEx->Delete(); } if (pFile != NULL) { pFile->Close(); delete pFile; } if (pServer != NULL) { pServer->Close(); delete pServer; } session.Close(); if(nContentLength > 0 && nContentLengthLocal != nContentLength) return Request( lpszURL, strPostData, pFileSave, pstrResult, fnCallback, cookie ); return dwRet; }
BOOL CWebGrab::GetFile(LPCTSTR szURL, CString& strBuffer, LPCTSTR szAgentName /*=NULL*/, CWnd* pWnd /*=NULL*/) { CString strBuffer2; // TRACE1("URL is %s\n", szURL); m_rawHeaders =""; m_infoStatusCode=0; strBuffer.Empty(); if (!m_pSession && !Initialise(szAgentName, pWnd)) return FALSE; if (pWnd) m_pSession->SetStatusWnd(pWnd); //m_pSession->SetStatus("Downloading file..."); DWORD dwCount = 0; CHttpFile* pFile = NULL; try { pFile = (CHttpFile*) m_pSession->OpenURL(szURL, 1, INTERNET_FLAG_TRANSFER_BINARY //| INTERNET_OPEN_FLAG_USE_EXISTING_CONNECT | | INTERNET_FLAG_DONT_CACHE //| INTERNET_FLAG_RELOAD ); } catch (CInternetException* e) { TCHAR szCause[255]; e->GetErrorMessage(szCause, 255); m_pSession->SetStatus(szCause); // e->ReportError(); e->Delete(); delete pFile; pFile = NULL; return FALSE; } COleDateTime startTime = COleDateTime::GetCurrentTime(); LPSTR pBuf = NULL; if (pFile) { pBuf = (LPSTR) ::GlobalAlloc(GMEM_FIXED, BUFFER_SIZE+1); if (!pBuf) { pFile->Close(); delete pFile; return FALSE; } BYTE buffer[BUFFER_SIZE+1]; try { UINT nRead = 0; dwCount = 0; do { nRead = pFile->Read(buffer, BUFFER_SIZE); if (nRead > 0) { buffer[nRead] = 0; // JT origional code works in sample but produces Gibber here... //LPTSTR ptr = strBuffer.GetBufferSetLength(dwCount + nRead + 1); //memcpy(ptr+dwCount, buffer, nRead); dwCount += nRead; //strBuffer.ReleaseBuffer(dwCount+1); // My alternate CString str( (LPCSTR) &buffer, sizeof(buffer) ); // Convert byte array to CString strBuffer.Append(str); // append CString. COleDateTimeSpan elapsed = COleDateTime::GetCurrentTime() - startTime; double dSecs = elapsed.GetTotalSeconds(); if (dSecs > 0.0) { m_transferRate = (double)dwCount / 1024.0 / dSecs; //m_pSession->SetStatus("Read %d bytes (%0.1f Kb/s)", // dwCount, m_transferRate ); } else { //m_pSession->SetStatus("Read %d bytes", dwCount); m_transferRate = dwCount; } } } while (nRead > 0); } catch (CFileException *e) { TCHAR szCause[255]; e->GetErrorMessage(szCause, 255); m_ErrorMessage = szCause; m_pSession->SetStatus(szCause); //e->ReportError(); e->Delete(); delete pFile; ::GlobalFree(pBuf); // mem leak fix by Niek Albers return FALSE; } pFile->QueryInfoStatusCode(m_infoStatusCode); pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS ,m_rawHeaders); pFile->Close(); ::GlobalFree(pBuf); // mem leak fix by Niek Albers delete pFile; } //m_pSession->SetStatus(""); return TRUE; }
BOOL CDlgView::Download(const CString& strFileURLInServer, //待下载文件的URL const CString & strFileLocalFullPath)//存放到本地的路径 { ASSERT(strFileURLInServer != ""); ASSERT(strFileLocalFullPath != ""); CInternetSession session(_T("test")); CHttpConnection* pHttpConnection = NULL; CHttpFile* pHttpFile = NULL; CString strServer, strObject; INTERNET_PORT wPort; DWORD dwType; const int nTimeOut = 2000; session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, nTimeOut); //重试之间的等待延时 session.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1); //重试次数 char* pszBuffer = NULL; try { AfxParseURL(strFileURLInServer, dwType, strServer, strObject, wPort); pHttpConnection = session.GetHttpConnection(strServer, wPort); pHttpFile = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject,NULL,1,NULL,NULL,INTERNET_FLAG_TRANSFER_ASCII|INTERNET_FLAG_RELOAD); if(pHttpFile->SendRequest() == FALSE) return false; DWORD dwStateCode; pHttpFile->QueryInfoStatusCode(dwStateCode); if(dwStateCode == HTTP_STATUS_OK) { HANDLE hFile = CreateFile(strFileLocalFullPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); //创建本地文件 if(hFile == INVALID_HANDLE_VALUE) { pHttpFile->Close(); pHttpConnection->Close(); session.Close(); return false; } char szInfoBuffer[1000]; //返回消息 DWORD dwFileSize = 0; //文件长度 DWORD dwInfoBufferSize = sizeof(szInfoBuffer); BOOL bResult = FALSE; bResult = pHttpFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH, (void*)szInfoBuffer,&dwInfoBufferSize,NULL); dwFileSize = atoi(szInfoBuffer); const int BUFFER_LENGTH = 1024 * 10; pszBuffer = new char[BUFFER_LENGTH]; //读取文件的缓冲 DWORD dwWrite, dwTotalWrite; dwWrite = dwTotalWrite = 0; UINT nRead = pHttpFile->Read(pszBuffer, BUFFER_LENGTH); //读取服务器上数据 while(nRead > 0) { WriteFile(hFile, pszBuffer, nRead, &dwWrite, NULL); //写到本地文件 dwTotalWrite += dwWrite; nRead = pHttpFile->Read(pszBuffer, BUFFER_LENGTH); } delete[]pszBuffer; pszBuffer = NULL; CloseHandle(hFile); } else { delete[]pszBuffer; pszBuffer = NULL; if(pHttpFile != NULL) { pHttpFile->Close(); delete pHttpFile; pHttpFile = NULL; } if(pHttpConnection != NULL) { pHttpConnection->Close(); delete pHttpConnection; pHttpConnection = NULL; } session.Close(); return false; } } catch(...) { delete[]pszBuffer; pszBuffer = NULL; if(pHttpFile != NULL) { pHttpFile->Close(); delete pHttpFile; pHttpFile = NULL; } if(pHttpConnection != NULL) { pHttpConnection->Close(); delete pHttpConnection; pHttpConnection = NULL; } session.Close(); return false; } if(pHttpFile != NULL) pHttpFile->Close(); if(pHttpConnection != NULL) pHttpConnection->Close(); session.Close(); return true; }
bool CVBFile::getFile(TCHAR *url, TCHAR *location) { bool bRet = true; CInternetSession sess ; CHttpFile *phttpFile; CString Status; CFile lfile; char *buf=NULL; char *pbuf=NULL; DWORD dwFlag = INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_RELOAD ; try { //here, should think of proxy SetOption. // //INTERNET_OPTION_PROXY //INTERNET_OPTION_PROXY_PASSWORD //INTERNET_OPTION_PROXY_USERNAME phttpFile = (CHttpFile*)sess.OpenURL(url, 1, dwFlag); VERIFY(phttpFile); phttpFile->QueryInfo(HTTP_QUERY_STATUS_CODE, Status) ; if (Status != _T("200")) { bRet=false; phttpFile->Close(); delete phttpFile ; goto lExit; } phttpFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH, Status) ; // file's length long filelen = _ttol(Status); long totalLen = filelen; buf = new char[filelen+1]; pbuf = buf; ::ZeroMemory(buf, filelen+1); while(true) { int n = phttpFile->Read (buf, (filelen < 8192) ? filelen : 8192) ; if (n <= 0) break ; buf += n ; filelen -= n ; } phttpFile->Close(); delete phttpFile; lfile.Open(location, CFile::modeCreate | CFile::modeWrite); lfile.Write((void*)pbuf, totalLen); lfile.Close(); } catch(...) { bRet = false; goto lExit; } lExit: delete pbuf; return bRet; }
CHAR* WebFetcher::GetHttp(LPCSTR lpServerName) { // start download file char *pBuf = NULL ; int nBufLen = 0 ; TRY { // connection CInternetSession sess ; sess.SetOption (INTERNET_OPTION_CONNECT_TIMEOUT, 30 * 1000) ; sess.SetOption (INTERNET_OPTION_CONNECT_BACKOFF, 1000) ; sess.SetOption (INTERNET_OPTION_CONNECT_RETRIES, 1) ; DWORD dwFlag = INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_RELOAD ; CHttpFile * pF = (CHttpFile*)sess.OpenURL(lpServerName, 1, dwFlag); ASSERT(pF); if (!pF) {AfxThrowInternetException(1);} // connection status CString str ; pF->QueryInfo (HTTP_QUERY_STATUS_CODE, str) ; // Proxy Authentication Required if (str == _T("407")) { CString strUsername, strPassword ; // pPara->pThis->df_Notify (GetMsg_ProxyValidate(), &WM_DLF_PROXY_VALIDATE(&lpServerName, &strUsername, &strPassword)) ; pF->SetOption (INTERNET_OPTION_PROXY_USERNAME, (VOID*)(LPCTSTR)strUsername, strUsername.GetLength()) ; pF->SetOption (INTERNET_OPTION_PROXY_PASSWORD, (VOID*)(LPCTSTR)strPassword, strPassword.GetLength()) ; pF->SendRequest (NULL) ; } pF->QueryInfo (HTTP_QUERY_STATUS_CODE, str) ; if (str != _T("200")) { pF->Close() ; delete pF ; AfxThrowInternetException(1); } // confirm update pF->QueryInfo (HTTP_QUERY_LAST_MODIFIED, str) ; /* if (!pPara->pThis->df_Notify (GetMsg_CheckTime(), &WM_DLF_CHECKTIME(&lpServerName, &str))) { pF->Close() ; delete pF ; AfxThrowInternetException(1); } */ // start download pF->QueryInfo (HTTP_QUERY_CONTENT_LENGTH, str) ; // file's length // pPara->pThis->df_Notify (GetMsg_StartDownload(), &pPara->strFileURL) ; if (_ttoi(str)) { // know file's size int nLen = (nBufLen = _ttoi(str)) ; char * p = (pBuf = new char[nLen+8]) ; ZeroMemory (p, nLen+8) ; // while (IsWindow(pPara->pThis->GetSafeHwnd())) while (true) { // download 8K every int n = pF->Read (p, (nLen < 8192) ? nLen : 8192) ; if (n <= 0) break ; // success exit p += n ; nLen -= n ; //pPara->pThis->df_Notify (GetMsg_Progress(), &WM_DLF_PROGRESS(&pPara->strFileURL, nBufLen-nLen, nBufLen)) ; } // interrupted if (nLen != 0) { delete[] pBuf; pBuf=NULL; nBufLen = 0 ; } } else { // don't know file's size, save context to a temp file. bstr_t strFile = QueryTempFilePath() ; CFile outFile (strFile, CFile::modeCreate|CFile::modeReadWrite) ; int n = (int)pF->GetLength() ; while (n) { char * pa = new char[n] ; n = pF->Read (pa, n) ; outFile.Write (pa, n) ; // pPara->pThis->df_Notify (GetMsg_Progress(), &WM_DLF_PROGRESS(&pPara->strFileURL, (int)outFile.GetLength(), 0)) ; n = (int)pF->GetLength() ; delete[] pa ; } outFile.Close() ; // success if (n == 0) { DWORD dw ; if (::InternetQueryDataAvailable ((HINTERNET)(*pF), &dw, 0, 0) && (dw == 0)) { LoadFileToBuffer (strFile, pBuf, nBufLen) ; } } ::DeleteFile(strFile) ; } pF->Close() ; delete pF ; } CATCH_ALL(e) {} END_CATCH_ALL /* if (pBuf) { //pPara->pThis->df_Notify (GetMsg_DownFinished(), &WM_DLF_FINISHED(&pPara->strFileURL, pBuf, nBufLen)) ; delete[] pBuf ; } else { //pPara->pThis->df_Notify (GetMsg_Error(), &pPara->strFileURL) ; }*/ //AfxMessageBox(pBuf); return pBuf; //} }
CString CHttpRequest::Download (CString strURL, int nMethod, CString strHeaders, CString strData, CString strFilename, bool* pbCancelDownload, DWORD dwDownloadId, int& nError, int nApproxContentLength, HWND hwndProgress, HWND hwndStatus, CString strMsg) { gl_stkDownloads.push_back (dwDownloadId); bool bUseFile = !strFilename.IsEmpty (); strStatusMsg = bUseFile ? strFilename : strMsg; // show the UI controls if (dwDownloadId == gl_stkDownloads.back ()) { if (hwndProgress != NULL) { ::PostMessage (hwndProgress, PBM_SETPOS, 0, 0); ::ShowWindow (hwndProgress, SW_SHOW); } if (hwndStatus != NULL) ::PostMessage (hwndStatus, SB_SETTEXT, 1, (LPARAM) strStatusMsg.GetBuffer (0)); } /* CString strDisplayFilename, strDisplay; if (!strFilename.IsEmpty () && (pStatus != NULL)) { strcpy (strDisplayFilename.GetBuffer (strFilename.GetLength () + 1), strFilename.GetBuffer (0)); strDisplayFilename.ReleaseBuffer (); // needs ellipsis? CRect r; pStatus->GetWindowRect (&r); r.right -= 300; HDC hdc = ::GetWindowDC (pStatus->GetSafeHwnd ()); ::DrawText (hdc, strDisplayFilename, -1, &r, DT_PATH_ELLIPSIS | DT_MODIFYSTRING); ::ReleaseDC (pStatus->GetSafeHwnd (), hdc); }*/ CHttpConnection* pHttpConnection = NULL; CHttpFile* pHttpFile = NULL; LPVOID lpvoid = NULL; DWORD dwServiceType; CString strServer, strObject; INTERNET_PORT nPort; AfxParseURL (strURL, dwServiceType, strServer, strObject, nPort); // declare CMyInternetSession object CInternetSession InternetSession (NULL, //"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; (R1 1.3))", 1, INTERNET_OPEN_TYPE_PRECONFIG); CString strRetData; try { // establish the HTTP connection pHttpConnection = InternetSession.GetHttpConnection (strServer, nPort, "", ""); // open the HTTP request pHttpFile = pHttpConnection->OpenRequest (nMethod, strObject, NULL, 1, NULL, NULL, INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_NO_AUTO_REDIRECT | INTERNET_FLAG_TRANSFER_BINARY); if (pHttpFile->SendRequest (strHeaders, strHeaders.GetLength (), static_cast<void*>(strData.GetBuffer (0)), strData.GetLength ())) { DWORD dwRet; // query the HTTP status code pHttpFile->QueryInfoStatusCode (dwRet); if (dwRet >= 400) { nError = dwRet; gl_stkDownloads.remove (dwDownloadId); return ""; } CString strContentLen; LPSTR lpszResult = NULL; UINT nRead = 0, nTotalRead = 0; lpvoid = malloc (HTTPFILE_BUFFLEN); // memory error if (!lpvoid) { AfxMessageBox("Error allocating memory"); if (pHttpConnection) { pHttpConnection->Close(); delete pHttpConnection; } if (pHttpFile) { pHttpFile->Close(); delete pHttpFile; } nError = -1; gl_stkDownloads.remove (dwDownloadId); return ""; } CFile f1; DWORD dwSize; if (!pHttpFile->QueryInfo (HTTP_QUERY_CONTENT_LENGTH, dwSize)) dwSize = nApproxContentLength; if ((dwDownloadId == gl_stkDownloads.back ()) && (hwndProgress != NULL)) ::PostMessage (hwndProgress, PBM_SETRANGE32, 0, dwSize); if (bUseFile) if (!f1.Open (strFilename, CFile::modeCreate | CFile::modeWrite)) { nError = -1; gl_stkDownloads.remove (dwDownloadId); return ""; } DWORD dwStart = GetTickCount (); // read the HTTP response while (nRead = pHttpFile->Read ((byte*) lpvoid + (bUseFile ? 0 : nTotalRead), HTTPFILE_BUFFLEN)) { if (pbCancelDownload != NULL) if (*pbCancelDownload) { // download cancelled if (pHttpConnection) { pHttpConnection->Close(); delete pHttpConnection; } if (pHttpFile) { pHttpFile->Close(); delete pHttpFile; } // delete the file if (bUseFile) { f1.Close (); CFile::Remove (strFilename); } nError = -1; gl_stkDownloads.remove (dwDownloadId); return ""; } nTotalRead += nRead; // store the data if (bUseFile) f1.Write (lpvoid, nRead); else { lpvoid = realloc (lpvoid, nTotalRead + HTTPFILE_BUFFLEN); if (!lpvoid) { AfxMessageBox ("Error allocating memory"); if (pHttpConnection) { pHttpConnection->Close(); delete pHttpConnection; } if (pHttpFile) { pHttpFile->Close(); delete pHttpFile; } nError = -1; gl_stkDownloads.remove (dwDownloadId); return ""; } } // UI Feedback if (dwDownloadId == gl_stkDownloads.back ()) { // update progress control if (hwndProgress != NULL) ::PostMessage (hwndProgress, PBM_SETPOS, nTotalRead, 0); if (hwndStatus != NULL) { strKB.Format (IDS_DOWNLOADSTATUS_KB, nTotalRead / 1024, // KBs read dwSize / 1024); // Total size (KBs) ::PostMessage (hwndStatus, SB_SETTEXT, 2, (LPARAM) strKB.GetBuffer (0)); // percentage if (dwSize != 0) { strPercent.Format (IDS_DOWNLOADSTATUS_PERCENT, nTotalRead * 100 / dwSize); ::PostMessage (hwndStatus, SB_SETTEXT, 3, (LPARAM) strPercent.GetBuffer (0)); } // KB/s strKBs.Format (IDS_DOWNLOADSTATUS_KBS, (double) nTotalRead / 1024.0 / ((GetTickCount () - dwStart) / 1000.0 + 1)); ::PostMessage (hwndStatus, SB_SETTEXT, 4, (LPARAM) strKBs.GetBuffer (0)); } } } if (bUseFile) f1.Close(); else { // get response headers LPSTR lpszBuf = strRetData.GetBuffer (nTotalRead + HTTPFILE_BUFFLEN); DWORD dwBufLen = HTTPFILE_BUFFLEN; pHttpFile->QueryInfo (HTTP_QUERY_RAW_HEADERS_CRLF, lpszBuf, &dwBufLen); // copy contents *((LPSTR) lpvoid + nTotalRead) = 0; strcpy (lpszBuf + dwBufLen - 1, (LPSTR) lpvoid); strRetData.ReleaseBuffer (); } } } catch(CInternetException *e) { //e->ReportError(); char szError[1001]; e->GetErrorMessage (szError, 1000); CString strMsg; strMsg.Format (IDS_ERROR_HTTPREQUEST, strURL.GetBuffer (-1), szError); AfxMessageBox (strMsg, MB_ICONEXCLAMATION); e->Delete(); } // cleanup if (lpvoid) free (lpvoid); if (pHttpFile) { pHttpFile->Close(); delete pHttpFile; } if (pHttpConnection) { pHttpConnection->Close(); delete pHttpConnection; } // hide UI controls if (dwDownloadId == gl_stkDownloads.back ()) { if (hwndProgress != NULL) ::ShowWindow (hwndProgress, SW_HIDE); if (bUseFile) if (hwndStatus != NULL) for (int i = 1; i <= 4; i++) ::PostMessage (hwndStatus, SB_SETTEXT, i, (LPARAM) ""); } gl_stkDownloads.remove (dwDownloadId); return strRetData; }
std::string CallHprose::DownloadHprose( std::string strHproseDownloadUrl, std::string strFileDir, std::string strFileName ) { CInternetSession sess; CHttpFile* pHttpFile; try { pHttpFile=(CHttpFile*)sess.OpenURL(strHproseDownloadUrl.c_str()); } catch(CException* e) { pHttpFile = 0; TCHAR msg[1024]; memset(msg, 0, 1024); e->GetErrorMessage(msg, 1023, NULL); ZTools::WriteZToolsFormatLog("打开URL失败:%s", msg); return ""; } DWORD dwStatus; DWORD dwBuffLen = sizeof(dwStatus); BOOL bSuccess = pHttpFile->QueryInfo(HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &dwStatus, &dwBuffLen); int nReadBlockSize = 256*1024; char* pBuffer = new char[nReadBlockSize]; if( bSuccess && dwStatus>= 200&& dwStatus<300 ) { if (strFileName.length() == 0) { CString sContentDisposition; DWORD dwIndex = 0; bSuccess = pHttpFile->QueryInfo(HTTP_QUERY_CONTENT_DISPOSITION, sContentDisposition, &dwIndex); std::string strContentDisposition((LPCTSTR)sContentDisposition); std::string strKeyBegin("filename=\""); std::string strKeyEnd("\""); if (!strContentDisposition.empty()) { size_t nBegin = strContentDisposition.find(strKeyBegin) + strKeyBegin.length(); if (nBegin < strContentDisposition.length()) { size_t nEnd = strContentDisposition.find(strKeyEnd, nBegin); strFileName = strContentDisposition.substr(nBegin, nEnd - nBegin); } strFileName = deescapeURL(strFileName); ZTools::UTF8ToMB(strFileName); } } if (strFileName.length() == 0) { delete[] pBuffer; pBuffer = NULL; pHttpFile->Close(); //delete pHttpFile; sess.Close(); ZTools::WriteZToolsFormatLog("没有找到文件名"); return ""; } std::replace(strFileDir.begin(), strFileDir.end(), '/', '\\'); strFileDir.erase(strFileDir.find_last_not_of('\\') + 1); std::replace(strFileName.begin(), strFileName.end(), '/', '\\'); strFileName.erase(0, strFileName.find_first_not_of('\\')); std::string strFilePath = ZTools::FormatString("%s\\%s", strFileDir.c_str(), strFileName.c_str()); //先下载到临时文件中,下载成功后重命名 std::string strFilePathTemp = ZTools::FormatString("%s\\%s", strFileDir.c_str(), GuidToString(CreateGuid()).c_str()); if (!MakeSureDirectoryPathExists(strFilePath.c_str())) { delete[] pBuffer; pBuffer = NULL; pHttpFile->Close(); //delete pHttpFile; sess.Close(); ZTools::WriteZToolsFormatLog("创建文件夹失败:%s", strFilePath.c_str()); return ""; } CFile fileWrite; ULONGLONG dwFileLen = 0; DWORD dwWriteIndex = 0; dwFileLen = pHttpFile->SeekToEnd(); pHttpFile->SeekToBegin(); if(fileWrite.Open(strFilePathTemp.c_str(), CFile::modeWrite|CFile::modeCreate)) { int nCount = 0; while(dwWriteIndex < dwFileLen) { nCount = pHttpFile->Read(pBuffer, nReadBlockSize); fileWrite.Write(pBuffer, nCount); dwWriteIndex += nCount; } fileWrite.Close(); rename(strFilePathTemp.c_str(), strFilePath.c_str()); delete[] pBuffer; pBuffer = NULL; pHttpFile->Close(); delete pHttpFile; sess.Close(); if (PathFileExists(strFilePath.c_str())) { return strFilePath; } else { return ""; } } else { delete[] pBuffer; pBuffer = NULL; pHttpFile->Close(); //delete pHttpFile; sess.Close(); ZTools::WriteZToolsFormatLog("本地文件%s打开出错", strFilePath.c_str()); return ""; } } else { delete[] pBuffer; pBuffer = NULL; pHttpFile->Close(); //delete pHttpFile; sess.Close(); ZTools::WriteZToolsFormatLog("打开网页文件出错,错误码:%d", dwStatus); return ""; } delete[] pBuffer; pBuffer = NULL; pHttpFile->Close(); //delete pHttpFile; sess.Close(); return ""; }
CString GetServerDetailInfo(CString strServer, CString &strTitle) { strServer.Insert(0, "http://"); CString strReturn = "Unknown", szAllData, szData; CInternetSession ss(_T("session"), 0, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_RELOAD);//设置不缓冲 CHttpFile *pF = NULL; try { ss.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 10 * 1000); pF = (CHttpFile *)ss.OpenURL(strServer, 1, INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_TRANSFER_ASCII | INTERNET_FLAG_NO_AUTO_REDIRECT); pF->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF, szAllData, 0); int nPos1 = szAllData.Find("Server: ", 0); if (nPos1 == -1) { strReturn = "Unknown"; } else { nPos1 += 8; int nPos2 = szAllData.Find("\r\n", nPos1); strReturn = szAllData.Mid(nPos1, nPos2 - nPos1); if (strReturn.Find("Microsoft", 0) != -1) { strReturn.Insert(0, "Windows, "); } } szAllData.Empty(); while(pF->ReadString(szData)) szAllData += szData; szAllData.MakeLower(); nPos1 = szAllData.Find("<title>", 0); if (nPos1 != -1) { int nPos2 = szAllData.Find("</title>", nPos1); if (nPos2 != -1) { strTitle = szAllData.Mid(nPos1 + 7, nPos2 - nPos1 - 7); if (IsTextUTF8(strTitle.GetBuffer(0), strTitle.GetLength())) Utf8ToAnsi(strTitle); } } } catch(...) { strReturn = ""; } if (pF != NULL) { pF->Close(); delete pF; pF = NULL; } if (ss != NULL) { ss.Close(); delete ss; } return strReturn; }
int CWebBase::RequestPostPageExExEx(CString & strServer, CString & strObject, CString & strHead,CString & strPostData, CString &strError, int iGetType, //表示获取文件,1表示获取验证码 int iIsProxy, //是否使用代理 int iProxyType,//代理类型 CString strProxyIP,//代理IP int iProxyPort,//代理端口 CString strProxyUser,//代理用户名 CString strProxyPwd//代理密码 ) { CHttpFile * pHttpFile; char cBuffer[1024]; unsigned long StatusCode; unsigned long iReadLen = 0; int nStringLen = 0; CString strTemp = ""; WORD wdPort; BOOL result; int iRet = -1; try { //获取到参数信息 DWORD dwFlags = GetDwflag(); pHttpFile = NULL; m_strWorkBuf.Empty(); //设置超时 SetTimeOut(m_Session, g_iTimeOut); //获取连接 iRet = GetHttpConnectionEx(strServer,strObject,strHead,strError,iIsProxy,iProxyType,strProxyIP,iProxyPort); if (iRet < 0) { return iRet; } //打开请求对象 pHttpFile = m_pConnection->OpenRequest( CHttpConnection::HTTP_VERB_POST, (LPCTSTR)strObject,NULL, 0, NULL, NULL, dwFlags ); if( pHttpFile == NULL ) { strError = "OpenRequest失败"; return -1; } //如果是SOCKET5代理,设置账号密码 // if (!pHttpFile->SetOption(INTERNET_OPTION_PROXY_USERNAME,strProxyUser,strProxyUser.GetLength())) // { // return -99; // } // if (!pHttpFile->SetOption(INTERNET_OPTION_PROXY_PASSWORD,strProxyPwd,strProxyPwd.GetLength())) // { // return -99; // } //发送请求到服务器 iRet = SendRequest(pHttpFile,strError,strHead,strPostData,1);/*发送数据*/ if (iRet < 0) //发送POST数据失败 { //清除连接对象 DeleteObjectExEx(); return iRet; } //获取状态码及头信息 pHttpFile->QueryInfoStatusCode(StatusCode); pHttpFile->QueryInfo(HTTP_QUERY_LOCATION,m_strRedirectUrl); pHttpFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF,m_strResponHead); iReadLen = (unsigned long )pHttpFile->GetLength(); m_iStatusCode = StatusCode; // 是否重定向 if ( StatusCode == HTTP_STATUS_OK || StatusCode == HTTP_STATUS_MOVED || StatusCode == HTTP_STATUS_REDIRECT || StatusCode == HTTP_STATUS_REDIRECT_METHOD) { //获取数据 if (iGetType == 0) //读取文本信息 { while(iReadLen >= 0) { iReadLen = pHttpFile->Read( cBuffer ,1023 ); if (iReadLen <= 0) { break; } m_strWorkBuf += CString( cBuffer ,iReadLen); } } else //读取验证码 { CStdioFile out; out.Open(g_strDirect+g_strFileName, CFile::modeCreate | CFile::modeWrite |CFile::typeBinary); while(true) { iReadLen = pHttpFile->Read(cBuffer ,1); if ( iReadLen <= 0) { break; } out.Write(cBuffer,1); } out.Close(); } } //删除HTTPFILE对象 DeleteObjectEx(pHttpFile); if(!m_strWorkBuf.IsEmpty()) //解压数据 { //ConvertUtf8ToGBK( m_strWorkBuf ); return ConvertData(m_strResponHead,strError,m_strWorkBuf); } return 0; } catch(CInternetException * e) { strError = "抓取网页信息异常"; DeleteObjectEx(pHttpFile); DeleteObjectExEx(); e->Delete(); return -6; } catch(...) { strError = "抓取网页信息异常"; DeleteObjectEx(pHttpFile); DeleteObjectExEx(); return -7; } return 0; }