Click here to Skip to main content
15,892,927 members
Articles / Desktop Programming / Win32

Asynchronous WinHTTP Library

Rate me:
Please Sign up or sign in to vote.
3.33/5 (5 votes)
10 Dec 2009CPOL 52.9K   3K   27   5
Tiny WinHTTP API wrapper library for asynchronous HTTP with callback handler

Introduction

The AsyncWinHttp is a simple wrapper of WinHTTP to achieve asynchronous HTTP. WinHtpp API is a replacement of WinINet API (see About WinHTTP for more information of why Microsoft recommends to use WinHttp API).

The library provides a very simple interface, the user can register a callback function when initializing the class. And the callback will be invoked when HTTP finished. The interface is shown as:

Background

This code is based on the sample of WinHTTP from MSDN, with a wrapper for simple use. 

Using the Code

To use the library is very simple, all you need is the two files:

  • AsyncWinHttp.h
  • AsyncWinHttp.cpp

First, you need to define your callback functions. These functions will be invoked when HTTP finished (whether succeeded or failed):

C++
void WinHttp_CallBack(AsyncWinHttp* asyncWinHttp)
{
  // check if success or failed
  if (asyncWinHttp->status.Status() == ASYNC_WINHTTP_ERROR)
  {
    // print error message
    printf("%S", asyncWinHttp->status.Desc().c_str());
  }
  else // success
  {
    // print response, do your handling here ...
    std::string response;
    asyncWinHttp->GetResponseRaw(response);
    printf("%s", response.c_str());
  }
}

Now you can invoke the request to HTTP resources:

C++
{
  AsyncWinHttp http;
  http.Initialize(WinHttp_CallBack);
  http.SetTimeout(3 * 60 * 1000);  // time out is 3 minutes
  http.SendRequest(L"http://www.google.cn");
}

Of course, you can use a Windows event to wait for the asynchronous HTTP call to finish, as shown in the demo, but I think most of you will not do so, since we need a really asynchronous HTTP. ;)

History

  • 11th December, 2009: Initial post 

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
China China
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
QuestionHello, the code maybe has memory leakage Pin
fluxischarge24-Jun-13 11:27
fluxischarge24-Jun-13 11:27 
BugStatus code not getting set on successful SendRequest Pin
Member 978173110-Apr-13 9:12
Member 978173110-Apr-13 9:12 
Hi,

Thanks for the great library! I think there is one bug here. I call Initialize() once, and then make subsequent calls to SendRequest(). When there is an error while calling SendRequest(), the status is set to ASYNC_WINHTTP_ERROR which is correct. However, if a subsequent call to SendRequest() succeeds, the status is not set to ASYNC_WINHTTP_OK. Therefore, when I check if the status is ASYNC_WINHTTP_ERROR to know if an error occurred, it will always be true, even though the call succeeded.

Thanks,

Allison
Questionuse with proxy model and response error 12030 Pin
david_jiang9-Apr-13 3:57
david_jiang9-Apr-13 3:57 
Generalan error :REQUEST_ERROR - error 12002, result API_RECEIVE_RESPONSE Pin
jackinelee23-Apr-10 21:43
jackinelee23-Apr-10 21:43 
GeneralRe: an error :REQUEST_ERROR - error 12002, result API_RECEIVE_RESPONSE Pin
zoufeiyy25-Mar-12 2:41
zoufeiyy25-Mar-12 2:41 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.