S08. レスポンスを圧縮して返す
cpp-httplibは、クライアントがAccept-Encodingで対応を表明していれば、レスポンスボディを自動で圧縮してくれます。ハンドラ側で特別なことをする必要はありません。対応しているのはgzip、Brotli、Zstdです。
ビルド時の準備
圧縮機能を使うには、httplib.hをインクルードする前に対応するマクロを定義しておきます。
#define CPPHTTPLIB_ZLIB_SUPPORT // gzip #define CPPHTTPLIB_BROTLI_SUPPORT // brotli #define CPPHTTPLIB_ZSTD_SUPPORT // zstd #include <httplib.h>
#define CPPHTTPLIB_ZLIB_SUPPORT // gzip #define CPPHTTPLIB_BROTLI_SUPPORT // brotli #define CPPHTTPLIB_ZSTD_SUPPORT // zstd #include <httplib.h>
それぞれzlib、brotli、zstdをリンクする必要があります。必要な圧縮方式だけ有効にすればOKです。
使い方
svr.Get("/api/data", [](const httplib::Request &req, httplib::Response &res) { std::string body = build_large_response(); res.set_content(body, "application/json"); });
svr.Get("/api/data", [](const httplib::Request &req, httplib::Response &res) { std::string body = build_large_response(); res.set_content(body, "application/json"); });
これだけです。クライアントがAccept-Encoding: gzipを送ってきていれば、cpp-httplibが自動でgzip圧縮して返します。レスポンスにはContent-Encoding: gzipとVary: Accept-Encodingが自動で付きます。
圧縮の優先順位
クライアントが複数の方式を受け入れる場合、Brotli → Zstd → gzipの順に選ばれます(ビルドで有効になっている中から)。クライアント側では気にせず、一番効率の良い方式で圧縮されます。
ストリーミングレスポンスも圧縮される
set_chunked_content_provider()で返すストリーミングレスポンスも、同じように自動で圧縮されます。
svr.Get("/events", [](const httplib::Request &req, httplib::Response &res) { res.set_chunked_content_provider( "text/plain", [](size_t offset, httplib::DataSink &sink) { // ... }); });
svr.Get("/events", [](const httplib::Request &req, httplib::Response &res) { res.set_chunked_content_provider( "text/plain", [](size_t offset, httplib::DataSink &sink) { // ... }); });
Note: 小さなレスポンスは圧縮しても効果が薄く、むしろCPU時間を無駄にすることがあります。cpp-httplibは小さすぎるボディは圧縮をスキップします。
クライアント側の挙動はC15. 圧縮を有効にするを参照してください。