为什么evhttp_request_get_connection()总是返回NULL?

时间:2013-07-22 10:17:41

标签: http null connection request libevent

在以下示例程序中:

#include <event2/event.h>
#include <event2/http.h>
#include <assert.h>

void response_cb(struct evhttp_request* req, void *arg) {
    assert(evhttp_request_get_response_code(req)<400);/* passes */
    assert(evhttp_request_get_connection(req));/* FAILS ??? */
}

int main(int argc, char **argv) {
    struct event_base* ev_base;
    struct evhttp_connection *http_conn;
    struct evhttp_request *req;

    ev_base = event_base_new();
    http_conn = evhttp_connection_base_new(ev_base, NULL, "google.com", 80);
    req = evhttp_request_new(response_cb, NULL);

    evhttp_make_request(http_conn, req, EVHTTP_REQ_GET, "/");

    event_base_dispatch(ev_base);
    return -1;
}

在response_cb中,第一个断言按预期传递,但秒失败,即evhttp_request_get_connection(req)返回NULL。那是为什么?

evhttp_request_get_connection的文档声称:

  

返回与请求关联的连接对象或NULL。

但我仍然有联系。我不会把它丢弃在任何地方。

我做错了什么,或者这是一个错误还是一些不起眼的功能?

1 个答案:

答案 0 :(得分:0)

您无法在响应回调中获得指向连接的指针,因为连接已被释放(如果启用了HTTP keepalive,则已关闭或保持打开状态。)

您可以在evhttp_connection_done()(http.c,第780行到第817行)中看到在请求的连接字段(evcon)设置为NULL后调用响应回调。我确实同意evhttp API不是很清楚。