Send Http Request
A.First Edition
This is a small tool to send http request to a web server.
Probably it is too common for many programmers. However, it is still a fresh try for me to send http request.
1. wininet is not fully implemented in win2k. (DC says it is not part of OS, instead wininet is just a part of internet explorer and I need to upgrade to ie6 sp2. However, I cannot find upgrade for sp2 for win2k.)
2. HttpSendRequest will fail and give error 12007 which means unresolved url. This is because you have to use either pure "hostname" or decimal format of ip address in previous call of InternetConnect. When I say "pure" host name, I mean you don't add "theme string" like "http" or "ftp" and you don't include relative path. Not even a slash "/" after your host name, i.e. "www.google.com".
3. When HttpSendRequest returns true, it only means the request is sent successfully. And in many cases, you still need response http headers from server which is my case. You need call httpqueryinfo. The message is stored in a series of string separated by CRLF or in c/c++ _T('\r') _T('\n');
4. Usually the http request is in a format of "/url?paraname1=value1¶name2=value2¶name3=value3". In plain English, it means the target object, usually the script or cgi object followed by a "?" which indicates a series parameters separated by "&".
5. Compiling is always a little problem because you need platform sdk, like http.h, winsock2.h
C.Further improvement
//compilation tips: It needs platformsdk2003. You need to setup your directory of
//platformsdk BEFORE original vc6 directory. i.e. "tools\options\directory\include"
//must have "platformsdk\include" before "vc98\include"
#include "baseTsd.h"
#include "winsock2.h"
#include <windows.h>
#include "http.h"
#include <stdio.h>
#include <TCHAR.H>
//#include "Windns.h"
#include <wininet.h>
//#pragma comment(lib, "Ws2_32.lib")
//#pragma comment(lib, "Dnsapi.lib")
#pragma comment(lib, "Wininet.lib")
enum EnumSessionItem
{
EnumSerial, EnumBrand, EnumModel, EnumProvider, EnumProviderKey, EnumAction, EnumTime
};
const int SessionItemCount = 7;
const int MaxSessionItemLength = 64;
LPCTSTR SessionItemName[SessionItemCount] =
{
_T("serial"), _T("brand"), _T("model"), _T("provider"), _T("providerkey"), _T("action"), _T("time")
};
LPCTSTR SessionItemValue[SessionItemCount] =
{
_T("EmuNick"), _T("GLO.ng"), _T("datawind.uk"), _T("PDA_SERVER"), _T("PREPAID_UPDATE"), _T("update"), _T("1000")
};
struct SessionInfo
{
TCHAR sessionItem[SessionItemCount][MaxSessionItemLength];
};
#if 0
void packRequest(SessionInfo& sessionInfo, LPTSTR requestBuffer)
{
int len = 0;
for (int i = 0; i < SessionItemCount; i ++)
{
_stpintf(requestBuffer + len, _T("&%s=%s"), SessionItemName[i], sessionInfo.sessionItem[i]);
len = _tcslen(requestBuffer);
}
}
#else
bool packRequest(LPTSTR requestBuffer, DWORD requestBufferLength)
{
DWORD len = 0;
_sntprintf(requestBuffer, requestBufferLength, _T("%s=%s"), SessionItemName[0], SessionItemValue[0]);
for (int i = 1; i < SessionItemCount; i ++)
{
if ((len = _tcslen(requestBuffer)) >= requestBufferLength)
{
return false;
}
_sntprintf(requestBuffer + len, requestBufferLength - len, _T("&%s=%s"), SessionItemName[i], SessionItemValue[i]);
}
return true;
}
#endif
bool sendWebRequestHelper(LPCTSTR serverIp, LPCTSTR targetUrl, LPCTSTR requestBuffer, LPSTR responseBuffer, DWORD& responseBufferLength)
{
DWORD headerIndex = 0;
HINTERNET hInternet = NULL,
hConnect = NULL,
hRequest = NULL;
LPCTSTR acceptType[2] = {_T("text/html"), NULL};
DWORD requestLength = 0;
bool result = false;
int err = 0;
if ((hInternet = InternetOpen(_T("Microsoft Internet Explorer 6.0"), INTERNET_OPEN_TYPE_DIRECT,
NULL, NULL, 0)) != NULL)
{
if ((hConnect = InternetConnect(hInternet, serverIp, INTERNET_DEFAULT_HTTP_PORT,
NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0)) != NULL)
{
if ((hRequest = HttpOpenRequest(hConnect, _T("POST"), requestBuffer, _T("HTTP/1.1"),
NULL, &acceptType[0], INTERNET_FLAG_NO_UI, NULL))!= NULL)
{
requestLength = _tcslen(requestBuffer) * sizeof(TCHAR);
if (HttpSendRequest(hRequest, NULL, 0, (LPVOID)requestBuffer, requestLength))
{
if (HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF , responseBuffer, &responseBufferLength, &headerIndex))
{
//_tprintf(_T("[%s]\n"), responseBuffer);
result = true;
}
}
else
{
err = GetLastError();
}
InternetCloseHandle(hRequest);
}
InternetCloseHandle(hConnect);
}
InternetCloseHandle(hInternet);
}
return result;
}
bool searchHeaderMsg(LPTSTR msg, LPCTSTR headerName, LPTSTR msgBuffer, DWORD& msgBufferLength)
{
bool result = false;
LPTSTR ptr;
TCHAR CRLF[3] = {_T('\r'), _T('\n'), _T('\0')};
int headerNameLength = 0;
DWORD lengthCopied = 0;
headerNameLength = _tcslen(headerName);
ptr = &msg[0];
while (ptr != NULL)
{
if (_tcsnicmp(headerName, ptr, headerNameLength) == 0)
{
ptr += headerNameLength;
break;
}
// else
if ((ptr = _tcsstr(ptr, CRLF)) != NULL)
{
ptr += 2; //advance from CRLF
}
}
if (ptr != NULL)
{
lengthCopied = 0;
while (! (ptr[0] == _T('\r') && ptr[1] == _T('\n')) && lengthCopied < msgBufferLength)
{
msgBuffer[lengthCopied] = *ptr;
lengthCopied ++;
ptr ++;
}
msgBufferLength = lengthCopied;
msgBuffer[msgBufferLength] = _T('\0');
result = true;
}
return result;
}
bool crackUrl(LPCTSTR srcUrl, LPTSTR hostName, DWORD hostNameBufferSize, LPTSTR targetUrl, DWORD targetUrlLength)
{
URL_COMPONENTS url_components;
int len = 0;
len = _tcslen(srcUrl) * sizeof(TCHAR);
memset(&url_components, 0, sizeof(URL_COMPONENTS));
url_components.dwStructSize = sizeof(URL_COMPONENTS);
url_components.dwUrlPathLength = targetUrlLength;
url_components.lpszUrlPath = targetUrl;
url_components.dwHostNameLength = hostNameBufferSize;
url_components.lpszHostName = hostName;
return InternetCrackUrl(srcUrl, len, ICU_DECODE, &url_components) == TRUE;
}
bool sendWebRequest(LPCTSTR url, LPCTSTR parameter, LPSTR responseBuffer, DWORD responseBufferLength)
{
bool result = false;
TCHAR hostName[256];
TCHAR targetUrl[1024];
TCHAR requestBuffer[2048];
if (crackUrl(url, hostName, 256, targetUrl, 1024))
{
_sntprintf(requestBuffer, 2048, _T("%s?%s"), targetUrl, parameter);
if (sendWebRequestHelper(hostName, targetUrl, requestBuffer, responseBuffer, responseBufferLength))
{
result = true;
_tprintf(_T("%s"), responseBuffer);
}
}
return result;
}
bool sendWebRequestWithResponse(LPCTSTR url, LPCTSTR parameter, LPCTSTR responseHeaderName, LPTSTR responseBuffer, DWORD responseBufferLength)
{
char responseMsgBuffer[2048];
bool result = false;
DWORD responseMsgBufferLength = 2048;
if (sendWebRequest(url, parameter, responseMsgBuffer, responseMsgBufferLength))
{
if (searchHeaderMsg((LPTSTR)responseMsgBuffer, responseHeaderName, responseBuffer, responseBufferLength))
{
result = true;
}
}
return result;
}
bool updateSessionInfo()
{
LPCTSTR serverUrl= _T("http://support.datawind-s.com/provider-request/prepaidtime.jsp");
TCHAR requestBuffer[2048];
TCHAR responseBuffer[2048];
DWORD requestBufferLength = 2048;
bool result = false;
DWORD responseBufferLength = 2048;
if (packRequest(requestBuffer, requestBufferLength))
{
if (sendWebRequestWithResponse(serverUrl, requestBuffer, _T("dw-message:"), responseBuffer, responseBufferLength))
{
if (_tcsicmp(responseBuffer, _T(" succeed")))
{
result = true;
}
}
}
return result;
}
int main()
{
if (updateSessionInfo())
{
_tprintf(_T("succeed sending\n"));
}
return 0;
}
#if 0
bool sendFile(LPCTSTR serverUrl, LPCTSTR fileName)
{
HINTERNET hInternet = NULL, hConnect = NULL, hRequest = NULL;
LPCTSTR acceptType[2]={_T("image/jpeg"), NULL};
INTERNET_BUFFERS inBuffer;
HANDLE fileHandle = NULL;
LPVOID fileBuffer = NULL;
DWORD byteDone=0;
bool result = false;
if ((hInternet = InternetOpen(_T("Microsoft Internet Explorer 6.0"), INTERNET_OPEN_TYPE_DIRECT,
NULL, NULL, 0)) != NULL)
{
if ((hConnect = InternetConnect(hInternet, serverUrl, INTERNET_DEFAULT_HTTP_PORT,
NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0)) != NULL)
{
if ((hRequest = HttpOpenRequest(hConnect, _T("POST"), fileName, _T("HTTP/1.1"),
_T("directory"), &acceptType[0], INTERNET_FLAG_NO_UI, NULL))!= NULL)
{
if ((fileHandle=CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL))!= NULL)
{
memset(&inBuffer, 0, sizeof(INTERNET_BUFFERS));
inBuffer.dwStructSize = sizeof(INTERNET_BUFFERS);
if ((inBuffer.dwBufferTotal = GetFileSize(fileHandle, NULL))
!= INVALID_FILE_SIZE)
{
if ((fileBuffer=malloc(inBuffer.dwBufferTotal))!= NULL)
{
if (ReadFile(fileHandle, fileBuffer, inBuffer.dwBufferTotal,
&byteDone, NULL) && byteDone==inBuffer.dwBufferTotal)
{
if (HttpSendRequest(hRequest, NULL, 0, fileBuffer, inBuffer.dwBufferTotal))
{
result = true;
}
}
free(fileBuffer);
}
}
CloseHandle(fileHandle);
}
InternetCloseHandle(hRequest);
}
InternetCloseHandle(hConnect);
}
InternetCloseHandle(hInternet);
}
return result;
}
/*
bool sendFile(LPCTSTR serverUrl, LPCTSTR fileName)
{
HINTERNET hInternet = NULL, hConnect = NULL, hRequest = NULL;
LPCTSTR acceptType[2]={_T("image/jpeg"), NULL};
INTERNET_BUFFERS inBuffer, outBuffer;
HANDLE fileHandle = NULL;
LPVOID fileBuffer = NULL;
DWORD byteDone=0;
bool result = false;
if ((hInternet = InternetOpen(_T("Microsoft Internet Explorer 6.0"), INTERNET_OPEN_TYPE_DIRECT,
NULL, NULL, 0)) != NULL)
{
if ((hConnect = InternetConnect(hInternet, serverUrl, INTERNET_DEFAULT_HTTP_PORT,
NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0)) != NULL)
{
if ((hRequest = HttpOpenRequest(hConnect, _T("POST"), fileName, _T("HTTP/1.1"),
_T("directory"), &acceptType[0], INTERNET_FLAG_NO_UI, NULL))!= NULL)
{
if ((fileHandle=CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL))!= NULL)
{
memset(&inBuffer, 0, sizeof(INTERNET_BUFFERS));
inBuffer.dwStructSize = sizeof(INTERNET_BUFFERS);
if ((inBuffer.dwBufferTotal = GetFileSize(fileHandle, NULL))
!= INVALID_FILE_SIZE)
{
if (HttpSendRequestEx(hRequest, &inBuffer, &outBuffer, HSR_CHUNKED, 0))
{
if ((fileBuffer=malloc(inBuffer.dwStructSize))!= NULL)
{
if (ReadFile(fileHandle, fileBuffer, inBuffer.dwStructSize,
&byteDone, NULL) && byteDone==inBuffer.dwStructSize)
{
if (InternetWriteFile(hRequest, fileBuffer, inBuffer.dwStructSize,
&byteDone)&& inBuffer.dwStructSize==byteDone)
{
result = true;
}
}
free(fileBuffer);
}
}
else
{
printf("error [%d]\n", GetLastError());
}
}
CloseHandle(fileHandle);
}
InternetCloseHandle(hRequest);
}
InternetCloseHandle(hConnect);
}
InternetCloseHandle(hInternet);
}
return result;
}
*/
bool getIpAddress(LPCTSTR url, LPTSTR ipAddress)
{
DNS_STATUS result;
PDNS_RECORD pDnsRecord = NULL;
BYTE ipByte[4];
bool res = false;
if ((result = DnsQuery(url, DNS_TYPE_A, DNS_QUERY_STANDARD,
NULL, &pDnsRecord, NULL)) != 0)
{
printf("error of [%u]\n", result);
}
else
{
//printf("domain name [%s] dns ip4-address", pDnsRecord[0].pName);
switch (pDnsRecord[0].wType)
{
case DNS_TYPE_A:
memcpy(ipByte, &pDnsRecord[0].Data.A, sizeof(DNS_A_DATA));
_stprintf(ipAddress, _T("%u.%u.%u.%u"), ipByte[0], ipByte[1], ipByte[2], ipByte[3]);
res = true;
printf("ipAddress =[%s]\n", ipAddress);
break;
case DNS_TYPE_NS:
printf("DNS_TYPE_NS");
break;
case DNS_TYPE_MD:
printf("DNS_TYPE_MD");
break;
case DNS_TYPE_MF:
printf("DNS_TYPE_MF");
break;
case DNS_TYPE_CNAME:
printf("DNS_TYPE_CNAME");
_tprintf(_T("host name [%s]"), pDnsRecord[0].Data.Cname.pNameHost);
break;
case DNS_TYPE_SOA:
printf("DNS_TYPE_SOA");
break;
case DNS_TYPE_MB:
printf("DNS_TYPE_MB");
break;
case DNS_TYPE_MG:
printf("DNS_TYPE_MG");
break;
case DNS_TYPE_MR:
printf("DNS_TYPE_MR");
break;
case DNS_TYPE_NULL:
printf("DNS_TYPE_NULL");
break;
case DNS_TYPE_WKS:
printf("DNS_TYPE_WKS");
break;
case DNS_TYPE_PTR:
printf("DNS_TYPE_PTR");
break;
case DNS_TYPE_HINFO:
printf("DNS_TYPE_HINFO");
break;
case DNS_TYPE_MINFO:
printf("DNS_TYPE_MINFO");
break;
case DNS_TYPE_MX:
printf("DNS_TYPE_MX");
break;
case DNS_TYPE_TEXT:
printf("DNS_TYPE_TEXT");
break;
default:
printf("nothing?");
break;
}
printf("\n");
}
if (pDnsRecord != NULL)
{
DnsRecordListFree(pDnsRecord, DnsFreeRecordList);
}
return res;
}
#endif
The following is a modified version, namely a dll version.
//file : stdafx.h #include "basetsd.h" #include "winsock2.h" #include <windows.h> #include <stdio.h> #include <TCHAR.H> #include <wininet.h> #include "sendHttpRequest.h" #pragma comment(lib, "wininet.lib")
//file : stdafx.cpp #include "stdafx.h"
//file : sendHttpRequest.h
#define SEND_HTTP_REQUEST_DLL
#ifdef SEND_HTTP_REQUEST_DLL
#define HTTP_API __declspec(dllexport)
#define HTTP_CALL __stdcall
#else
#define HTTP_API __declspec(dllimport)
#define HTTP_CALL __stdcall
#endif
extern "C"{
#define MAX_URL_LENGTH 2048
HTTP_API BOOL HTTP_CALL packParameter(LPTSTR buffer, DWORD bufferLength, LPCTSTR name1, LPCTSTR value1, ...);
HTTP_API BOOL HTTP_CALL sendWebRequestHelper(LPCTSTR serverIp, LPCTSTR targetUrl, LPCTSTR requestBuffer, LPSTR responseBuffer, DWORD& responseBufferLength);
HTTP_API BOOL HTTP_CALL searchHeaderMsg(LPTSTR msg, LPCTSTR headerName, LPTSTR msgBuffer, DWORD& msgBufferLength);
HTTP_API BOOL HTTP_CALL sendWebRequest(LPCTSTR url, LPCTSTR parameter, LPSTR responseBuffer, DWORD responseBufferLength);
HTTP_API BOOL HTTP_CALL sendWebRequestWithResponse(LPCTSTR url, LPCTSTR parameter, LPCTSTR responseHeaderName, LPTSTR responseBuffer, DWORD responseBufferLength);
HTTP_API BOOL HTTP_CALL updateSessionInfo(LPCTSTR serverUrl, LPCTSTR serialValue, LPCTSTR brandValue, LPCTSTR modelValue,
LPCTSTR providerValue, LPCTSTR providerkeyValue, LPCTSTR actionValue, LPCTSTR timeValue);
HTTP_API BOOL HTTP_CALL sendWebSizeFile(LPCTSTR serverUrl, LPCTSTR fileName);
}; // extern "C"
//file : sendHttpRequest.cpp
//compilation tips: It needs platformsdk2003. You need to setup your directory of
//platformsdk BEFORE original vc6 directory. i.e. "tools\options\directory\include"
//must have "platformsdk\include" before "vc98\include"
#include "stdafx.h"
// QH : utility functions to conveniently packup parameter in http request. Usually parameter is in the format of
// "name1=value1&name2=value2&name3=value3..."
// assumtion: user supply arbitary parameters ending with two NULL parameters. And at least one pair of "name" "value"
// is supplied
BOOL packParameter(LPTSTR buffer, DWORD bufferLength, LPCTSTR name1, LPCTSTR value1, ...)
{
BOOL result = FALSE;
va_list marker;
LPCTSTR pName = NULL;
LPCTSTR pValue = NULL;
LPTSTR ptr = NULL;
int bufferOffset = 0;
int nameLength, valueLength;
if (name1 == NULL || value1 == NULL){
return FALSE;
}
nameLength = _tcslen(name1);
valueLength = _tcslen(value1);
bufferOffset = (nameLength + valueLength + 1);
pName = name1;
pValue = value1;
// QH : here we check the buffer size so that we don't have to worry about buffer overflow
// when writing
if (bufferOffset < bufferLength - 1){
_stprintf(buffer, _T("%s=%s"), name1, value1);
}else {
return FALSE;
}
ptr = buffer + bufferOffset;
va_start(marker, value1); /* Initialize variable arguments. */
do
{
pName = va_arg(marker, LPCTSTR);
pValue = va_arg(marker, LPCTSTR);
if (pName == NULL || pValue == NULL)
{
break;
}
nameLength = _tcslen(pName);
valueLength = _tcslen(pValue);
// QH : here I DELIBERATELY to change bufferOffset value before comparison, so that we can
// return success or failure when function return
bufferOffset += (nameLength + valueLength + 2); // '&' and '=' makes 2
if (bufferOffset >= bufferLength - 1){
break;
}
_stprintf(ptr, _T("&%s=%s"), pName, pValue);
ptr = buffer + bufferOffset;
}
while (TRUE);
va_end( marker ); /* Reset variable arguments. */
return (pName == NULL && pValue == NULL && (bufferOffset < bufferLength - 1));
}
BOOL HTTP_CALL sendWebRequestHelper(LPCTSTR serverIp, LPCTSTR targetUrl, LPCTSTR requestBuffer, LPSTR responseBuffer, DWORD& responseBufferLength)
{
DWORD headerIndex = 0;
HINTERNET hInternet = NULL,
hConnect = NULL,
hRequest = NULL;
LPCTSTR acceptType[2] = {_T("text/html"), NULL};
DWORD requestLength = 0;
BOOL result = FALSE;
int err = 0;
if ((hInternet = InternetOpen(_T("Microsoft Internet Explorer 6.0"), INTERNET_OPEN_TYPE_DIRECT,
NULL, NULL, 0)) != NULL) {
if ((hConnect = InternetConnect(hInternet, serverIp, INTERNET_DEFAULT_HTTP_PORT,
NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0)) != NULL){
if ((hRequest = HttpOpenRequest(hConnect, _T("POST"), requestBuffer, _T("HTTP/1.1"),
NULL, &acceptType[0], INTERNET_FLAG_NO_UI, NULL))!= NULL) {
requestLength = _tcslen(requestBuffer) * sizeof(TCHAR);
if (HttpSendRequest(hRequest, NULL, 0, (LPVOID)requestBuffer, requestLength)) {
if (HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF , responseBuffer, &responseBufferLength,
&headerIndex)) {
//_tprintf(_T("[%s]\n"), responseBuffer);
result = TRUE;
}
}else{
err = GetLastError();
}
InternetCloseHandle(hRequest);
}
InternetCloseHandle(hConnect);
}
InternetCloseHandle(hInternet);
}
return result;
}
// QH: utility function to help retrieve target "header" contents from response buffer of request-sending
// param:
// msg(in): the response raw data
// headerName(in) : the target header name
// msgBuffer(out): the buffer to hold retrieved contents of "headerName"
// msgBufferLength(in/out): the buffer length of "msgBuffer" and return writen characters
BOOL HTTP_CALL searchHeaderMsg(LPTSTR msg, LPCTSTR headerName, LPTSTR msgBuffer, DWORD& msgBufferLength)
{
BOOL result = FALSE;
LPTSTR ptr;
TCHAR CRLF[3] = {_T('\r'), _T('\n'), _T('\0')};
int headerNameLength = 0;
DWORD lengthCopied = 0;
headerNameLength = _tcslen(headerName);
ptr = &msg[0];
while (ptr != NULL)
{
if (_tcsnicmp(headerName, ptr, headerNameLength) == 0){
// QH: found target and move to pointing data
ptr += headerNameLength;
break;
}
// else
if ((ptr = _tcsstr(ptr, CRLF)) != NULL){
ptr += 2; //advance from CRLF
}
}
if (ptr != NULL) {
lengthCopied = 0;
// copy data until CRLF
while (! (ptr[0] == _T('\r') && ptr[1] == _T('\n')) && lengthCopied < msgBufferLength)
{
msgBuffer[lengthCopied] = *ptr;
lengthCopied ++;
ptr ++;
}
msgBufferLength = lengthCopied;
msgBuffer[msgBufferLength] = _T('\0');
result = TRUE;
}
return result;
}
// QH: we need retrieve host name and checking if it is http protocol
// params:
// srcUrl(in) : the url to be cracked
// hostName(out): buffer to receive cracked host name
// hostNameBufferSize(in) : size of buffer of "hostName"
// targetUrl(out): the relative "path" to hostName. i.e. jsp object or any server object
// targetUrlLength(in): the size of buffer to hold "targetUrl"
BOOL HTTP_CALL crackUrl(LPCTSTR srcUrl, LPTSTR hostName, DWORD hostNameBufferSize, LPTSTR targetUrl, DWORD targetUrlLength)
{
BOOL result = FALSE;
URL_COMPONENTS url_components;
int len = 0;
len = _tcslen(srcUrl) * sizeof(TCHAR);
memset(&url_components, 0, sizeof(URL_COMPONENTS));
url_components.dwStructSize = sizeof(URL_COMPONENTS);
url_components.dwUrlPathLength = targetUrlLength;
url_components.lpszUrlPath = targetUrl;
url_components.dwHostNameLength = hostNameBufferSize;
url_components.lpszHostName = hostName;
if (InternetCrackUrl(srcUrl, len, ICU_DECODE, &url_components)) {
if (url_components.nScheme == INTERNET_SCHEME_HTTP ) {
result = TRUE;
}
}
return result;
}
// assume parameter is already in format of "name1=value1&name2=value2..."
// responseBuffer is to receive raw response text data
BOOL HTTP_CALL sendWebRequest(LPCTSTR url, LPCTSTR parameter, LPSTR responseBuffer, DWORD responseBufferLength)
{
BOOL result = FALSE;
TCHAR hostName[MAX_URL_LENGTH];
TCHAR targetUrl[MAX_URL_LENGTH];
TCHAR requestBuffer[MAX_URL_LENGTH];
if (crackUrl(url, hostName, MAX_URL_LENGTH, targetUrl, MAX_URL_LENGTH)) {
_sntprintf(requestBuffer, MAX_URL_LENGTH, _T("%s?%s"), targetUrl, parameter);
if (sendWebRequestHelper(hostName, targetUrl, requestBuffer, responseBuffer, responseBufferLength)){
result = TRUE;
//_tprintf(_T("%s"), responseBuffer);
}
}
return result;
}
// send request and also retrieve interested "header" contents if succeeded
BOOL HTTP_CALL sendWebRequestWithResponse(LPCTSTR url, LPCTSTR parameter, LPCTSTR responseHeaderName, LPTSTR responseBuffer, DWORD responseBufferLength)
{
char responseMsgBuffer[MAX_URL_LENGTH];
BOOL result = FALSE;
DWORD responseMsgBufferLength = MAX_URL_LENGTH;
if (sendWebRequest(url, parameter, responseMsgBuffer, responseMsgBufferLength)) {
if (searchHeaderMsg((LPTSTR)responseMsgBuffer, responseHeaderName, responseBuffer, responseBufferLength)) {
result = TRUE;
}
}
return result;
}
BOOL HTTP_CALL updateSessionInfo(LPCTSTR serverUrl, LPCTSTR serialValue, LPCTSTR brandValue, LPCTSTR modelValue,
LPCTSTR providerValue, LPCTSTR providerkeyValue, LPCTSTR actionValue, LPCTSTR timeValue)
{
const int SessionItemCount = 7;
LPCTSTR SessionItemName[SessionItemCount] =
{
_T("serial"), _T("brand"), _T("model"), _T("provider"), _T("providerkey"), _T("action"), _T("time")
};
TCHAR requestBuffer[MAX_URL_LENGTH];
TCHAR responseBuffer[2048];
DWORD requestBufferLength = MAX_URL_LENGTH;
BOOL result = FALSE;
DWORD responseBufferLength = MAX_URL_LENGTH;
if (packParameter(requestBuffer, requestBufferLength, SessionItemName[0], serialValue, SessionItemName[1], brandValue,
SessionItemName[2], modelValue, SessionItemName[3], providerValue, SessionItemName[4], providerkeyValue,
SessionItemName[5], actionValue, SessionItemName[6], timeValue, NULL, NULL)){
if (sendWebRequestWithResponse(serverUrl, requestBuffer, _T("dw-message:"), responseBuffer, responseBufferLength)){
if (_tcsicmp(responseBuffer, _T(" succeed"))){
result = TRUE;
}
}
}
return result;
}
BOOL HTTP_CALL sendWebSizeFile(LPCTSTR serverUrl, LPCTSTR fileName)
{
HINTERNET hInternet = NULL, hConnect = NULL, hRequest = NULL;
//LPCTSTR acceptType[2] = {_T("image/jpeg"), NULL};
LPCTSTR acceptType[2] = {_T("*/*"), NULL};
HANDLE fileHandle = NULL;
LPVOID fileBuffer = NULL;
DWORD byteDone = 0;
DWORD bufferSize = 0;
BOOL result = FALSE;
if ((hInternet = InternetOpen(_T("Microsoft Internet Explorer 6.0"), INTERNET_OPEN_TYPE_DIRECT,
NULL, NULL, 0)) != NULL)
{
if ((hConnect = InternetConnect(hInternet, serverUrl, INTERNET_DEFAULT_HTTP_PORT,
NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0)) != NULL)
{
if ((hRequest = HttpOpenRequest(hConnect, _T("POST"), fileName, _T("HTTP/1.1"),
_T("directory"), &acceptType[0], INTERNET_FLAG_NO_UI, NULL))!= NULL)
{
if ((fileHandle = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL))!= INVALID_HANDLE_VALUE)
{
if ((bufferSize = GetFileSize(fileHandle, NULL)) != INVALID_FILE_SIZE)
{
if ((fileBuffer = malloc(bufferSize))!= NULL)
{
if (ReadFile(fileHandle, fileBuffer, bufferSize, &byteDone, NULL) && byteDone == bufferSize)
{
if (HttpSendRequest(hRequest, NULL, 0, fileBuffer, bufferSize))
{
result = TRUE;
}
}
free(fileBuffer);
}
}
CloseHandle(fileHandle);
}
InternetCloseHandle(hRequest);
}
InternetCloseHandle(hConnect);
}
InternetCloseHandle(hInternet);
}
return result;
}
The following is a simple caller for testing.
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <windows.h>
#include <stdio.h>
#include <TCHAR.H>
#include "..\\sendHttpRequest.h"
#pragma comment(lib, "sendHttpRequest.lib")
// TODO: reference additional headers your program requires here
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
// stdafx.cpp : source file that includes just the standard includes // SendRequestTest.pch will be the pre-compiled header // stdafx.obj will contain the pre-compiled type information #include "stdafx.h" // TODO: reference any additional headers you need in STDAFX.H // and not in this file
// SendRequestTest.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
LPCTSTR serverUrl= _T("http://support.datawind-s.com/provider-request/prepaidtime.jsp");
LPCTSTR SessionItemValue[7] =
{
_T("EmuNick"), _T("GLO.ng"), _T("datawind.uk"), _T("PDA_SERVER"), _T("PREPAID_UPDATE"), _T("update"), _T("1000")
};
if (updateSessionInfo(serverUrl, SessionItemValue[0], SessionItemValue[1], SessionItemValue[2],
SessionItemValue[3], SessionItemValue[4], SessionItemValue[5], SessionItemValue[6])) {
MessageBox(NULL, _T("succeed!"), _T("message"), MB_OK);
}
return 0;
}