разница между двумя обратными вызовами в libevent

В libevent оба следующих API будут вызывать функцию обратного вызова после завершения транзакции HTTP?

//from event2/http.h
/**
 * Creates a new request object that needs to be filled in with the request
 * parameters.  The callback is executed when the request completed or an
 * error occurred.
 */
struct evhttp_request *evhttp_request_new(
    void (*cb)(struct evhttp_request *, void *), void *arg);

/*The callback function will be called on the completion of the request after
 * the output data has been written and before the evhttp_request object
 * is destroyed ....*/
void evhttp_request_set_on_complete_cb(struct evhttp_request *req,
    void (*cb)(struct evhttp_request *, void *), void *cb_arg);

Формулировка evhttp_request_new(..) отличается от формулировки evhttp_request_set_on_complete_cb(..), но в моем тесте обратный вызов в evhttp_request_new(..) действительно вызывается в конце транзакции HTTP.


person packetie    schedule 03.08.2014    source источник


Ответы (1)


Я проверил эти функции в http.c (libevent 2.1.8) и обнаружил, что их внутреннее использование отличается:

1) evhttp_request_new() СОЗДАЕТ объект evhttp_request И УСТАНАВЛИВАЕТ req->cb, который ИСПОЛЬЗУЕТСЯ:

  • evhttp_connection_incoming_fail() ---> вызывает req->cb в качестве функции-ответа об этом сбое, который происходит откуда угодно - поврежденная ошибка, слишком длинный, функция первой линии и т. д.. .
  • evhttp_connection_done() ---> вызывает как (*req->cb)(req, req->cb_arg); сразу после обработки запроса/ответа.

Позиционируется по evhttp_connection и error

2) evhttp_request_set_on_complete_cb() УСТАНАВЛИВАЕТ req->on_complete_cb ДЛЯ СУЩЕСТВУЮЩЕГО объекта evhttp_request в дополнение к req->cb. ИСПОЛЬЗУЕТСЯ ТОЛЬКО: evhttp_send_done (эта функция вызывается из evhttp_send()->evhttp_write_buffer(): evcon->cb=evhttp_send_done() после того, как все запрошенные данные страницы отправлены / завершение запроса по частям).

Ставится после перезаписи данных и только если не произошла какая-либо ошибка.

person Eluny    schedule 20.04.2018