Introduction
This class is used for HTTP/HTTPS request, and FTP request.
Supported methods are:
- HTTP/HTTPS
- GET
- POST
- POST multiparts/form-data
- FTP
- GET FILE
- PUT FILE
Class Overview
�class W3Client {
�public:
��enum w3t { w3ftp, w3http, w3https };
��enum w3m { reqGet, reqPost, reqPostMultipartsFormdata };
�public:
��W3Client(){ _hOpen=NULL; _hConnection=NULL, _hRequest=NULL; }
��virtual ~W3Client(){ InitializePostArguments(); InitializeCookies();}
�public:��
��bool Connect(const char *szaddress,
������� const char *szuser=NULL, const char *szpassword=NULL,
const char *szagent=__W3_DEFAULT_AGENT);
��virtual bool Connect(const char *szaddress,�long nport,
�����������const char *szuser=NULL, const char *szpassword=NULL,
�����������w3t t=w3http, const char *szagent=__W3_DEFAULT_AGENT);
��const char *GetURI(){ return _szuri.c_str(); }
��void Close();
��void InitializePostArguments();
��void AddPostArgument(const char *szname, const int nvalue);
��void AddPostArgument(const char *szname, const long nvalue);
��void AddPostArgument(const char *szname, const float nvalue);
��void AddPostArgument(const char *szname, const double nvalue);
��void AddPostArgument(const char *szname,
const char *szvalue, bool bfile=false);
��
��void InitializeCookies();
��void AddCookie(const char *szname, const double value);
��void AddCookie(const char *szname, const float value);
��void AddCookie(const char *szname, const long value);
��void AddCookie(const char *szname, const int value);��
��void AddCookie(const char *szname, const char *szvalue);
��bool Request(const char *szuri, w3m m=reqGet, const char *szref=NULL);
��unsigned long Response(unsigned char *buf, unsigned long len);
��unsigned int QueryResult();
��const char * QueryContentType();
��unsigned long QueryContentLength();
��unsigned long QueryCookie(unsigned char *buf,
unsigned long len, unsigned long idx=0);
��unsigned long QueryRawHeader(unsigned char *buf, unsigned long len);
��bool PutFile(const char *szuri, const char *szfile, bool ascii=false);
��bool GetFile(const char *szuri, const char *szfile, bool ascii=false);
��unsigned long PutFile(const char *szuri, unsigned char *buf,
unsigned long len, bool ascii=false);
��unsigned long GetFile(const char *szuri, unsigned char *buf,
unsigned long len, bool ascii=false);
...
�};
�
�class AsyncW3Client : public W3Client {
...
�public:
��bool Connect(const char *szaddress,
������������INTERNET_STATUS_CALLBACK lpfn,
������������const char *szuser=NULL,
������������const char *szpassword=NULL,
������������const char *szagent=__W3_DEFAULT_AGENT);
��bool Connect(const char *szaddress,�long nport,
�������� INTERNET_STATUS_CALLBACK lpfn,
�������� const char *szuser=NULL, const char *szpassword=NULL,
�������� w3t t=w3http, const char *szagent=__W3_DEFAULT_AGENT);
��bool Request(const char *szuri, w3m m=reqGet, const char *szref=NULL){
��� _hCompleteRequestEvent=::CreateEvent(NULL, FALSE, FALSE, NULL);
���return W3Client::Request(szuri, m, szref);
��}
��unsigned long Response(unsigned char *buf, unsigned long len){
���::CloseHandle(_hCompleteRequestEvent);
���_hCompleteRequestEvent=NULL;
���return W3Client::Response(buf, len);
��}
�public:
��void SetCompleteRequest();
��bool WaitCompleteRequest(unsigned long ntime=INFINITE);
...
�};
Synchronized W3Client
Connect(...)
method connects to HTTP server.
Close()
method closes connection. These are used with RequestOfURI(...)
.
InitializePostArguments()
method initializes POST arguments.
AddPostArgument(...)
method is supported so that you can
add new POST arguments of the following types: string
, int
,
long
, float
, double
, file
.
Request(...)
method is for you to attempt request
for HTTP Request (GET, POST, POST-MULTIPARTFORMDATA) with URL.
HTTP METHOD indirector has 3 types.
InitializeCookies()
method initializes cookie values.
AddCookie(...)
method adds cookie vars.
W3Client::reqGet
is HTTP GET Request.
W3Cient::reqPost
is HTTP POST Request.
W3Client::reqPostMultiPartsFormData
is HTTP POST Request with BINARY FORM DATA.
Response(...)
method is that you have HTTP Response by bytes.
QueryResult()
method is you have receive HTTP Request
result value.
Asynchronized W3Client
SetCompleteRequest()
method commits complete Request to AsyncW3Client
.
WaitCompleteRequest()
method waits for Request to be completed.
Usage
Synchronized HTTP GET
#include <iostream>
#include "w3c.h"
using namespace std;
int main(int argc, char *argv[]){
��W3Client w3;
�
��if(w3.Connect("http://google.com/")){
���if(w3.Request("/")){
����char buf[1024]="\0";
����while(w3.Response(reinterpret_cast<unsigned char *>(buf), 1024))
�����cout << buf ;
��}
���w3.Close();
��}
��return 0;
}
Synchronized HTTP POST multiparts/form-data
int main(int argc, char *argv[]){
�
�W3Client client;
�if(client.Connect("http://gooshin.zzem.net/")){
��client.AddPostArgument("f[]", "d:\\log1.txt", true);
��client.AddPostArgument("f[]", "d:\\log2.txt", true);
��client.AddPostArgument("f[]", "d:\\log3.txt", true);
��if(client.Request("/test.php", W3Client::reqPostMultipartsFormdata)){
���char buf[1024]="\0";
���while(client.Response(reinterpret_cast<unsigned char*>(buf), 1024)>0){
����cout << buf << endl;
����memset(buf, 0x00, 1024);
���}
��}
��client.Close();
�}
�return 0;
}
Asynchronized HTTP client
#include <iostream>
#include <net/w3c.h>
#include <wt.h>
#include <windows.h>
using namespace std;
CRITICAL_SECTION __cs;
class AsDown : public AsyncW3Client, public IWORKERTHREAD {
public:
�AsDown(unsigned int idx):AsyncW3Client(), IWORKERTHREAD(idx){}
�virtual ~AsDown(){}
private:
�virtual void OnWork(){
while(true){
WaitCompleteRequest();
unsigned char buf[1024]="\0";
while(Response(buf, 1024)){
::EnterCriticalSection(&__cs);
cout << reinterpret_cast<char*>(buf);
::LeaveCriticalSection(&__cs);
memset(buf, 0x00, 1024);
}
::Sleep(500);
}
�}
};
void CALLBACK __getstatus( HINTERNET hInternet,
DWORD_PTR dwContext,
DWORD dwInternetStatus,
LPVOID lpvStatusInformation,
DWORD dwStatusInformationLength
){
�AsyncW3Client *pcontext=reinterpret_cast<AsyncW3Client*>(dwContext);
�
�unsigned long nbytes=0;
::EnterCriticalSection(&__cs);
switch(dwInternetStatus){
�case INTERNET_STATUS_SENDING_REQUEST:
cout << "request sending..." << endl;
break;
�case INTERNET_STATUS_REQUEST_SENT:
{
unsigned long *pnsent=(unsigned long*)lpvStatusInformation;
cout << "bytes sent: " << *pnsent << endl;
nbytes+=*pnsent;
cout << "request sent..." << endl;
}
break;
�case INTERNET_STATUS_REQUEST_COMPLETE:
{
INTERNET_ASYNC_RESULT *pAsyncRes =
(INTERNET_ASYNC_RESULT *)lpvStatusInformation;
cout << "Function call finished" << endl;
cout << "dwResult: " << pAsyncRes->dwResult << endl;
cout << "dwError: " << pAsyncRes->dwError << endl;
cout.flush();
pcontext->SetCompleteRequest();
cout << "request complete..." << endl;
}
break;
}
::LeaveCriticalSection(&__cs);
�
return;
}
int main(int argc, char *argv[]){
�::InitializeCriticalSection(&__cs);
�AsDown client(3);
�if(client.Connect("http://gooshin.zzem.net/", __getstatus)){
__wtstart(client);
client.Request("/test.php");
Sleep(5000);
client.InitializePostArguments();
client.AddPostArgument("f[]", "d:\\log1.txt", true);
client.AddPostArgument("f[]", "d:\\log2.txt", true);
client.AddPostArgument("f[]", "d:\\log3.txt", true);
client.Request("/test.php", AsDown::reqPostMultipartsFormdata);
Sleep(5000);
client.InitializePostArguments();
client.AddPostArgument("f", "sss");
client.Request("/test2.php", AsDown::reqPost);
Sleep(5000);
__wtwait(client);
client.Close();
�}
�::DeleteCriticalSection(&__cs);
�return 0;
}