2024-12-21 10:04:04 +08:00
///////////////////////////////////////////////////////////////////
// INCLUDE
///////////////////////////////////////////////////////////////////
# include "STDAFX.H"
# include "HTTPCLIENT.H"
# include "COMMONMACROS.H"
# include "BASESET.H"
# include "DEBUGUTIL.H"
# include "SAFESTRINGMACROS.H"
# include "../NetworkLib/Log.h"
# ifdef _DEBUG
# define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
# endif
///////////////////////////////////////////////////////////////////
// IMPLEMENTATION
///////////////////////////////////////////////////////////////////
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CHttpClient::CHttpClient
//*---------------------------------------------------------------
// DESC : <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
CHttpClient : : CHttpClient ( )
{
Initialize ( ) ;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CHttpClient::~CHttpClient
//*---------------------------------------------------------------
// DESC : <20> Ҹ<EFBFBD> <D2B8> <EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
CHttpClient : : ~ CHttpClient ( )
{
Finalize ( ) ;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CHttpClient::Initialize
//*---------------------------------------------------------------
// DESC : <20> <> ü <20> <> <EFBFBD> <EFBFBD> <20> ڿ<EFBFBD> <DABF> <EFBFBD> <EFBFBD> <EFBFBD> <20> ʱ<EFBFBD> ȭ
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
VOID CHttpClient : : Initialize ( )
{
m_hInternet = NULL ;
m_hInternetConnection = NULL ;
m_hHttpRequest = NULL ;
m_eHttpConnectionMode = EV_HTTP_CONNECTION_NONE ;
m_wHttpServerPortNumber = DF_DEFAULT_HTTP_PORTNUMBER ;
: : memset ( m_szHttpServerAddress , 0 , sizeof ( m_szHttpServerAddress ) ) ;
: : memset ( m_szUserName , 0 , sizeof ( m_szUserName ) ) ;
: : memset ( m_szPassword , 0 , sizeof ( m_szPassword ) ) ;
m_RefCount = 0 ;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CHttpClient::Finalize
//*---------------------------------------------------------------
// DESC : <20> <> ü <20> <> <EFBFBD> <EFBFBD> <20> ڿ<EFBFBD> <DABF> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
VOID CHttpClient : : Finalize ( )
{
Close ( ) ;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CHttpClient::Open
//*---------------------------------------------------------------
// DESC : HTTP <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> / One-Req,One-Rsp <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> URL<52> ڿ<EFBFBD> <DABF> <EFBFBD> <20> ٷ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
// PARM : 1 . lpszHttpServerAddressUrl - One-Req,One-Rsp : HTTP <20> ڿ<EFBFBD> <DABF> <EFBFBD> <20> <> ü URL / Keep-Alive : HTTP <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> ּ<EFBFBD> (<28> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ̸<EFBFBD> (http:// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ), <20> <> 10<31> <30> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> )
// 2 . eHttpConnectionMode - EV_HTTP_CONNECTION_ONEREQONERSP : One-Req,One-Rsp <20> <> <EFBFBD> <EFBFBD> (<28> ⺻<EFBFBD> <E2BABB> ) / EV_HTTP_CONNECTION_KEEPALIVE : Keep-Alive <20> <> <EFBFBD> <EFBFBD>
// 3 . wHttpServerPortNumber - (Keep-Alive <20> <> <EFBFBD> 常 <20> <> <EFBFBD> <EFBFBD> ) HTTP <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> Ʈ<EFBFBD> <C6AE> ȣ (<28> ⺻<EFBFBD> <E2BABB> 80)
// 4 . lpszUserName - (Keep-Alive <20> <> <EFBFBD> 常 <20> <> <EFBFBD> <EFBFBD> ) HTTP <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> (<28> ⺻<EFBFBD> <E2BABB> NULL)
// 5 . lpszPassword - (Keep-Alive <20> <> <EFBFBD> 常 <20> <> <EFBFBD> <EFBFBD> ) HTTP <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> й<EFBFBD> ȣ (<28> ⺻<EFBFBD> <E2BABB> NULL)
// RETV : TRUE - <20> <> <EFBFBD> <EFBFBD> / FALSE - <20> <> <EFBFBD> <EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
BOOL CHttpClient : : Open (
LPCTSTR lpszHttpServerAddressUrl ,
EF_HTTP_CONNECTION_TYPE eHttpConnectionMode ,
INTERNET_PORT wHttpServerPortNumber ,
LPCTSTR lpszUserName ,
LPCTSTR lpszPassword
)
{
// DN_ASSERT(!IsOpen(), "Invalid!");
if ( lpszHttpServerAddressUrl = = NULL | | ! _tcscmp ( lpszHttpServerAddressUrl , _T ( " " ) ) ) {
// DN_TRACE(_T("lpszHttpServerAddressUrl == NULL || !_tcscmp(lpszHttpServerAddressUrl, _T(\"\")) - CHttpClient::Open()\n"));
return FALSE ;
}
if ( IsOpen ( ) ) {
Close ( ) ;
}
switch ( eHttpConnectionMode ) {
case EV_HTTP_CONNECTION_ONEREQONERSP : // One-Req,One-Rsp <20> <> <20> <> <EFBFBD> <EFBFBD>
{
m_hInternet = : : InternetOpen ( _T ( " Microsoft Internet Explorer " ) , INTERNET_OPEN_TYPE_DIRECT , NULL , NULL , NULL ) ;
if ( m_hInternet = = NULL ) {
// DN_TRACE(_T("::InternetOpen() == NULL : %d - CHttpClient::Open()\n"), GetLastError());
return FALSE ;
}
m_hInternetConnection = : : InternetOpenUrl ( m_hInternet , lpszHttpServerAddressUrl , NULL , 0 , INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_NO_CACHE_WRITE , 0 ) ;
if ( m_hInternetConnection = = NULL ) {
: : InternetCloseHandle ( m_hInternet ) ;
m_hInternet = NULL ;
// DN_TRACE(_T("::InternetOpenUrl() == NULL : %d - CHttpClient::Open()\n"), GetLastError());
return FALSE ;
}
/*
DWORD dwNumberOfBytesAvailable = 0 ;
DWORD dwSize = sizeof ( dwNumberOfBytesAvailable ) ;
DWORD dwStatus = 0 ;
if ( : : HttpQueryInfo ( m_hInternetConnection , HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER , & dwNumberOfBytesAvailable , & dwSize , & dwStatus ) = = FALSE
| | dwNumberOfBytesAvailable = = 0 )
{
// DN_TRACE(_T("dwNumberOfBytesAvailable : %u - CHttpClient::Open()\n"), dwNumberOfBytesAvailable);
return FALSE ;
}
*/
m_eHttpConnectionMode = EV_HTTP_CONNECTION_ONEREQONERSP ;
}
return TRUE ;
case EV_HTTP_CONNECTION_KEEPALIVE : // Keep-Alive <20> <> <20> <> <EFBFBD> <EFBFBD>
{
// STRNCPY(m_szHttpServerAddress, lpszHttpServerAddressUrl, COUNT_OF(m_szHttpServerAddress));
_tcsncpy_s ( m_szHttpServerAddress , lpszHttpServerAddressUrl , _countof ( m_szHttpServerAddress ) ) ;
// _tcsncpy(m_szHttpServerAddress, lpszHttpServerAddressUrl, COUNT_OF(m_szHttpServerAddress));
m_wHttpServerPortNumber = wHttpServerPortNumber ;
if ( lpszUserName = = NULL ) {
m_szUserName [ 0 ] = _T ( ' \0 ' ) ;
}
else {
// STRNCPY(m_szUserName, lpszUserName, COUNT_OF(m_szUserName));
_tcsncpy_s ( m_szUserName , lpszUserName , _countof ( m_szUserName ) ) ;
// _tcsncpy(m_szUserName, lpszUserName, COUNT_OF(m_szUserName));
}
if ( lpszPassword = = NULL ) {
m_szPassword [ 0 ] = _T ( ' \0 ' ) ;
}
else {
// STRNCPY(m_szPassword, lpszPassword, COUNT_OF(m_szPassword));
_tcsncpy_s ( m_szPassword , lpszPassword , _countof ( m_szPassword ) ) ;
// _tcsncpy(m_szPassword, lpszPassword, COUNT_OF(m_szPassword));
}
m_hInternet = : : InternetOpen ( _T ( " Microsoft Internet Explorer " ) , INTERNET_OPEN_TYPE_PRECONFIG , NULL , NULL , NULL ) ;
if ( m_hInternet = = NULL ) {
// DN_TRACE(_T("::InternetOpen() == NULL : %d - CHttpClient::Open()\n"), GetLastError());
return FALSE ;
}
m_hInternetConnection = : : InternetConnect (
m_hInternet ,
m_szHttpServerAddress ,
m_wHttpServerPortNumber
, m_szUserName , m_szPassword , INTERNET_SERVICE_HTTP , 0 , 0 ) ;
if ( m_hInternetConnection = = NULL ) {
// DN_TRACE(_T("::InternetConnect() == NULL : %d - CHttpClient::Open()\n"), GetLastError());
return FALSE ;
}
m_eHttpConnectionMode = EV_HTTP_CONNECTION_KEEPALIVE ;
}
return TRUE ;
default : // <20> <> <EFBFBD> <EFBFBD>
{
m_eHttpConnectionMode = EV_HTTP_CONNECTION_NONE ;
// DN_TRACE(_T("Unknown Http Connection Type : %d - CHttpClient::Open()\n"), eHttpConnectionMode);
}
break ;
}
return FALSE ;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CHttpClient::IsOpen
//*---------------------------------------------------------------
// DESC : HTTP <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> Ǿ<EFBFBD> <20> ִ<EFBFBD> <D6B4> <EFBFBD> Ȯ<> <C8AE>
// PARM : N/A
// RETV : TRUE - <20> <> <EFBFBD> <EFBFBD> / FALSE - <20> <> <EFBFBD> <EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
BOOL CHttpClient : : IsOpen ( )
{
if ( ( m_hInternet = = NULL ) | |
( ( m_eHttpConnectionMode ! = EV_HTTP_CONNECTION_ONEREQONERSP ) & & ( m_eHttpConnectionMode ! = EV_HTTP_CONNECTION_KEEPALIVE ) )
)
{
return FALSE ;
}
return TRUE ;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CHttpClient::Close
//*---------------------------------------------------------------
// DESC : HTTP <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> , <20> ڿ<EFBFBD> <20> <> <EFBFBD> <EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
VOID CHttpClient : : Close ( )
{
if ( m_hHttpRequest ) {
: : InternetCloseHandle ( m_hHttpRequest ) ;
m_hHttpRequest = NULL ;
}
if ( m_hInternetConnection ) {
: : InternetCloseHandle ( m_hInternetConnection ) ;
m_hInternetConnection = NULL ;
}
if ( m_hInternet ) {
: : InternetCloseHandle ( m_hInternet ) ;
m_hInternet = NULL ;
}
m_eHttpConnectionMode = EV_HTTP_CONNECTION_NONE ;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CHttpClient::Close
//*---------------------------------------------------------------
// DESC : (Keep-Alive <20> <> <EFBFBD> 常 <20> <> <EFBFBD> <EFBFBD> ) HTTP <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
// PARM : N/A
// RETV : TRUE - <20> <> <EFBFBD> <EFBFBD> / FALSE - <20> <> <EFBFBD> <EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
BOOL CHttpClient : : ReOpen ( )
{
// DN_ASSERT(IsOpen(), "Invalid!");
// DN_ASSERT(EV_HTTP_CONNECTION_KEEPALIVE == m_eHttpConnectionMode, "Invalid!");
// DN_ASSERT(_tcscmp(m_szHttpServerAddress, _T("")), "Invalid!");
if ( ! IsOpen ( ) | |
EV_HTTP_CONNECTION_KEEPALIVE ! = m_eHttpConnectionMode | |
! _tcscmp ( m_szHttpServerAddress , _T ( " " ) )
)
{
g_Log . Log ( LogType : : _ERROR , L " IsOpen() : %d / m_eHttpConnectionMode : %d / m_szHttpServerAddress : %s - CHttpClient::Open() \n " , IsOpen ( ) , m_eHttpConnectionMode , m_szHttpServerAddress ) ;
// DN_TRACE(_T("IsOpen() : %d / m_eHttpConnectionMode : %d / m_szHttpServerAddress : %s - CHttpClient::Open()\n"), IsOpen(), m_eHttpConnectionMode, m_szHttpServerAddress);
// DN_RETURN(FALSE);
return FALSE ;
}
Close ( ) ;
return Open ( m_szHttpServerAddress , EV_HTTP_CONNECTION_KEEPALIVE , m_wHttpServerPortNumber , m_szUserName , m_szPassword ) ;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CHttpClient::SendRequest
//*---------------------------------------------------------------
// DESC : HTTP <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> ġ<EFBFBD> <C4A1> <20> ڿ<EFBFBD> <DABF> <EFBFBD> <20> <> û (Keep-Alive <20> <> <EFBFBD> 常 <20> <> <EFBFBD> <EFBFBD> )
// PARM : 1 . lpszUrl - HTTP<54> <50> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> ڿ<EFBFBD> <DABF> <EFBFBD> ġ<EFBFBD> <C4A1> <20> <> Ÿ<EFBFBD> <C5B8> <EFBFBD> <EFBFBD> URL
// 2 . bCheckResultDataLength - <20> <> û <20> <> <EFBFBD> <EFBFBD> <20> <> <20> ڿ<EFBFBD> <DABF> <EFBFBD> <20> <> <EFBFBD> ̸<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD>
// 3 . bAsyncRequest -
// RETV : 0 <20> ̸<EFBFBD> : <20> <> <EFBFBD> <EFBFBD> / 0 <20> ̻<EFBFBD> : <20> <> <EFBFBD> <EFBFBD> , bCheckResultDataLength == TRUE <20> ̰<EFBFBD> 0 <20> ̻<EFBFBD> <CCBB> <EFBFBD> <20> <> <EFBFBD> ̸<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> ڿ<EFBFBD> <DABF> <EFBFBD> ũ<> <C5A9>
// PRGM : B4nFter
//*---------------------------------------------------------------
INT CHttpClient : : SendRequest ( LPCTSTR lpszUrl , BOOL bCheckResultDataLength , BOOL bAsyncRequest )
{
// DN_ASSERT(IsOpen(), "Invalid!");
// DN_ASSERT(NULL != lpszUrl, "Invalid!");
DWORD dwNumberOfBytesAvailable = 0 ;
if ( lpszUrl = = NULL | | ! _tcscmp ( lpszUrl , _T ( " " ) ) ) {
// DN_TRACE(_T("lpszUrl == NULL || !_tcscmp(lpszUrl, _T(\"\")) - CHttpClient::SendRequest()"));
return - 1 ;
}
if ( IsOpen ( ) = = FALSE & & ReOpen ( ) = = FALSE ) {
// DN_TRACE(_T("IsOpen() == FALSE && ReOpen() == FALSE"));
return - 1 ;
}
if ( m_hHttpRequest ) {
: : InternetCloseHandle ( m_hHttpRequest ) ;
m_hHttpRequest = NULL ;
}
m_hHttpRequest = : : HttpOpenRequest ( m_hInternetConnection , _T ( " GET " ) , lpszUrl , _T ( " HTTP/1.1 " ) , NULL , NULL ,
INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_KEEP_CONNECTION
| INTERNET_FLAG_DONT_CACHE
| INTERNET_FLAG_NO_AUTH
| INTERNET_FLAG_PRAGMA_NOCACHE
| INTERNET_FLAG_NO_COOKIES ,
0
) ;
if ( m_hHttpRequest = = NULL ) {
// DN_TRACE(_T("::HttpOpenRequest() == NULL : %d - CHttpClient::SendRequest()"), GetLastError());
return - 1 ;
}
BOOL bRetVal ;
if ( ! bAsyncRequest ) {
bRetVal = : : HttpSendRequest ( m_hHttpRequest , NULL , 0 , NULL , 0 ) ;
}
else {
bRetVal = : : HttpSendRequestEx ( m_hHttpRequest , NULL , NULL , HSR_ASYNC , 0 ) ;
}
if ( bRetVal = = FALSE ) {
: : InternetCloseHandle ( m_hHttpRequest ) ;
m_hHttpRequest = NULL ;
// DN_TRACE(_T("::HttpSendRequest() == FALSE : %d, m_eHttpConnectionMode : %d - CHttpClient::RecvResponse()\n"), GetLastError(), m_eHttpConnectionMode);
return - 1 ;
}
if ( bCheckResultDataLength ) {
DWORD dwSize = sizeof ( dwNumberOfBytesAvailable ) ;
DWORD dwStatus = 0 ;
if ( : : HttpQueryInfo ( m_hHttpRequest , HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER , & dwNumberOfBytesAvailable , & dwSize , & dwStatus ) = = FALSE
| | dwNumberOfBytesAvailable = = 0 )
{
: : InternetCloseHandle ( m_hHttpRequest ) ;
m_hHttpRequest = NULL ;
return - 1 ;
}
}
return ( INT ) dwNumberOfBytesAvailable ;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CHttpClient::SendRequest
//*---------------------------------------------------------------
// DESC : HTTP <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> ġ<EFBFBD> <C4A1> <20> ڿ<EFBFBD> <DABF> <EFBFBD> <20> <> û (Keep-Alive <20> <> <EFBFBD> 常 <20> <> <EFBFBD> <EFBFBD> )
// PARM : 1 . lpszUrl - HTTP<54> <50> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> ڿ<EFBFBD> <DABF> <EFBFBD> ġ<EFBFBD> <C4A1> <20> <> Ÿ<EFBFBD> <C5B8> <EFBFBD> <EFBFBD> URL
// 2 . szPostData - PostData
// RETV : 0 <20> ̸<EFBFBD> : <20> <> <EFBFBD> <EFBFBD> / 0 <20> ̻<EFBFBD> : <20> <> <EFBFBD> <EFBFBD> , bCheckResultDataLength == TRUE <20> ̰<EFBFBD> 0 <20> ̻<EFBFBD> <CCBB> <EFBFBD> <20> <> <EFBFBD> ̸<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> ڿ<EFBFBD> <DABF> <EFBFBD> ũ<> <C5A9>
// PRGM : B4nFter
//*---------------------------------------------------------------
INT CHttpClient : : SendRequsetPostA ( LPCTSTR lpszUrl , LPCSTR szPostData )
{
if ( lpszUrl = = NULL | | ! _tcscmp ( lpszUrl , _T ( " " ) ) ) {
return - 1 ;
}
if ( IsOpen ( ) = = FALSE & & ReOpen ( ) = = FALSE ) {
return - 1 ;
}
if ( m_hHttpRequest ) {
: : InternetCloseHandle ( m_hHttpRequest ) ;
m_hHttpRequest = NULL ;
}
m_hHttpRequest = : : HttpOpenRequest ( m_hInternetConnection , _T ( " POST " ) , lpszUrl , _T ( " HTTP/1.1 " ) , NULL , NULL ,
INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_KEEP_CONNECTION
| INTERNET_FLAG_DONT_CACHE
| INTERNET_FLAG_NO_AUTH
| INTERNET_FLAG_PRAGMA_NOCACHE
| INTERNET_FLAG_NO_COOKIES ,
0
) ;
if ( m_hHttpRequest = = NULL ) {
return - 1 ;
}
int nPostLength = 0 , nHeaderLength = 0 ;
char * strHeader = NULL ;
if ( szPostData )
{
strHeader = " Content-Type: application/x-www-form-urlencoded " ;
nPostLength = ( int ) strlen ( szPostData ) ;
nHeaderLength = ( int ) strlen ( strHeader ) ;
}
BOOL bRetVal = : : HttpSendRequestA ( m_hHttpRequest , strHeader , nHeaderLength , ( LPVOID ) szPostData , nPostLength ) ;
if ( bRetVal = = FALSE ) {
: : InternetCloseHandle ( m_hHttpRequest ) ;
m_hHttpRequest = NULL ;
// DN_TRACE(_T("::HttpSendRequest() == FALSE : %d, m_eHttpConnectionMode : %d - CHttpClient::RecvResponse()\n"), GetLastError(), m_eHttpConnectionMode);
return - 1 ;
}
INT nStatus = 0 ;
DWORD dwBuffSize = sizeof ( INT ) ;
if ( : : HttpQueryInfo (
m_hHttpRequest
, HTTP_QUERY_STATUS_CODE // Get the HTTP status code
| HTTP_QUERY_FLAG_NUMBER
, static_cast < void * > ( & nStatus )
, & dwBuffSize // Buffer size (byte)
, NULL // Does not use a header index
) = = FALSE )
{
return - 1 ;
}
return nStatus ;
}
INT CHttpClient : : SendRequestGet ( LPCTSTR lpszUrl )
{
DWORD dwNumberOfBytesAvailable = 0 ;
if ( lpszUrl = = NULL | | ! _tcscmp ( lpszUrl , _T ( " " ) ) ) {
// DN_TRACE(_T("lpszUrl == NULL || !_tcscmp(lpszUrl, _T(\"\")) - CHttpClient::SendRequest()"));
return - 1 ;
}
if ( IsOpen ( ) = = FALSE & & ReOpen ( ) = = FALSE ) {
// DN_TRACE(_T("IsOpen() == FALSE && ReOpen() == FALSE"));
return - 1 ;
}
if ( m_hHttpRequest ) {
: : InternetCloseHandle ( m_hHttpRequest ) ;
m_hHttpRequest = NULL ;
}
m_hHttpRequest = : : HttpOpenRequest ( m_hInternetConnection , _T ( " GET " ) , lpszUrl , _T ( " HTTP/1.1 " ) , NULL , NULL ,
INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_KEEP_CONNECTION
| INTERNET_FLAG_DONT_CACHE
//| INTERNET_FLAG_NO_AUTH
| INTERNET_FLAG_PRAGMA_NOCACHE
| INTERNET_FLAG_NO_COOKIES ,
0
) ;
if ( m_hHttpRequest = = NULL ) {
// DN_TRACE(_T("::HttpOpenRequest() == NULL : %d - CHttpClient::SendRequest()"), GetLastError());
return - 1 ;
}
BOOL bRetVal = : : HttpSendRequest ( m_hHttpRequest , NULL , 0 , NULL , 0 ) ;
if ( bRetVal = = FALSE ) {
: : InternetCloseHandle ( m_hHttpRequest ) ;
m_hHttpRequest = NULL ;
// DN_TRACE(_T("::HttpSendRequest() == FALSE : %d, m_eHttpConnectionMode : %d - CHttpClient::RecvResponse()\n"), GetLastError(), m_eHttpConnectionMode);
return - 1 ;
}
INT nStatus = 0 ;
DWORD dwBuffSize = sizeof ( INT ) ;
if ( : : HttpQueryInfo (
m_hHttpRequest
, HTTP_QUERY_STATUS_CODE // Get the HTTP status code
| HTTP_QUERY_FLAG_NUMBER
, static_cast < void * > ( & nStatus )
, & dwBuffSize // Buffer size (byte)
, NULL // Does not use a header index
) = = FALSE )
{
return - 1 ;
}
return nStatus ;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CHttpClient::RecvResponse
//*---------------------------------------------------------------
// DESC : HTTP <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> ڿ<EFBFBD> <DABF> <EFBFBD> û <20> <> <EFBFBD> <EFBFBD> <20> <> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> (One-Req,One-Rsp : Open() <20> <> <EFBFBD> <EFBFBD> / Keep-Alive : SendRequest() <20> <> <EFBFBD> <EFBFBD> )
// PARM : 1 . lpbtBuffer - <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
// 2 . uBufferSize - <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ũ<> <C5A9>
// RETV : 0 <20> ̸<EFBFBD> : <20> <> <EFBFBD> <EFBFBD> / 0 : <20> <> <EFBFBD> <EFBFBD> , <20> <> <EFBFBD> ſ Ϸ<C5BF> / 0 <20> ʰ<EFBFBD> : <20> <> <EFBFBD> <EFBFBD> , <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
INT CHttpClient : : RecvResponse ( LPBYTE lpbtBuffer , INT nBufferSize )
{
// DN_ASSERT(IsOpen(), "Invalid!");
// DN_ASSERT(NULL != lpbtBuffer, "Invalid!");
// DN_ASSERT(0 < uBufferSize, "Invalid!");
if ( lpbtBuffer = = NULL | | nBufferSize = = 0 ) {
// DN_TRACE(_T("lpbtBuffer == NULL || uBufferSize == 0 - CHttpClient::RecvResponse()\n"));
return - 1 ;
}
if ( ! IsOpen ( ) ) {
// DN_TRACE(_T("!IsOpen() - CHttpClient::RecvResponse()\n"));
return - 1 ;
}
HINTERNET hInternetFile = NULL ;
switch ( m_eHttpConnectionMode ) {
case EV_HTTP_CONNECTION_ONEREQONERSP : // One-Req,One-Rsp <20> <> <20> <> <EFBFBD> <EFBFBD>
{
hInternetFile = m_hInternetConnection ;
}
break ;
case EV_HTTP_CONNECTION_KEEPALIVE : // Keep-Alive <20> <> <20> <> <EFBFBD> <EFBFBD>
{
hInternetFile = m_hHttpRequest ;
}
break ;
default : // <20> <> <EFBFBD> <EFBFBD>
{
// DN_TRACE(_T("Unknown Http Connection Type : %d - CHttpClient::RecvResponse()\n"), m_eHttpConnectionMode);
}
return - 1 ;
}
if ( hInternetFile = = NULL ) {
// DN_TRACE(_T("hInternetFile == NULL - CHttpClient::RecvResponse()\n"));
return - 1 ;
}
DWORD dwNumberOfBytesAvailable , dwIoBytes , dwBufferOffset ;
dwNumberOfBytesAvailable = dwIoBytes = dwBufferOffset = 0 ;
BOOL bRetVal = : : InternetQueryDataAvailable ( hInternetFile , & dwNumberOfBytesAvailable , 0 , 0 ) ;
if ( bRetVal = = FALSE ) {
g_Log . Log ( LogType : : _ERROR , L " ::InternetQueryDataAvailable() : %d - CHttpClient::RecvResponse() \n " , GetLastError ( ) ) ;
// DN_TRACE(_T("::InternetQueryDataAvailable() : %d - CHttpClient::RecvResponse()\n"), GetLastError());
return - 1 ;
}
int nCount = 0 ;
while ( dwNumberOfBytesAvailable > 0 ) {
if ( nBufferSize - dwBufferOffset < dwNumberOfBytesAvailable )
{
if ( nBufferSize = = dwBufferOffset )
{
// <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> ..
g_Log . Log ( LogType : : _ERROR , L " Buffer Empty!! nBufferSize:%d, dwBufferOffset:%u, dwNumberOfBytesAvailable:%u \n " , nBufferSize , dwBufferOffset , dwNumberOfBytesAvailable ) ;
return 1 ;
}
// <20> <> <EFBFBD> ۰ <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ϸ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ۿ<EFBFBD> <20> °<EFBFBD> <20> <> <EFBFBD> <EFBFBD> ũ<> ⸦ <20> ٽ<EFBFBD> <20> <> <EFBFBD> <EFBFBD>
dwNumberOfBytesAvailable = nBufferSize - dwBufferOffset ;
g_Log . Log ( LogType : : _ERROR , L " (nBufferSize:%d - dwBufferOffset:%u) < dwNumberOfBytesAvailable:%u - CHttpClient::RecvResponse() \n " , nBufferSize , dwBufferOffset , dwNumberOfBytesAvailable ) ;
// DN_TRACE(_T("((INT)uBufferSize - (INT)dwBufferOffset) < (INT)dwNumberOfBytesAvailable - CHttpClient::RecvResponse()\n"));
}
if ( ( INT ) dwNumberOfBytesAvailable < = 0 ) {
// <20> <> <EFBFBD> ۺ<EFBFBD> <DBBA> <EFBFBD> - <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> ƴϰ<C6B4> <20> <> <EFBFBD> ۸<EFBFBD> <20> <> Ȯ<> <C8AE> <EFBFBD> ϶<EFBFBD> <CFB6> <EFBFBD> <20> ǹ<EFBFBD>
// DN_TRACE(_T("(INT)dwNumberOfBytesAvailable <= 0 - CHttpClient::RecvResponse()\n"));
return 1 ;
}
bRetVal = : : InternetReadFile ( hInternetFile , lpbtBuffer + dwBufferOffset , dwNumberOfBytesAvailable , & dwIoBytes ) ;
if ( bRetVal = = FALSE ) {
// DN_TRACE(_T("::InternetReadFile() == FALSE : %d - CHttpClient::RecvResponse()\n"), GetLastError());
return - 1 ;
}
dwBufferOffset + = dwIoBytes ;
bRetVal = : : InternetQueryDataAvailable ( hInternetFile , & dwNumberOfBytesAvailable , 0 , 0 ) ;
if ( bRetVal = = FALSE ) {
// DN_TRACE(_T("::InternetQueryDataAvailable() == FALSE : %d - CHttpClient::RecvResponse()\n"), GetLastError());
return - 1 ;
}
+ + nCount ;
if ( nCount > 20 )
{
// <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ..
g_Log . Log ( LogType : : _ERROR , L " RecvResponse Loof nBufferSize:%d, dwBufferOffset:%u, dwNumberOfBytesAvailable:%u \n " , nBufferSize , dwBufferOffset , dwNumberOfBytesAvailable ) ;
Close ( ) ;
return 1 ;
}
}
if ( dwNumberOfBytesAvailable = = 0 ) {
// <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD>
return 0 ;
}
// <20> <> <20> <> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> - <20> ̷<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ȯ<> <C8AE> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ƾ<EFBFBD> <20> <>
return - 1 ;
}
INT CHttpClient : : RecvDownFile ( LPCTSTR lpszFileName , LPBINDSTATUSCALLBACK pCallBack )
{
FILE * downfile = NULL ;
downfile = _tfopen ( lpszFileName , _T ( " w+b " ) ) ;
if ( ! IsOpen ( ) ) {
fclose ( downfile ) ;
return - 1 ;
}
HINTERNET hInternetFile = NULL ;
switch ( m_eHttpConnectionMode ) {
case EV_HTTP_CONNECTION_ONEREQONERSP : // One-Req,One-Rsp <20> <> <20> <> <EFBFBD> <EFBFBD>
{
hInternetFile = m_hInternetConnection ;
}
break ;
case EV_HTTP_CONNECTION_KEEPALIVE : // Keep-Alive <20> <> <20> <> <EFBFBD> <EFBFBD>
{
hInternetFile = m_hHttpRequest ;
}
break ;
default : // <20> <> <EFBFBD> <EFBFBD>
{
// DN_TRACE(_T("Unknown Http Connection Type : %d - CHttpClient::RecvResponse()\n"), m_eHttpConnectionMode);
}
return - 1 ;
}
if ( hInternetFile = = NULL ) {
fclose ( downfile ) ;
return - 1 ;
}
DWORD dwNumberOfBytesAvailable , dwTotalBytes , dwIoBytes , dwCurTotalBytes ;
dwNumberOfBytesAvailable = dwTotalBytes = dwIoBytes = dwCurTotalBytes = 0 ;
DWORD dwBufLen = sizeof ( dwTotalBytes ) ;
BOOL bRetVal = : : HttpQueryInfo ( hInternetFile , HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER , ( LPVOID ) & dwTotalBytes , & dwBufLen , 0 ) ;
// BOOL bRetVal = ::InternetQueryDataAvailable(hInternetFile, &dwNumberOfBytesAvailable, 0, 0);
if ( bRetVal = = FALSE ) {
fclose ( downfile ) ;
return - 1 ;
}
char buf [ 1024 * 10 ] = { 0 , } ;
dwNumberOfBytesAvailable = dwTotalBytes ;
while ( dwNumberOfBytesAvailable > 0 )
{
bRetVal = : : InternetReadFile ( hInternetFile , buf , sizeof ( buf ) , & dwIoBytes ) ;
if ( bRetVal = = FALSE ) {
fclose ( downfile ) ;
return - 1 ;
}
fwrite ( buf , 1 , dwIoBytes , downfile ) ;
dwCurTotalBytes + = dwIoBytes ;
if ( pCallBack )
pCallBack - > OnProgress ( dwCurTotalBytes , dwTotalBytes , BINDSTATUS_DOWNLOADINGDATA , NULL ) ;
bRetVal = : : InternetQueryDataAvailable ( hInternetFile , & dwNumberOfBytesAvailable , 0 , 0 ) ;
if ( bRetVal = = FALSE ) {
fclose ( downfile ) ;
return - 1 ;
}
}
if ( dwNumberOfBytesAvailable = = 0 ) {
// <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD>
if ( pCallBack )
pCallBack - > OnProgress ( dwTotalBytes , dwTotalBytes , BINDSTATUS_ENDDOWNLOADDATA , NULL ) ;
fclose ( downfile ) ;
return 0 ;
}
return - 1 ;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CHttpClient::SetOption
//*---------------------------------------------------------------
// DESC : HTTP <20> <> <EFBFBD> ǿ<EFBFBD> <20> ʿ<EFBFBD> <CABF> <EFBFBD> <20> <> <EFBFBD> ͳ<EFBFBD> <20> ɼǵ<C9BC> <C7B5> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> (wininet.lib <20> <> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ϴ<EFBFBD> <20> <> <EFBFBD> 츸 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ϰ<EFBFBD> winhttp.lib <20> <> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ϴ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> Ұ<EFBFBD> )
// PARM : 1 . dwMaxConnCount - HTTP <20> <> û<EFBFBD> <C3BB> <20> ִ밳<D6B4> <EBB0B3> <20> <> <EFBFBD> <EFBFBD>
// 2 . dwTimout - HTTP <20> <> û<EFBFBD> <C3BB> Ÿ<> Ӿƿ<D3BE>
// RETV : 0 <20> ̸<EFBFBD> : <20> <> <EFBFBD> <EFBFBD> / 0 : <20> <> <EFBFBD> <EFBFBD> , <20> <> <EFBFBD> ſ Ϸ<C5BF> / 0 <20> ʰ<EFBFBD> : <20> <> <EFBFBD> <EFBFBD> , <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
DWORD CHttpClient : : SetOption ( DWORD dwMaxConnCount , DWORD dwTimout )
{
// DN_ASSERT(0 < dwMaxConnCount, "Invalid!");
// DN_ASSERT((1*1000) < dwTimout, "1<> <31> <EFBFBD> ̳<EFBFBD> <CCB3> <EFBFBD> <20> ۽<EFBFBD> <DBBD> <EFBFBD> <20> Ϸ<EFBFBD> <CFB7> Ǿ<EFBFBD> <20> ϴ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> ´ °<C2B4> ?");
// HTTP <20> Ծ <20> <> <EFBFBD> ؼ<EFBFBD> HTTP<54> <50> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ÿ<EFBFBD> <20> <> û<EFBFBD> <C3BB> <20> <> <20> ִ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> (1.0:4<> <34> , 1.1:2<> <32> )
// <20> ̰<EFBFBD> <CCB0> <EFBFBD> <20> ʰ<EFBFBD> <CAB0> ؼ<EFBFBD> <20> <> û <20> <> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> block <20> <>
// P.S.> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> INFO: WinInet Limits Connections Per Server (Q183110)
DWORD dwArgVal = dwMaxConnCount ;
if ( FALSE = = : : InternetSetOption ( NULL , INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER , & dwArgVal , sizeof ( dwArgVal ) ) )
{
// DN_RETURN(::GetLastError());
return ( : : GetLastError ( ) ) ;
}
dwArgVal = dwMaxConnCount ;
if ( FALSE = = : : InternetSetOption ( NULL , INTERNET_OPTION_MAX_CONNS_PER_SERVER , & dwArgVal , sizeof ( dwArgVal ) ) )
{
// DN_RETURN(::GetLastError());
return ( : : GetLastError ( ) ) ;
}
dwArgVal = dwTimout ;
if ( FALSE = = : : InternetSetOption ( NULL , INTERNET_OPTION_SEND_TIMEOUT , & dwArgVal , sizeof ( dwArgVal ) ) )
{
// DN_RETURN(::GetLastError());
return ( : : GetLastError ( ) ) ;
}
dwArgVal = dwTimout ;
if ( FALSE = = : : InternetSetOption ( NULL , INTERNET_OPTION_RECEIVE_TIMEOUT , & dwArgVal , sizeof ( dwArgVal ) ) )
{
// DN_RETURN(::GetLastError());
return ( : : GetLastError ( ) ) ;
}
// Windows Server 2003 x64 (<28> <> Ȯ<EFBFBD> <C8AE> <EFBFBD> <EFBFBD> Requires Internet Explorer 7.0.) <20> <> <EFBFBD> ʹ <EFBFBD> IDN<44> <4E> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ϴµ<CFB4> , MBCS<43> <53> <20> <> <EFBFBD> <EFBFBD>
// <20> <EFBFBD> <D7B7> <EFBFBD> IDN<44> <4E> off<66> <66> Ű<EFBFBD> <C5B0> system code page<67> <65> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ؼ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD>
// Windows XP SP2 and Windows Server 2003 SP1 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD>
/*
dwArgVal = 0 ;
if ( FALSE = = : : InternetSetOption ( NULL , INTERNET_OPTION_IDN , & dwArgVal , sizeof ( dwArgVal ) ) )
{
dwArgVal = : : GetLastError ( ) ;
if ( ERROR_CALL_NOT_IMPLEMENTED ! = dwArgVal )
{
// DN_RETURN(dwArgVal);
return dwArgVal ;
}
}
*/
return ( NOERROR ) ;
}