2011-03-06 111 views
2

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

这些都是我考虑的选项:

  1. 应用的gzip/zlib的使用在我的应用程序发出响应之前放气压缩
  2. 哈克的libevent的http.c揭露evhttp_connection-> bufev(中bufferevent对象),并应用一个过滤器的zlib用于传出数据

(无论读取来自Accept-Encoding头支持的压缩格式)

有没有一些更简单的方法可以忽略,还是这个差不多呢?

+1

这几乎是AFAICT。如果你干净地做了#2,我很乐意为它应用一个补丁。 libevent邮件列表中的一些人最近开始讨论重构evhttp后端:如果您仍然对黑客入侵感兴趣,您可能想加入其中。 – nickm 2011-04-29 06:07:40

回答

1

我使用这个小技巧来获取evhttp_connection的文件描述符,它就在你想要的指针旁边。这是一件令人讨厌的黑客攻击,但它很简单,而且更容易重建自由派。它已经在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); 

    // .... 
} 

综观(下)的结构定义,看来你想应该是使用(((无效*)this_connection)+ 8)或非常类似的东西访问的bufev。

struct evhttp_connection { 
    TAILQ_ENTRY(evhttp_connection) next; 

    evutil_socket_t fd; 
    struct bufferevent *bufev; 

    ... 
} 
+0

这是唯一的答案,并且在过去的2年里一直如此。请停止投票(本周-2)。它可能不漂亮,但它的工作原理。把你的问题与libevent的作者联系起来。注: OP声明:“Hack libevent的http.c”是一个选项。 – Orwellophile 2013-12-05 22:24:18