//---------------------------------------------------------------------------
#include <stdlib.h>
#include <stdio.h>
#include <fstream.h>
#include <windows.h>
#include <Wininet.h>

#pragma link "Wininet.lib"

int main(int argc, char* argv[])
{
	char flRequestName[1024];
	char flResponseName[1024];
	char serverHost[64];
	DWORD serverPort;
	HINTERNET hInternet = NULL;
	HINTERNET hConnect = NULL;
	HINTERNET hRequest = NULL;
	FILE *in_request;
	FILE *in_response;
	DWORD bufSize;
	unsigned char buf[8096];
	unsigned char  szData[8096];

	if(argc<5){
	 printf("sendHHTP.exe <input file request> <ip server> <port server> <output file response>");
	 return 0;
	}
	sprintf(flRequestName, "%s", argv[1]);
	sprintf(serverHost, "%s", argv[2]);
	serverPort = atol(argv[3]);
	sprintf(flResponseName, "%s", argv[4]);
    // чтение запроса
    if ((in_request = fopen(flRequestName, "rb")) != NULL) {
		long l = ftell(in_request);
		fseek(in_request, 0L, SEEK_END);
		bufSize = ftell(in_request);
		fseek(in_request, l, SEEK_SET);
		fread(buf, bufSize, 1, in_request);
		fclose(in_request);
		in_request = NULL;
	}
	// открываем WinInet
    hInternet = InternetOpenA("request",
						INTERNET_OPEN_TYPE_PRECONFIG,
						NULL,
						NULL,
						0);
if (hInternet != NULL) {
	  // открываем HTTP сессию
	  HINTERNET hConnect = InternetConnectA(hInternet,
						   serverHost,
						   serverPort,
						   //62285,
						   NULL,
						   NULL,
						   INTERNET_SERVICE_HTTP,
						   0,
						   1u);
	 if (hConnect != NULL) {
		 // открываем запрос
			HINTERNET hRequest = HttpOpenRequestA(hConnect,
								 "POST",
								 "",
								 NULL,
								 NULL,
								 0,
								 INTERNET_FLAG_KEEP_CONNECTION,
								 1);
			if (hRequest != NULL) {
				// посылаем запрос
				BOOL bSend = HttpSendRequestA(hRequest,
							 "Content-Type: application/x-www-form-urlencoded",
							 47,
							 buf,
							 bufSize);
				if (bSend) {
					ofstream fresponse(flResponseName,ios::out|ios::binary);
					if ((in_response = fopen(flResponseName, "wb")) != NULL){
					 for (;;) {
						// читаем данные

						DWORD dwBytesRead;
						BOOL bRead =
							InternetReadFile(
								hRequest,
								szData,sizeof(szData)-1,
								&dwBytesRead);

						// выход из цикла при ошибке или завершении
						if (bRead == FALSE  ||  dwBytesRead == 0)
							break;

						// сохраняем результат
						//szData[dwBytesRead] = 0;
						fwrite(szData, dwBytesRead, 1, in_response);
					 }
					 fclose(in_response);
					}
                }
                // закрываем запрос
				InternetCloseHandle(hRequest);
			}
			// закрываем сессию
			InternetCloseHandle(hConnect);
		}
		// закрываем WinInet
		InternetCloseHandle(hInternet);
	}

	return 0;
}
//---------------------------------------------------------------------------
