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.
4.5 KiB
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/8、fe80::/10)
ホスト名のマッチは大文字小文字を区別せず、ドット境界でしか一致しません。たとえばexample.comというエントリはevilexample.comにはマッチしません。IPの比較はinet_ptonで正規化されるので、127.0.0.1を127.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・Pythonrequestsと同じく、cpp-httplibも小文字のhttp_proxyしか採用しません。HTTPS_PROXYやNO_PROXYは名前がHTTP_で始まらないので、どちらの大文字小文字でも安全です。
Note:
set_proxy_from_env()は同期的にgetenvを呼ぶだけなので、起動時に1回呼ぶことを想定しています。他スレッドが同時にsetenvしているケースは未定義です。