#include#include#include#include#include#include#includestructdownload_context{structevhttp_uri*uri;structevent_b" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

libevent http client

系統 1668 0

#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include <event2/event.h>
#include <event2/buffer.h>
#include <event2/http.h>
#include <event2/http_struct.h>

struct download_context
{
??? struct evhttp_uri *uri;
??? struct event_base *base;
??? struct evhttp_connection *cn;
??? struct evhttp_request *req;
??? struct evbuffer *buffer;
??? int ok;
};

static void download_callback(struct evhttp_request *req, void *arg);

static int download_renew_request(struct download_context *ctx);

static void download_callback(struct evhttp_request *req, void *arg)
{
??? struct download_context *ctx = (struct download_context *)arg;
??? struct evhttp_uri *new_uri = NULL;
??? const char *new_location = NULL;

??? /*? response is ready */

??? switch(req->response_code)
??? {
??????? case HTTP_OK:
??????????? /*?
???????????? *?????????? * Response is received. No futher handling is required.
???????????? *?????????????????? * Finish
???????????? *?????????????????????????? */
??????????? event_base_loopexit(ctx->base, 0);
??????????? break;

??????? case HTTP_MOVEPERM:
??????? case HTTP_MOVETEMP:
??????????? new_location = evhttp_find_header(req->input_headers, "Location");
??????????? if (!new_location)
??????????????? return;

??????????? new_uri = evhttp_uri_parse(new_location);
??????????? if (!new_uri)
??????????????? return;

??????????? evhttp_uri_free(ctx->uri);
??????????? ctx->uri = new_uri;

??????????? download_renew_request(ctx);
??????????? return;

??????? default:
??????????? /*? FAILURE */
??????????? event_base_loopexit(ctx->base, 0);
??????????? return;
??? }

??? evbuffer_add_buffer(ctx->buffer, req->input_buffer);

??? /*? SUCCESS */
??? ctx->ok = 1;
}

struct download_context *context_new(const char *url)
{
??? struct download_context *ctx = 0;
??? ctx = new (struct download_context);//(struct download_context*)calloc(0, sizeof(*ctx));
??? if (!ctx)
??????? return 0;

??? ctx->uri = evhttp_uri_parse(url);
??? if (!ctx->uri)
??????? return 0;

??? ctx->base = event_base_new();
??? if (!ctx->base)
??????? return 0;

??? ctx->buffer = evbuffer_new();

??? download_renew_request(ctx);

??? return ctx;
}

void context_free(struct download_context *ctx)
{
??? evhttp_connection_free(ctx->cn);
??? event_base_free(ctx->base);

??? if (ctx->buffer)
??????? evbuffer_free(ctx->buffer);

??? evhttp_uri_free(ctx->uri);
??? free(ctx);
}

static int download_renew_request(struct download_context *ctx)
{
??? /*? free connections & request */
??? if (ctx->cn)
??????? evhttp_connection_free(ctx->cn);

??? ctx->cn = evhttp_connection_base_new(ctx->base, NULL, "127.0.0.1", 56777);

??? ctx->req = evhttp_request_new(download_callback, ctx);

??? evhttp_make_request(ctx->cn, ctx->req, EVHTTP_REQ_GET, "/Hello");

??? evhttp_add_header(ctx->req->output_headers, "Host", "127.0.0.1");
??? return 0;
}

struct evbuffer *download_url(const char *url)
{
??? /*? setup request, connection etc */

??? struct download_context *ctx = context_new(url);
??? if (!ctx)
??????? return 0;

??? /*? do all of the job */
??? event_base_dispatch(ctx->base);

??? struct evbuffer *retval = 0;
??? if (ctx->ok)
??? {
??????? retval = ctx->buffer;
??????? ctx->buffer = 0;
??? }

??? context_free(ctx);

??? return retval;
}

int main(int argc, char *argv[])
{
??? if (argc < 2)
??? {
??????? printf("usage: %s example.com/\n", argv[0]);
??????? return 1;
??? }

??? struct evbuffer *data = download_url(argv[1]);

??? printf("got %d bytes\n", data ? evbuffer_get_length(data) : -1);

??? if (data)
??? {
??????? const unsigned char *joined = evbuffer_pullup(data, -1);
??????? printf("data itself:\n====================\n");
??????? ::write(1, joined, evbuffer_get_length(data));
??????? printf("\n====================\n");

??????? evbuffer_free(data);
??? }

??? return 0;
}

libevent http client


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲欧美一区二区三区在线 | 美女很黄很黄免费 | 四虎影院入口 | 亚洲一区二区三区麻豆 | 西西大胆实体啪啪色哟哟 | 91精品国产91久久久久久 | 亚洲欧美精品成人久久91 | 日韩美女va在线毛片免费知 | 日本一级特黄毛片免费视频 | 色中色资源站 | 99久久亚洲综合精品网站 | 天天操夜夜操视频 | 精品久久香蕉国产线看观看亚洲 | 韩国午夜影院 | 色综合天天综合网国产国产人 | 国产精品亚洲综合一区 | 伊人伊人影院 | 欧美黄色a| 亚洲特级aaaaaa毛片 | www.91在线观看 | 亚洲五月综合缴情婷婷 | 亚洲欧美精品一区二区 | 男人天堂免费 | 国产在线成人精品 | 一久久| 国产亚洲综合在线 | 日日天干夜夜人人添 | 狠狠色噜噜狠狠狠狠97老肥女 | 国产aaaaaaa毛片 | 色五月在线视频 | 欧美一区二区三区网站 | 一本大道香蕉大在线最新 | 农村三级孕妇视频在线 | 成人黄色免费 | 91成人午夜在线精品 | 婷婷免费在线 | 激情久久久久久久久久久 | 亚洲va国产日韩欧美精品色婷婷 | 欧美毛片一级的免费的 | 精品国产精品久久一区免费式 | 国产精品一区二区资源 |