2

アプリケーションで libevent2 を使用して http サーバーをホストしています。出力を圧縮する組み込みの方法が見つかりません。

これらは私が検討しているオプションです:

  1. 応答を送信する前に、アプリで zlib を使用して gzip/deflate 圧縮を適用します
  2. libevent の http.c をハックして evhttp_connection->bufev (bufferevent オブジェクト) を公開し、発信データに zlib フィルターを適用します。

(両方とも、サポートされている圧縮形式を Accept-Encoding ヘッダーから読み取ります)

私が見落としている簡単な方法はありますか、それともこれで十分ですか?

4

1 に答える 1

1

この小さなトリックを使用して、目的のポインターのすぐ隣にある 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) または非常に類似したものを使用して、必要な bufev にアクセスできるように見えます。

struct evhttp_connection { 
    TAILQ_ENTRY(evhttp_connection) next; 

    evutil_socket_t fd; 
    struct bufferevent *bufev; 

    ...   
}
于 2012-02-02T06:41:35.757 に答える