Files
cpp-httplib/docs-src/pages/ja/cookbook/s10-post-routing.md
T
yhirose 9bfd2ddf1c Fix README and docs pages that no longer match the code
Bring the READMEs and the docs pages (en and ja) in line with the
current header:

- Fix the client sample that does not compile, the Transfer-Encoding
  statement for default headers, the verifier callback comment, the
  thread pool spawn rule, the sanitize_filename description, and the
  inverted Accept-Encoding sentence.
- Describe recent behaviour: TLS errors behind Read/Write failures,
  Host validation, Connection: close for a body without length,
  content_reader rules, refused CONNECT, WebSocketClient proxies,
  CPPHTTPLIB_INTERIM_RESPONSE_MAX_COUNT, the SSE event size limit, and
  the payload limit of the Stream API.
- Complete the API references of WebSocket, WebSocketClient and the
  stream:: helpers, and the SSE reconnect rules.
- Fix cookbook pages: keychain loading on every backend, received Close
  status, a multipart sample that trusted the client's file name, an
  echo sample that sent binary as text, SNI, pre-request handler scope,
  stop() with WebSocket handlers, and the thread pool notes.
- Restore the mutex in the LLM app's Chapter 5 code.
2026-10-18 10:13:57 -04:00

2.5 KiB

title, order, status
title order status
S10. Post-routing handlerでレスポンスヘッダーを追加する 29 draft

ハンドラが返したレスポンスに、あとから共通のヘッダーを追加したいことがあります。CORSヘッダー、セキュリティヘッダー、独自のリクエストIDなどです。こういうときはset_post_routing_handler()を使います。

基本の使い方

svr.set_post_routing_handler(
  [](const httplib::Request &req, httplib::Response &res) {
    res.set_header("X-Request-ID", generate_request_id());
  });

Post-routingハンドラは、ルートハンドラが実行された後、レスポンスが送信される前に呼ばれます。ここでres.set_header()やres.headers.erase()を使えば、全レスポンスに対して一括でヘッダーの追加・削除ができます。

CORSヘッダーを付ける

よくある用途がCORSです。

svr.set_post_routing_handler(
  [](const httplib::Request &req, httplib::Response &res) {
    res.set_header("Access-Control-Allow-Origin", "*");
    res.set_header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
    res.set_header("Access-Control-Allow-Headers", "Content-Type, Authorization");
  });

プリフライトリクエスト(OPTIONS)には別途ハンドラを登録するか、pre-routingハンドラで処理します。

svr.Options("/.*", [](const auto &req, auto &res) {
  res.status = 204;
});

/.*は正規表現のルートなので、CPPHTTPLIB_REGEX_ROUTE_PATH_MAX_LENGTH(デフォルトは256)より長いパスには適用されません。パスがそれより長くなりうるなら、pre-routingハンドラでOPTIONSを処理してください。

セキュリティヘッダーをまとめて付ける

ブラウザ向けのセキュリティヘッダーを一箇所で管理できます。

svr.set_post_routing_handler(
  [](const httplib::Request &req, httplib::Response &res) {
    res.set_header("X-Content-Type-Options", "nosniff");
    res.set_header("X-Frame-Options", "DENY");
    res.set_header("Referrer-Policy", "strict-origin-when-cross-origin");
  });

どのハンドラがレスポンスを作っても、同じヘッダーが付くようになります。

Note: Post-routingハンドラは、ルートにマッチしなかったリクエストや、エラーハンドラが返したレスポンスに対しても呼ばれます。ヘッダーをすべてのレスポンスに確実に付けたいときに便利です。