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

为什么evhttp_request_get_connection()总是返回NULL?,http,null,connection,request,libevent,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_requ

在以下示例程序中:

#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;
}
#包括
#包括
#包括
无效响应\u cb(结构evhttp\u请求*请求,无效*参数){

assert(evhttp_request_get_response_code(req)您无法在响应回调中获取指向该连接的指针,因为该连接已被释放(如果启用了HTTP keepalive,则在重用之前关闭或保持打开)


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

保持活动似乎与此问题无关。根据http.c:evhttp_connection_done()req->evcon=NULL是为所有传出连接设置的,而不仅仅是为非保持活动的连接设置的。这只是一个示例,并不是对所有可能重用连接的情况进行彻底检查。如果是这样的话,我很抱歉。