2013-07-22 4 views
0

: 제 어설 예상대로 통과하지만, 초침 즉 evhttp_request_get_connection (REQ)를 실패 response_cb에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; 
} 

는 NULL 반환한다. 왜 그런가요? evhttp_request_get_connection 청구에 대한

문서 :

요청 또는 NULL과 관련된 연결 오브젝트를 돌려줍니다.

하지만 여전히 연결되어 있습니다. 나는 아무 데서도 그것을 처분하지 않는다.

내가 잘못했거나 버그입니까 아니면 일부 모호한 기능입니까?

답변

0

연결이 이미 릴리스되었으므로 (닫힌 상태로 유지되거나 HTTP 킵 얼라이브가 활성화 된 상태로 열려 있으면 계속 열려 있기 때문에) 응답 포인터에서 연결 포인터를 가져올 수 없습니다.

요청 연결 필드 (evcon)가 NULL로 설정된 후 응답 콜백이 호출되는 evhttp_connection_done() (http.c, 780 - 817 행)을 볼 수 있습니다. 나는 evhttp API가 매우 명확하지 않다는 것에 동의한다.

+0

keep-alive는이 문제와 관련이없는 것처럼 보입니다. http.c : evhttp_connection_done()에 따르면 req-> evcon = NULL은 비 연결 유지 연결뿐만 아니라 모든 나가는 연결에 대해 설정됩니다. –

+0

예를 들어, 연결을 다시 사용할 수있는 모든 경우에 대한 철저한 검사가 아닙니다. 그런 식으로 생각하면 죄송합니다. –

관련 문제