Libevent HTTP 服务器和压缩?

发布于 2024-10-20 16:18:16 字数 315 浏览 5 评论 0原文

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

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

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

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

是否有一些我忽略的更简单的方法,或者就是这样?

I'm using libevent2 in my application to host a http server. I cant find a built-in way to compress the output.

These are the options I'm considering:

  1. Apply gzip/deflate compression using zlib in my app before sending out the response
  2. Hack libevent's http.c to expose evhttp_connection->bufev (the bufferevent object), and apply a zlib filter for outgoing data

(Both read the supported compression formats from the Accept-Encoding header)

Is there some easier way I'm overlooking, or is this pretty much it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

美人如玉 2024-10-27 16:18:16

我使用这个小技巧来获取 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);

  // ....
}

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

struct evhttp_connection { 
    TAILQ_ENTRY(evhttp_connection) next; 

    evutil_socket_t fd; 
    struct bufferevent *bufev; 

    ...   
}

I use this little trick to obtain the file descriptor of an evhttp_connection, which is right next to the pointer you want. It's a nasty hack, but it's simple, and easier that having to rebuild libevent. It has been tested under x86_64 and runs fine.

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);

  // ....
}

Looking at the structure definition (beneath), it appears the bufev you want should be accessible using (((void *)this_connection) + 8) or something very similar.

struct evhttp_connection { 
    TAILQ_ENTRY(evhttp_connection) next; 

    evutil_socket_t fd; 
    struct bufferevent *bufev; 

    ...   
}
调妓 2024-10-27 16:18:16

在 2022 年获得 FD 套接字的非 hacky 方法:

static void _genericCallback( evhttp_request *req, void *arg )
{
    evhttp_connection *conn = evhttp_request_get_connection( req );
    if( conn )
    {
        bufferevent *buffevt = evhttp_connection_get_bufferevent( conn );
        if( buffevt )
        {
            evutil_socket_t fd = bufferevent_getfd( buffevt );
            if( fd >= 0 )
            {
                // Use the socket
                setsockopt( fd, ... );
            }
        }
    }
}

evhttp_set_gencb( server, _genericCallback, 0 );

Non-hacky way to get the FD socket in 2022:

static void _genericCallback( evhttp_request *req, void *arg )
{
    evhttp_connection *conn = evhttp_request_get_connection( req );
    if( conn )
    {
        bufferevent *buffevt = evhttp_connection_get_bufferevent( conn );
        if( buffevt )
        {
            evutil_socket_t fd = bufferevent_getfd( buffevt );
            if( fd >= 0 )
            {
                // Use the socket
                setsockopt( fd, ... );
            }
        }
    }
}

evhttp_set_gencb( server, _genericCallback, 0 );
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文