18,356
社区成员
发帖
与我相关
我的任务
分享
struct __FCAutoInitializeCOM
{
__FCAutoInitializeCOM() {CoInitialize(0);}
~__FCAutoInitializeCOM() {CoUninitialize();}
};
// encapsuled download thread.
DWORD JetWebService::httpGet(CString url,char *ret)
{
__FCAutoInitializeCOM _aAutoCOM ;
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(url, 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 ;
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) ;
// start download
pF->QueryInfo (HTTP_QUERY_CONTENT_LENGTH, str) ; // file's length
if (_ttoi(str))
{
// know file's size
int nLen = (nBufLen = _ttoi(str)) ;
char * p = (pBuf = new char[nLen+8]) ;
ZeroMemory (p, nLen+8) ;
// download 8K every
int n = pF->Read (p, (nLen < 8192) ? nLen : 8192) ;
p += n ; nLen -= n ;
// interrupted
if (nLen != 0)
{
delete[] pBuf; pBuf=NULL;
nBufLen = 0 ;
}
}
pF->Close() ;
delete pF ;
}
CATCH_ALL(e) {}
END_CATCH_ALL
if (pBuf)
{
memcpy(ret,pBuf,strlen(pBuf));
delete[] pBuf ;
}
return 0 ;
}