2

我在我的应用程序中使用 libevent2 来托管一个 http 服务器。我找不到压缩输出的内置方法。

这些是我正在考虑的选项:

  1. 在发送响应之前,在我的应用程序中使用 zlib 应用 gzip/deflate 压缩
  2. 破解 libevent 的 http.c 以暴露 evhttp_connection->bufev(bufferevent 对象),并对传出数据应用 zlib 过滤器

(两者都从 Accept-Encoding 标头中读取支持的压缩格式)

有没有更简单的方法我可以忽略,或者这差不多?

4

1 回答 1

1

我使用这个小技巧来获取 evhttp_connection 的文件描述符,它就在您想要的指针旁边。这是一个讨厌的 hack,但它很简单,也更容易重建 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);

  // ....
}

查看结构定义(下方),您想要的 bufev 似乎应该可以使用 (((void *)this_connection) + 8) 或非常类似的东西访问。

struct evhttp_connection { 
    TAILQ_ENTRY(evhttp_connection) next; 

    evutil_socket_t fd; 
    struct bufferevent *bufev; 

    ...   
}
于 2012-02-02T06:41:35.757 回答