mirror of
https://github.com/yhirose/cpp-httplib.git
synced 2026-10-21 11:39:48 +00:00
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.
This commit is contained in:
1 parent
94cf1b5c9a
commit
9bfd2ddf1c
77 files changed
+378
-145
No files matched your search
@@ -48,22 +48,30 @@ svr.Post("/upload",
|
||||
const httplib::ContentReader &content_reader) {
|
||||
std::ofstream ofs;
|
||||
|
||||
content_reader(
|
||||
auto ok = content_reader(
|
||||
[&](const httplib::FormData &file) {
|
||||
if (!file.filename.empty()) {
|
||||
ofs.open("uploads/" + file.filename, std::ios::binary);
|
||||
}
|
||||
return static_cast<bool>(ofs);
|
||||
if (ofs.is_open()) { ofs.close(); } // 前のファイルを閉じる
|
||||
if (file.filename.empty()) { return true; } // 普通のフィールドは読み飛ばす
|
||||
|
||||
auto name = httplib::sanitize_filename(file.filename);
|
||||
if (name.empty()) { return false; } // 安全でない名前は拒否
|
||||
|
||||
ofs.open("uploads/" + name, std::ios::binary);
|
||||
return ofs.is_open();
|
||||
},
|
||||
[&](const char *data, size_t len) {
|
||||
if (!ofs.is_open()) { return true; } // ファイルのパートではない
|
||||
ofs.write(data, len);
|
||||
return static_cast<bool>(ofs);
|
||||
});
|
||||
|
||||
if (!ok) { return; } // ステータスは設定済み
|
||||
res.set_content("uploaded", "text/plain");
|
||||
});
|
||||
```
|
||||
|
||||
ヘッダーのコールバックはパートごとに呼ばれるので、次のファイルを開く前に前のファイルを閉じています。`file.filename`はクライアントが送ってきた値そのままなので、必ず`httplib::sanitize_filename()`を通してください。空文字列が返ったら、安全でない名前です。
|
||||
|
||||
メモリには常に小さなチャンクしか載らないので、ギガバイト級のファイルでも扱えます。
|
||||
|
||||
## パート数は自分で数える
|
||||
|
||||
Reference in new issue
Block a user