2013-07-22 4 views
0

В следующем примере программы:Почему evhttp_request_get_connection() всегда возвращает NULL?

#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.

Но у меня все еще есть соединение. Я не распоряжаюсь им нигде.

Я делаю что-то неправильно или это ошибка или просто какая-то неясная особенность?

ответ

0

Вы не можете получить указатель на соединение в обратном вызове ответа, так как соединение уже выпущено (закрыто или поддерживается открытым для повторного использования, если включен HTTP keepalive).

Вы можете увидеть в evhttp_connection_done() (http.c, вокруг строк 780-817), что ответный вызов ответа вызывается после того, как поле подключения запроса (evcon) было установлено в NULL. Я согласен с тем, что API evhttp не очень ясен.

+0

keep-alive, похоже, не имеет ничего общего с этой проблемой. Согласно http.c: evhttp_connection_done() req-> evcon = NULL задается для всех исходящих соединений не только для соединений, не поддерживающих связь. –

+0

Ну, это был пример, а не полная проверка всех случаев, когда соединение может быть повторно использовано. Извините, если это так. –

Смежные вопросы