Libevent HTTP 服务器和压缩?

Posted

技术标签:

【中文标题】Libevent HTTP 服务器和压缩?【英文标题】:Libevent HTTP Server & compression? 【发布时间】:2011-03-06 11:41:19 【问题描述】:

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

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

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

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

我是否有一些更简单的方法可以忽略,还是差不多?

【问题讨论】:

AFAICT 差不多了。如果你干净地完成了#2,我很乐意为它应用补丁。 libevent 邮件列表中的一些人最近开始讨论重构 evhttp 后端:如果您仍然对破解它感兴趣,您可能想加入其中。 【参考方案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; 

    ...   

【讨论】:

这是唯一的答案,过去 2 年一直如此。请停止投票(本周-2)。它可能不漂亮,但它有效。带您向 libevent 的作者提出问题。注: OP 声明:“Hack libevent's http.c”作为一个选项。

以上是关于Libevent HTTP 服务器和压缩?的主要内容,如果未能解决你的问题,请参考以下文章

知道任何使用 libevent 实现 HTTP 服务的小项目吗?

带有 libevent 的多线程 HTTP 服务器

从 libevent 中的 HTTP 服务器响应中获取所有 HTTP 标头

Libevent + Comet(长轮询/Http-Stream)

Ubuntu中libevent的安装步骤

Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(无数截图)