You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
184 lines
4.8 KiB
184 lines
4.8 KiB
#include <windows.h>
|
|
#include <stdlib.h>
|
|
#include <assert.h>
|
|
#include <memory.h>
|
|
#include <wininet.h>
|
|
#include "unicode.h"
|
|
|
|
|
|
BYTE * HTTPGet(const WCHAR * wszURL, DWORD * pcbReceiveBuff) {
|
|
|
|
HINTERNET hIOpen = NULL;
|
|
HINTERNET hIConnect = NULL;
|
|
HINTERNET hIHttp = NULL;
|
|
BYTE * pbRecBuf = NULL;
|
|
char * szPartURL = NULL;
|
|
char szBuff[1024];
|
|
char szLong[16];
|
|
char szDomanName[_MAX_PATH];
|
|
char szPort[12];
|
|
char * pch;
|
|
DWORD cch;
|
|
DWORD dwService = INTERNET_SERVICE_HTTP;
|
|
char * pchT;
|
|
DWORD cbBuff, cbBuffRead, cbBuffT;
|
|
DWORD dwPort = INTERNET_INVALID_PORT_NUMBER;
|
|
char * szURL = NULL;
|
|
|
|
|
|
assert(wszURL != NULL);
|
|
assert(pcbReceiveBuff != NULL);
|
|
|
|
*pcbReceiveBuff = 0;
|
|
|
|
// figure out the protocol
|
|
if( !MkMBStr(NULL, 0, wszURL, &szURL)) {
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
goto ErrorReturn;
|
|
}
|
|
|
|
//
|
|
// DSIE: Fix bug 112117
|
|
//
|
|
if (NULL == szURL) {
|
|
return NULL;
|
|
}
|
|
|
|
cch = strlen(szURL);
|
|
if(cch >= 7 && _strnicmp(szURL, "http://", 7) == 0) {
|
|
dwService = INTERNET_SERVICE_HTTP;
|
|
pch = (char *) &szURL[7];
|
|
|
|
} else if(cch >= 6 && _strnicmp(szURL, "ftp://", 6) == 0) {
|
|
dwService = INTERNET_SERVICE_FTP ;
|
|
pch = (char *) &szURL[6];
|
|
|
|
} else {
|
|
dwService = INTERNET_SERVICE_HTTP;
|
|
pch = (char *) &szURL[0];
|
|
}
|
|
|
|
// if none of the above, assump http;
|
|
|
|
// copy the Doman Name
|
|
pchT = szDomanName;
|
|
while(*pch != '/' && *pch != ':' && *pch != 0)
|
|
*pchT++ = *pch++;
|
|
*pchT = 0;
|
|
|
|
// parse out the port number
|
|
szPort[0] = 0;
|
|
if(*pch == ':') {
|
|
pchT = szPort;
|
|
pch++; // get past the :
|
|
while(*pch != '/' && *pch != 0)
|
|
*pchT++ = *pch++;
|
|
*pchT = 0;
|
|
}
|
|
|
|
// Get port #, zero is INTERNET_INVALID_PORT_NUMBER
|
|
if(szPort[0] != 0)
|
|
dwPort = atol(szPort);
|
|
|
|
// save away what to look up.
|
|
if(NULL == (szPartURL = (char *) malloc(sizeof(char) * (strlen(pch) + 1)))) {
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
goto ErrorReturn;
|
|
}
|
|
|
|
strcpy(szPartURL, pch);
|
|
|
|
// INTERNET_OPENLYPE_DIRECT,
|
|
if( (hIOpen = InternetOpenA( "Transport",
|
|
INTERNET_OPEN_TYPE_PRECONFIG,
|
|
NULL,
|
|
NULL,
|
|
0)) == NULL ||
|
|
|
|
(hIConnect = InternetConnectA(hIOpen,
|
|
szDomanName,
|
|
(INTERNET_PORT) dwPort,
|
|
NULL,
|
|
NULL,
|
|
dwService,
|
|
0,
|
|
0)) == NULL ) {
|
|
goto ErrorReturn;
|
|
}
|
|
|
|
// If this is a GET, do a dummy send
|
|
if( ((hIHttp = HttpOpenRequestA(hIConnect,
|
|
"GET",
|
|
szPartURL,
|
|
HTTP_VERSION,
|
|
NULL,
|
|
NULL,
|
|
INTERNET_FLAG_DONT_CACHE,
|
|
0)) == NULL ||
|
|
HttpSendRequestA(hIHttp, "Accept: */*\r\n", (DWORD) -1, NULL, 0) == FALSE) ) {
|
|
goto ErrorReturn;
|
|
}
|
|
|
|
cbBuff = sizeof(szBuff);
|
|
if(HttpQueryInfoA( hIHttp,
|
|
HTTP_QUERY_CONTENT_TYPE,
|
|
szBuff,
|
|
&cbBuff,
|
|
NULL) == FALSE)
|
|
goto ErrorReturn;
|
|
|
|
assert(cbBuff > 0);
|
|
|
|
// now get the length of the buffer returned
|
|
cbBuff = sizeof(szLong);
|
|
if(HttpQueryInfo( hIHttp,
|
|
HTTP_QUERY_CONTENT_LENGTH,
|
|
szLong,
|
|
&cbBuff,
|
|
NULL) == FALSE)
|
|
goto ErrorReturn;
|
|
|
|
assert(cbBuff > 0);
|
|
// always appears to be in ascii
|
|
cbBuff = atol(szLong);
|
|
|
|
// allocate a buffer
|
|
if( (pbRecBuf = (BYTE *) malloc(cbBuff)) == NULL ) {
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
goto ErrorReturn;
|
|
}
|
|
|
|
// read the data
|
|
cbBuffRead = 0;
|
|
while(cbBuffRead < cbBuff) {
|
|
cbBuffT = 0;
|
|
if(InternetReadFile(hIHttp, &pbRecBuf[cbBuffRead], (cbBuff - cbBuffRead), &cbBuffT) == FALSE )
|
|
goto ErrorReturn;
|
|
cbBuffRead += cbBuffT;
|
|
}
|
|
|
|
// close out the handle
|
|
InternetCloseHandle(hIHttp);
|
|
hIHttp = NULL;
|
|
|
|
// pass back the info
|
|
*pcbReceiveBuff = cbBuff;
|
|
|
|
CommonReturn:
|
|
|
|
if(szPartURL != NULL)
|
|
free(szPartURL);
|
|
|
|
if(szURL != NULL)
|
|
FreeMBStr(NULL, szURL);
|
|
|
|
return(pbRecBuf);
|
|
|
|
ErrorReturn:
|
|
|
|
if(pbRecBuf != NULL)
|
|
free(pbRecBuf);
|
|
pbRecBuf = NULL;
|
|
|
|
goto CommonReturn;
|
|
}
|