mirror of
https://github.com/yhirose/cpp-httplib.git
synced 2026-08-21 17:45:02 +00:00
Add WebSocket TLS and timeout recipes to the Cookbook
T04 (mTLS) had grown a "WebSocketClient" subsection describing wss:// client certificates, and c12/t02 were getting similar WebSocketClient asides for timeouts and CA paths. The Cookbook's own index already separates WebSocket into its own category (W01-W04) from TLS/Security (T01-T05) and Client (C01-C19), so burying WebSocketClient specifics inside those pages fought the site's structure. Move that content into two new recipes under the WebSocket category instead: - W05: wss:// TLS setup (set_ca_cert_path CA directory parity, PemMemory client certificate) - W06: WebSocketClient's three timeouts, including the recently added chrono overloads T04, T02, C12, and W01 now carry a single reference link to the new pages instead of duplicated explanations, matching the site's existing cross-link convention. While rewriting T04's client-side section, noticed it documented SSLClient's file-path constructor but not its PemMemory one, even though the server-side section covered both forms for SSLServer. Added the missing PemMemory example so both sides are symmetric.
This commit is contained in:
@@ -48,3 +48,5 @@ cli.set_read_timeout(10s);
|
||||
```
|
||||
|
||||
> **Warning:** 読み取りタイムアウトは「1回の受信待ち」に対するタイムアウトです。大きなファイルのダウンロードで途中ずっとデータが流れている限り、リクエスト全体で30分かかっても発火しません。リクエスト全体の時間制限を設けたい場合は[C13. 全体タイムアウトを設定する](../c13-max-timeout)を使ってください。
|
||||
|
||||
> WebSocketクライアントのタイムアウト設定は[W06. タイムアウトを設定する](../w06-websocket-timeouts)を参照してください。
|
||||
|
||||
@@ -94,3 +94,5 @@ status: "draft"
|
||||
- [W02. ハートビートを設定する](w02-websocket-ping)
|
||||
- [W03. 接続クローズをハンドリングする](w03-websocket-close)
|
||||
- [W04. バイナリフレームを送受信する](w04-websocket-binary)
|
||||
- [W05. wss接続でTLSを設定する](w05-websocket-tls)
|
||||
- [W06. タイムアウトを設定する](w06-websocket-timeouts)
|
||||
|
||||
@@ -51,3 +51,5 @@ cli.enable_server_hostname_verification(false);
|
||||
> mbedTLSやwolfSSLバックエンドでも同じAPIが使えます。バックエンドの選び方は[T01. OpenSSL・mbedTLS・wolfSSLの選択指針](../t01-tls-backends)を参照してください。
|
||||
|
||||
> 失敗したときの詳細を調べる方法は[C18. SSLエラーをハンドリングする](../c18-ssl-errors)を参照してください。
|
||||
|
||||
> WebSocketクライアント(`wss://`)のTLS設定は[W05. wss接続でTLSを設定する](../w05-websocket-tls)を参照してください。
|
||||
|
||||
@@ -57,25 +57,21 @@ auto res = cli.Get("/");
|
||||
|
||||
`Client`ではなく`SSLClient`を直接使う点に注意してください。秘密鍵にパスワードがある場合は第5引数で渡せます。
|
||||
|
||||
## WebSocketクライアントの場合
|
||||
|
||||
`ws::WebSocketClient`にも同じ`PemMemory`構造体があり、`wss://`接続でクライアント証明書を使えます。
|
||||
クライアント側にも同じ`PemMemory`構造体があり、メモリ上のPEMからクライアント証明書を設定できます。
|
||||
|
||||
```cpp
|
||||
httplib::ws::WebSocketClient::PemMemory pem{};
|
||||
httplib::SSLClient::PemMemory pem{};
|
||||
pem.cert_pem = client_cert.data();
|
||||
pem.cert_pem_len = client_cert.size();
|
||||
pem.key_pem = client_key.data();
|
||||
pem.key_pem_len = client_key.size();
|
||||
|
||||
httplib::ws::WebSocketClient ws("wss://api.example.com/ws", pem);
|
||||
httplib::SSLClient cli("api.example.com", 443, pem);
|
||||
|
||||
if (ws.connect()) {
|
||||
ws.send("hello");
|
||||
}
|
||||
auto res = cli.Get("/");
|
||||
```
|
||||
|
||||
`ws://`(非TLS)のURLに`PemMemory`を渡した場合は黙って無視されます。ファイルパスから直接読み込むコンストラクタは用意されていないので、`SSLClient`と違いPEMをメモリ上に読み込んでから渡す必要があります。
|
||||
> WebSocketクライアント(`wss://`)でmTLSを使う場合は[W05. wss接続でTLSを設定する](../w05-websocket-tls)を参照してください。
|
||||
|
||||
## ハンドラからクライアント情報を取得する
|
||||
|
||||
|
||||
@@ -85,4 +85,4 @@ svr.new_task_queue = [] {
|
||||
|
||||
詳細は[S21. マルチスレッド数を設定する](../s21-thread-pool)を参照してください。
|
||||
|
||||
> **Note:** HTTPSサーバーの上でWebSocketを動かしたいときは、`httplib::Server`の代わりに`httplib::SSLServer`を使えば、同じ`WebSocket()`ハンドラがそのまま動きます。クライアント側は`wss://`スキームを指定するだけです。
|
||||
> **Note:** HTTPSサーバーの上でWebSocketを動かしたいときは、`httplib::Server`の代わりに`httplib::SSLServer`を使えば、同じ`WebSocket()`ハンドラがそのまま動きます。クライアント側は`wss://`スキームを指定するだけです。CA証明書やクライアント証明書の設定は[W05. wss接続でTLSを設定する](../w05-websocket-tls)を参照してください。
|
||||
|
||||
49
docs-src/pages/ja/cookbook/w05-websocket-tls.md
Normal file
49
docs-src/pages/ja/cookbook/w05-websocket-tls.md
Normal file
@@ -0,0 +1,49 @@
|
||||
---
|
||||
title: "W05. wss接続でTLSを設定する"
|
||||
order: 55
|
||||
status: "draft"
|
||||
---
|
||||
|
||||
`wss://`(WebSocket over TLS)接続のクライアント側TLS設定は、`SSLClient`とほぼ同じAPIです。`ws::WebSocketClient`は`ws://`と`wss://`を同じクラスで扱うので、`SSLClient`のような別クラスへの切り替えは不要です。
|
||||
|
||||
```cpp
|
||||
httplib::ws::WebSocketClient ws1("ws://localhost:8080/ws"); // 平文
|
||||
httplib::ws::WebSocketClient ws2("wss://localhost:8443/ws"); // TLS
|
||||
```
|
||||
|
||||
## サーバー証明書の検証
|
||||
|
||||
`set_ca_cert_path()`で独自のCA証明書を指定できます。シグネチャは`SSLClient`と同じで、第1引数がCA証明書ファイル、第2引数がCA証明書ディレクトリ(省略可)です。
|
||||
|
||||
```cpp
|
||||
httplib::ws::WebSocketClient ws("wss://internal.example.com/ws");
|
||||
ws.set_ca_cert_path("/etc/ssl/certs/internal-ca.pem");
|
||||
|
||||
if (ws.connect()) {
|
||||
ws.send("hello");
|
||||
}
|
||||
```
|
||||
|
||||
証明書検証そのものを無効にしたい場合は`enable_server_certificate_verification(false)`が使えます。挙動の詳細は[T02. SSL証明書の検証を制御する](../t02-cert-verification)を参照してください。
|
||||
|
||||
## クライアント証明書を使う(mTLS)
|
||||
|
||||
`ws::WebSocketClient`には`PemMemory`構造体を受け取るコンストラクタがあり、`wss://`接続でクライアント証明書を提示できます。
|
||||
|
||||
```cpp
|
||||
httplib::ws::WebSocketClient::PemMemory pem{};
|
||||
pem.cert_pem = client_cert.data();
|
||||
pem.cert_pem_len = client_cert.size();
|
||||
pem.key_pem = client_key.data();
|
||||
pem.key_pem_len = client_key.size();
|
||||
|
||||
httplib::ws::WebSocketClient ws("wss://api.example.com/ws", pem);
|
||||
|
||||
if (ws.connect()) {
|
||||
ws.send("hello");
|
||||
}
|
||||
```
|
||||
|
||||
`ws://`(非TLS)のURLに`PemMemory`を渡した場合は黙って無視されます。`SSLClient`と違い、ファイルパスから直接読み込むコンストラクタは用意されていないので、PEMをメモリ上に読み込んでから渡す必要があります。
|
||||
|
||||
mTLSの全体像(サーバー側の設定や用途の解説を含む)は[T04. mTLSを設定する](../t04-mtls)を参照してください。
|
||||
51
docs-src/pages/ja/cookbook/w06-websocket-timeouts.md
Normal file
51
docs-src/pages/ja/cookbook/w06-websocket-timeouts.md
Normal file
@@ -0,0 +1,51 @@
|
||||
---
|
||||
title: "W06. タイムアウトを設定する"
|
||||
order: 56
|
||||
status: "draft"
|
||||
---
|
||||
|
||||
`ws::WebSocketClient`には`Client`と同じ3種類のタイムアウトがあり、意味も同じです。
|
||||
|
||||
| 種類 | API | デフォルト |
|
||||
| --- | --- | --- |
|
||||
| 接続タイムアウト | `set_connection_timeout` | 300秒 |
|
||||
| 読み取りタイムアウト | `set_read_timeout` | 300秒(`CPPHTTPLIB_WEBSOCKET_READ_TIMEOUT_SECOND`) |
|
||||
| 書き込みタイムアウト | `set_write_timeout` | 5秒 |
|
||||
|
||||
## 基本の使い方
|
||||
|
||||
```cpp
|
||||
httplib::ws::WebSocketClient ws("ws://localhost:8080/ws");
|
||||
|
||||
ws.set_connection_timeout(5, 0); // 5秒
|
||||
ws.set_read_timeout(30, 0); // 30秒
|
||||
ws.set_write_timeout(10, 0); // 10秒
|
||||
|
||||
if (ws.connect()) {
|
||||
ws.send("hello");
|
||||
}
|
||||
```
|
||||
|
||||
`connect()`を呼ぶ前に設定してください。
|
||||
|
||||
## `std::chrono`で指定する
|
||||
|
||||
`Client`と同じく、`std::chrono`の期間を直接渡すオーバーロードもあります。
|
||||
|
||||
```cpp
|
||||
using namespace std::chrono_literals;
|
||||
|
||||
ws.set_connection_timeout(5s);
|
||||
ws.set_read_timeout(30s);
|
||||
ws.set_write_timeout(10s);
|
||||
```
|
||||
|
||||
## 読み取りタイムアウトの意味に注意
|
||||
|
||||
`set_read_timeout()`は「1回の`read()`呼び出し」に対するタイムアウトです。メッセージが届かないまま指定時間が経過すると`read()`が`ReadResult::Fail`を返します。通知の待受のように長時間メッセージが来ないことが正常な接続では、意図せず切断されないよう長めに設定するか、切断されたらアプリケーション側で再接続してください。
|
||||
|
||||
> Ping/Pongによる無応答ピア検出は別の仕組みです。詳しくは[W02. ハートビートを設定する](../w02-websocket-ping)を参照してください。
|
||||
|
||||
## `Client`との違い
|
||||
|
||||
`Client`のタイムアウト設定については[C12. タイムアウトを設定する](../c12-timeouts)を参照してください。挙動とAPIはほぼ同じですが、`WebSocketClient`には`set_max_timeout()`に相当するリクエスト全体のタイムアウトはありません。接続を確立したあとは、`read()`のループを回し続ける限り接続が維持されます。
|
||||
Reference in New Issue
Block a user