Files
cpp-httplib/docs-src/pages/ja/cookbook/c16-proxy.md
yhirose 8c20221ab8 Document NO_PROXY and set_proxy_from_env in cookbook c16-proxy
Replaces the now-incorrect Note at the bottom of c16-proxy ("cpp-httplib
does not read HTTP_PROXY...") with the actual API.

JA is the master per the project's translation workflow; the EN
translation lands in the same PR. Both pages remain `status: "draft"`
for normal review.

Adds two sections:

  - Bypass the proxy for specific hosts (set_no_proxy):
    pattern syntax, dot-boundary rule, case-insensitivity, IP
    normalization via inet_pton, port-specific-entries unsupported,
    malformed entries dropped.

  - Read proxy settings from the environment (set_proxy_from_env):
    which variables are read, lowercase-only http_proxy with an
    inline httpoxy / CVE-2016-5385 explanation, threading caveat.
2026-05-24 22:44:12 -04:00

4.5 KiB
Raw Blame History

title, order, status
title order status
C16. プロキシを経由してリクエストを送る 16 draft

社内ネットワークや特定の経路を通したい場合、HTTPプロキシを経由してリクエストを送れます。set_proxy()でプロキシのホストとポートを指定するだけです。

基本の使い方

httplib::Client cli("https://api.example.com");
cli.set_proxy("proxy.internal", 8080);

auto res = cli.Get("/users");

プロキシ経由でリクエストが送られます。HTTPSの場合はCONNECTメソッドでトンネルが張られるので、cpp-httplib側で特別な設定は要りません。

プロキシに認証を設定する

プロキシ自体が認証を要求する場合は、set_proxy_basic_auth()set_proxy_bearer_token_auth()を使います。

cli.set_proxy("proxy.internal", 8080);
cli.set_proxy_basic_auth("user", "password");
cli.set_proxy_bearer_token_auth("token");

OpenSSLまたは他のTLSバックエンド付きでビルドしていれば、Digest認証も使えます。

cli.set_proxy_digest_auth("user", "password");

エンドのサーバー認証と組み合わせる

プロキシ認証と、エンドサーバーへの認証(C05. Basic認証を使うC06. BearerトークンでAPIを呼ぶ)は別物です。両方が必要なら、両方設定します。

cli.set_proxy("proxy.internal", 8080);
cli.set_proxy_basic_auth("proxy-user", "proxy-pass");

cli.set_bearer_token_auth("api-token"); // エンドサーバー向け

プロキシにはProxy-Authorization、エンドサーバーにはAuthorizationヘッダーが送られます。

特定のホストだけプロキシをバイパスする

社内エンドポイントなどはプロキシを経由させたくないことがあります。set_no_proxy()で除外リストを指定できます。

cli.set_proxy("proxy.internal", 8080);
cli.set_no_proxy({"internal.corp", "10.0.0.0/8", "*.dev.local"});

エントリは次のいずれかです。

  • * — すべてのホストでバイパス
  • ホスト名サフィックス(例: example.com)— example.com本体と任意のサブドメイン(foo.example.com)にマッチ。先頭にドットを付けても同じ意味です(.example.com)。
  • 単一のIPリテラル例: 192.168.1.1::1
  • CIDRブロック例: 10.0.0.0/8fe80::/10

ホスト名のマッチは大文字小文字を区別せず、ドット境界でしか一致しません。たとえばexample.comというエントリはevilexample.comにはマッチしません。IPの比較はinet_ptonで正規化されるので、127.0.0.1127.000.000.001のような別表記でバイパスすることはできません。マッチした場合、Proxy-Authorizationヘッダーも自動的に外れます。

不正な書式のエントリは黙って捨てられます。example.com:8080のようなポート指定エントリはサポート外ですcpp-httplibの他のホストキーAPIもホスト名のみを扱う設計のため

環境変数からプロキシ設定を読み込む

set_proxy_from_env()を呼ぶと、起動時の環境変数からプロキシ設定をまとめて取り込めます。

httplib::Client cli("https://api.example.com");
cli.set_proxy_from_env();

読み込まれる変数:

  • https_proxy / HTTPS_PROXY — HTTPSクライアントが使用
  • http_proxy小文字のみ、後述)— HTTPクライアントが使用
  • no_proxy / NO_PROXY — カンマ区切りのバイパスリスト

少なくとも1つの変数が見つかって適用されたらtrueを返します。

Security Note: 大文字のHTTP_PROXYは意図的に読まれません。CGI/FastCGI環境ではHTTP_*という名前空間がHTTPリクエストヘッダーの公開に使われており、攻撃者がProxy:リクエストヘッダーで任意のプロキシURLを差し込めてしまうためですCVE-2016-5385 / "httpoxy"。curl・Go・Python requestsと同じく、cpp-httplibも小文字のhttp_proxyしか採用しません。HTTPS_PROXYNO_PROXYは名前がHTTP_で始まらないので、どちらの大文字小文字でも安全です。

Note: set_proxy_from_env()は同期的にgetenvを呼ぶだけなので、起動時に1回呼ぶことを想定しています。他スレッドが同時にsetenvしているケースは未定義です。