HTTP-сервер Libevent и сжатие? - PullRequest
2 голосов
/ 06 марта 2011

Я использую libevent2 в своем приложении для размещения http-сервера.Я не могу найти встроенный способ сжатия вывода.

Вот варианты, которые я рассматриваю:

  1. Примените сжатие gzip / deflate с помощью zlib в моем приложении перед отправкойответ
  2. Взломайте http.c для libevent, чтобы открыть evhttp_connection-> bufev (объект bufferevent), и примените фильтр zlib для исходящих данных

(оба считывают поддерживаемые форматы сжатиязаголовок Accept-Encoding)

Есть ли какой-то более простой способ, которым я пропускаю, или это в значительной степени так?

1 Ответ

1 голос
/ 02 февраля 2012

Я использую этот маленький трюк, чтобы получить файловый дескриптор evhttp_connection, который находится рядом с указателем, который вы хотите. Это неприятный хак, но он проще и проще, чем перестраивать libevent. Он был протестирован под x86_64 и работает нормально.

static void
send_document_cb(struct evhttp_request *req, void *arg)
{
  // ....

  struct evhttp_connection *this_connection;
  this_connection = evhttp_request_get_connection(req);

  int *tricky;
  tricky = (((int *)this_connection) + 4);
  int fd = *tricky;

  printf("fd: %i\n", fd);

  // ....
}

Глядя на определение структуры (ниже), кажется, что требуемый буфер должен быть доступен с помощью (((void *) this_connection) + 8) или чего-то очень похожего.

struct evhttp_connection { 
    TAILQ_ENTRY(evhttp_connection) next; 

    evutil_socket_t fd; 
    struct bufferevent *bufev; 

    ...   
}
...