13,874
社区成员
发帖
与我相关
我的任务
分享
// ******************************************************************************************************* // SendRequest // //*******************************************************************************************************
int Request::SendRequest(bool IsPost, string url, string& psHeaderSend, string& psHeaderReceive, string& psMessage)
{
HTTPRequest req;
int i, rtn;
LPSTR buffer;
req.headerSend = NULL;
req.headerReceive = NULL;
req.message = NULL; // Read in arguments
if (IsPost)
{
/* POST */ i = psHeaderSend.length();
buffer = (char*)malloc(i + 1);
strcpy(buffer, psHeaderSend.c_str());
rtn = SendHTTP(url, "Content-Type: application/x-www-form-urlencoded\r\n", (unsigned char*)buffer, i, &req);
free(buffer);
}
else
/* GET */ {
rtn = SendHTTP(url, NULL, NULL, 0, &req);
}
if (!rtn) // Output message and/or headerSend
{
psHeaderSend = req.headerSend;
psHeaderReceive = req.headerReceive;
psMessage = req.message;
free(req.headerSend);
free(req.headerReceive);
free(req.message);
return 1;
}
else
{
return 0;
}
}
int Request::httpgzdecompress(BYTE *zdata, unsigned long nzdata, BYTE *data, unsigned long *ndata)
{
int err = 0;
z_stream d_stream = {0}; /* decompression stream */
static char dummy_head[2] =
{
0x8 + 0x7 * 0x10,
(((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,
};
d_stream.zalloc = (alloc_func)0;
d_stream.zfree = (free_func)0;
d_stream.opaque = (voidpf)0;
d_stream.next_in = zdata;
d_stream.avail_in = 0;
d_stream.next_out = data;
if(inflateInit2(&d_stream, 47) != Z_OK) return -1;
while (d_stream.total_out < *ndata && d_stream.total_in < nzdata) {
d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
if((err = inflate(&d_stream, Z_NO_FLUSH)) == Z_STREAM_END) break;
if(err != Z_OK )
{
if(err == Z_DATA_ERROR)
{
d_stream.next_in = (Bytef*) dummy_head;
d_stream.avail_in = sizeof(dummy_head);
if((err = inflate(&d_stream, Z_NO_FLUSH)) != Z_OK)
{
return -1;
}
}
else return -1;
}
}
if(inflateEnd(&d_stream) != Z_OK) return -1;
*ndata = d_stream.total_out;
return 0;
}
// ---------------------------------------------------------------------------
#ifndef RequestH
#define RequestH
// ---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <winsock2.h>
#pragma comment(lib, "WS2_32.lib")
using namespace std;
#define MEM_BUFFER_SIZE 10
/* HTTPRequest: Structure that returns the HTTP headers and message from the request */
typedef struct
{
LPSTR headerSend; // Pointer to HTTP header Send
LPSTR headerReceive; // Pointer to HTTP headers Receive
LPSTR message; // Pointer to the HTTP message
long messageLength; // Length of the message
}HTTPRequest; /* MemBuffer: Structure used to implement a memory buffer, which is a buffer of memory that will grow to hold variable sized parts of the HTTP message. */
typedef struct
{
unsigned char *buffer;
unsigned char *position;
size_t size;
}MemBuffer;
class Request
{
public:
Request();
virtual ~Request();
private:
void MemBufferCreate(MemBuffer *b);
void MemBufferGrow(MemBuffer *b);
void MemBufferAddByte(MemBuffer *b, unsigned char byt);
void MemBufferAddBuffer(MemBuffer *b, unsigned char *buffer, size_t size);
DWORD GetHostAddress(LPCSTR host);
void SendString(SOCKET sock, LPCSTR str);
BOOL ValidHostChar(char ch);
void ParseURL(string url, LPSTR protocol, int lprotocol, LPSTR host, int lhost, LPSTR request, int lrequest, int *port);
int SendHTTP(string url, LPCSTR headerReceive, BYTE *post, DWORD postLength, HTTPRequest *req);
int Request::httpgzdecompress(BYTE *zdata, unsigned long nzdata, BYTE *data, unsigned long *ndata);
unsigned char *tmp;
unsigned long tmp_len;
public:
int SendRequest(bool IsPost, string url, string& psHeaderSend, string& pszHeaderReceive, string& pszMessage);
};
#endif