Leaked source code of windows server 2003
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

#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;
}