reactos/rosapps/applications/sysutils/rosddt/http.c
Aleksey Bragin 8e59bc0550 - Add ReactOS Device Detection Tool - RosDDT. It's a command line tool for checking PC's hardware configuration for compatibility with ReactOS, and for reporting working hardware configurations to ReactOS hardware compatibility database. The tool is able of autoupdating its hardware compatibility database.
* Web part is stubbed for now (hw.php) and needs to be developed.
 * Actual hardware database file (rosddt.ini) has only sample information.
 * Readme file is in Russian language, however running rosddt.exe without parameters provides a built-in English usage help.

svn path=/trunk/; revision=41282
2009-06-04 12:38:30 +00:00

132 lines
3.1 KiB
C

#include <windows.h>
#include <wininet.h>
#include <urlmon.h>
#include <stdio.h>
#include "http.h"
#define INTERNET_FLAGS (INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_UI | INTERNET_FLAG_NO_COOKIES )
static char *http_receive(HINTERNET h_req, u_long *d_size)
{
u_long bytes = sizeof(u_long);
u_long qsize = 0;
u_long readed = 0;
char *data = NULL;
char buff[4096];
if (HttpQueryInfo(h_req, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &qsize, &bytes, NULL) != 0) {
data = malloc(qsize + 1);
}
do
{
if (InternetReadFile(h_req, buff, sizeof(buff), &bytes) == 0) {
break;
}
if ( (readed + bytes) > qsize) {
data = realloc(data, readed + bytes + 1);
if (data == NULL) break;
qsize += bytes;
}
memcpy(data + readed, buff, bytes); readed += bytes;
} while (bytes != 0);
if ( (data != NULL) && (readed != qsize) ) {
free(data); data = NULL;
} else {
if (d_size != NULL) *d_size = readed;
data[readed] = 0;
}
return data;
}
void *http_get(wchar_t *url, u_long *d_size)
{
HINTERNET h_inet = NULL;
HINTERNET h_req = NULL;
char *replay = NULL;
do
{
h_inet = InternetOpen(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (h_inet == NULL) break;
h_req = InternetOpenUrl(h_inet, url, NULL, 0, INTERNET_FLAGS, 0);
if (h_req == NULL) break;
replay = http_receive(h_req, d_size);
} while (0);
if (h_req != NULL) {
InternetCloseHandle(h_req);
}
if (h_inet != NULL) {
InternetCloseHandle(h_inet);
}
return replay;
}
void *http_post(wchar_t *url, void *data, int size, u_long *d_size)
{
URL_COMPONENTS url_cm = {0};
HINTERNET h_inet = NULL;
HINTERNET h_conn = NULL;
HINTERNET h_req = NULL;
char *q_data = NULL;
char *replay = NULL;
wchar_t host[MAX_PATH];
wchar_t path[MAX_PATH];
unsigned char *p, *d = data;
do
{
if ( (q_data = malloc(size * 3 + 10)) == NULL ) {
break;
}
strcpy(q_data, "data="); p = q_data + 5;
while (size--) {
p += sprintf(p, "%%%0.2x", (u_long)*d++);
}
url_cm.dwStructSize = sizeof(url_cm);
url_cm.lpszHostName = host;
url_cm.dwHostNameLength = sizeof(host);
url_cm.lpszUrlPath = path;
url_cm.dwUrlPathLength = sizeof(path);
if (InternetCrackUrl(url, 0, 0, &url_cm) == 0) {
break;
}
h_inet = InternetOpen(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (h_inet == NULL) break;
h_conn = InternetConnect(h_inet, host, url_cm.nPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
if (h_conn == NULL) break;
h_req = HttpOpenRequest(h_conn, L"POST", path, NULL, NULL, NULL, INTERNET_FLAGS, 0);
if (h_req == NULL) break;
HttpAddRequestHeaders(
h_req, L"Content-Type: application/x-www-form-urlencoded", 47*2, HTTP_ADDREQ_FLAG_ADD);
if (HttpSendRequest(h_req, NULL, 0, q_data, strlen(q_data)) == 0) {
break;
}
replay = http_receive(h_req, d_size);
} while (0);
if (h_req != NULL) {
InternetCloseHandle(h_req);
}
if (h_conn != NULL) {
InternetCloseHandle(h_conn);
}
if (h_inet != NULL) {
InternetCloseHandle(h_inet);
}
if (q_data != NULL) free(q_data);
return replay;
}