Я пытаюсь сделать частичный ответ (больших файлов) в libevent следующим образом: *
evhttp_send_reply_start(request, HTTP_OK, "OK");
int fd = open("filename", O_RDONLY);
size_t fileSize = <get_file_size>;
struct evbuffer *databuff = NULL;
for (off_t offset = 0;offset < fileSize;)
{
databuff = evbuffer_new();
size_t bytesLeft = fileSize - offset;
size_t bytesToRead = bytesLeft > MAX_READ_SIZE ? MAX_READ_SIZE : bytesLeft;
evbuffer_add_file(databuff, fd, offset, bytesToRead);
offset += bytesToRead;
evhttp_send_reply_chunk(request, databuff); // send it
evbuffer_free(databuff); // destroy it
}
evhttp_send_reply_end(request);
fclose(fptr);
Проблема в том, что у меня такое чувство, что add_file асинхронный, поэтому 3-й или около того evhttp_send_reply_chunk
выдает мне ошибку (или что-то подобное):
[warn] evhttp_send_chain Закрыт (45): Неверный дескриптор файла
Я установил MAX_READ_SIZE
равным 8
, чтобы фактически проверить кодирование передачи по частям.
Я заметил, что есть метод evhttp_request_set_chunked_cb (struct evhttp_request *, void(*cb)(struct evhttp_request *, void *))
, который я мог бы использовать, но не смог найти примеров того, как его использовать.
Например, как я могу передать аргумент обратному вызову? Кажется, что аргумент - это тот же аргумент, который был передан в обработчик запроса, но это не то, что мне нужно, потому что я хочу создать объект, содержащий дескриптор файла и смещение файла, которое я отправляю.
Ценю всю помощь.
Заранее спасибо
Sri