diff --git a/doc/http2-guide.md b/doc/http2-guide.md index 46e6e92..bd94a2a 100644 --- a/doc/http2-guide.md +++ b/doc/http2-guide.md @@ -319,7 +319,7 @@ void doc_h2_client_submit(uvcpp::uvcpp_h2_connection* conn) { `tls_alpn_selected()`(`src/web/uvcpp_http_client.cpp:327-327`)→ `start_h2()`(`src/web/uvcpp_http_client.cpp:331-331` → `src/web/uvcpp_http_client.cpp:2048-2048`)→ 装回调(`src/web/uvcpp_http_client.cpp:2050-2050`) → `h2_->start(sc, cc)`(`src/web/uvcpp_http_client.cpp:2091-2091`)→ `send()` 分流到 `send_h2`(`src/web/uvcpp_http_client.cpp:489-489`)。 -**`set_http2_enabled` 默认是关的**(`src/web/uvcpp_http_client.h:684-684`、 +**`set_http2_enabled` 默认是关的**(`src/web/uvcpp_http_client.h:686-686`、 `src/web/uvcpp_http_server.h:357-357`)—— 低层的两条线都要显式打开, 只有 `webapp/` 框架层是零配置自动协商。 diff --git a/doc/http2-status.md b/doc/http2-status.md index 4f23018..e15cf51 100644 --- a/doc/http2-status.md +++ b/doc/http2-status.md @@ -73,7 +73,7 @@ ### 1.3 三个接入面 -- **低层库**:`uvcpp_http_client::set_http2_enabled`(`src/web/uvcpp_http_client.h:432-432`) +- **低层库**:`uvcpp_http_client::set_http2_enabled`(`src/web/uvcpp_http_client.h:434-434`) 与 `uvcpp_http_server::set_http2_enabled`(`src/web/uvcpp_http_server.h:355-355`), **都默认关**。 - **框架(webapp)**:零配置自动协商。ALPN 名单里 `h2` 在前 diff --git a/doc/http3-guide.md b/doc/http3-guide.md index 652028e..d2318bb 100644 --- a/doc/http3-guide.md +++ b/doc/http3-guide.md @@ -287,7 +287,7 @@ void connect_over_http3(uvcpp_http_client& cli, int udp_port) { ``` - `uvcpp_http_server::listen_quic()` 在 `src/web/uvcpp_http_server.h:270`, - 客户端那一侧是 `set_http3_enabled()`(`src/web/uvcpp_http_client.h:503-503`)。 + 客户端那一侧是 `set_http3_enabled()`(`src/web/uvcpp_http_client.h:505-505`)。 **整个 h3 公开面都套在 `#if UVCPP_HTTP3_ENABLE` 里** —— 没编进来时它不存在, 这是**编译期**的"没有",不是运行时返回错误。 - **`"h3"` 绝不进 TCP 的 ALPN 列表。** h3 只跑在 QUIC(UDP)上;在 TCP 的 @@ -422,7 +422,7 @@ void connect_over_http3(uvcpp_http_client& cli, int udp_port) { 模块",所以 §3.3 那条明明只用 web 层 API 的片段也列了 `` —— 不列的话它会**被编**,而它调的 `set_http3_enabled()` / `listen_quic()` 整段在 `#if UVCPP_HTTP3_ENABLE` 里 - (`src/web/uvcpp_http_client.h:503-503`、`uvcpp_http_server.h:220`),于是报的是"未声明的 + (`src/web/uvcpp_http_client.h:505-505`、`uvcpp_http_server.h:220`),于是报的是"未声明的 成员":那是**假红**(文档没腐烂,是那个包没编 h3)。 登记之后,`config-contract` job 手里那个包会把这三条判成 `[跳·默认关]` 而不是 `[跳]`,**退出码不会抬到 3**。两个宏(`UVCPP_QUIC_ENABLE`、`UVCPP_HTTP3_ENABLE`) @@ -475,7 +475,7 @@ h1 写泵、TCP 的 ALPN 列表与分支 —— **全部不改**。唯一的例 (`std::map quic_ctxs_`, `src/web/uvcpp_http_server.h:1750-1750`),只在 QUIC 回调里碰;`conn_ctx` **不加任何 字段** —— 那个结构体在 h1 的**每请求**热路上,往里加一个字都是每个 h1 请求都要付 -的。客户端加了六个成员(三个 `bool`、一个 `int64`、两个指针,`src/web/uvcpp_http_client.h:714-720`) +的。客户端加了六个成员(三个 `bool`、一个 `int64`、两个指针,`src/web/uvcpp_http_client.h:716-722`) —— 那是每**连接**一个的对象,不是每请求一个;`send()` 热路上多的是一个可预测为假 的分支。不新增每连接或每请求的 `std::function`,不新增锁、不新增分配、不新增虚调用。 diff --git a/doc/multiloop-design.md b/doc/multiloop-design.md index e4f4ef6..65c6f8a 100644 --- a/doc/multiloop-design.md +++ b/doc/multiloop-design.md @@ -305,7 +305,7 @@ DragonFly/Solaris/AIX 生效)。改法是:监听 fd 建一次,`dup()` n | `uvcpp_http_server::contexts_` | `src/web/uvcpp_http_server.h:1844-1844` | **每请求**(`.cpp` 里 52 处引用)—— **已切开**(§4.1) | | ~~`uvcpp_web_app::inflight_`~~ → `loop_slot::inflight` | `src/webapp/uvcpp_web_app.h:2222-2222`(**已切开**,W4 / 2c) | **每请求** | | ~~`uvcpp_web_app::upgraded_`~~ → `loop_slot::upgraded` | `src/webapp/uvcpp_web_app.h:2281-2281`(**已切开**,W4 / 2c) | 每次 WS 升级 | -| `uvcpp_tcp_server::clients_` | `src/net/uvcpp_tcp_server.h:965-965` | 接受 / 关闭 / 计数 | +| `uvcpp_tcp_server::clients_` | `src/net/uvcpp_tcp_server.h:967-967` | 接受 / 关闭 / 计数 | **比上面几条都靠前的一条:`post()` 本身是单循环的。** 它原来只有一份 `loop_tid_`/`post_queue_`,投递入口判据是 `loop_tid_ == std::this_thread::get_id()`。 diff --git a/doc/net-guide.md b/doc/net-guide.md index 1d759f5..3e056a5 100644 --- a/doc/net-guide.md +++ b/doc/net-guide.md @@ -229,7 +229,7 @@ size_t close_all_clients(); | setter | 约束 | |---|---| | `set_read_callback` | 必须在 loop 线程调用,且应当在 `listen()` 之前设好(`src/net/uvcpp_tcp_server.h:574-574`) | -| `set_ssl_context` | 必须在 `listen()` 之前设置(`src/net/uvcpp_tcp_server.h:706-707`) | +| `set_ssl_context` | 必须在 `listen()` 之前设置(`src/net/uvcpp_tcp_server.h:708-709`) | | `set_tcp_nodelay` | 必须在 `listen()`(以及 `set_loops(n > 1)`,如果要用)之前调(`src/net/uvcpp_tcp_server.h:235-235`) | `set_read_callback` 的实现就是一句赋值(`src/net/uvcpp_tcp_server.cpp:1061-1063`), diff --git a/doc/ssl-guide.md b/doc/ssl-guide.md index 1d06290..4465237 100644 --- a/doc/ssl-guide.md +++ b/doc/ssl-guide.md @@ -306,7 +306,7 @@ srv.add_sni_certificate_file("*.static.example.com", "static.pem", "static.key") | 落点 | 声明 | 所有权说明 | |---|---|---| -| `uvcpp_tcp_server::set_ssl_context` | `src/net/uvcpp_tcp_server.h:709-709` | "生命周期必须覆盖**整个服务端**,本服务端不持有它的所有权,也不负责释放"(`src/net/uvcpp_tcp_server.h:702-704`) | +| `uvcpp_tcp_server::set_ssl_context` | `src/net/uvcpp_tcp_server.h:711-711` | "生命周期必须覆盖**整个服务端**,本服务端不持有它的所有权,也不负责释放"(`src/net/uvcpp_tcp_server.h:702-704`) | | `uvcpp_tcp_client::enable_tls` | `src/net/uvcpp_tcp_client.h:221-221` | "生命周期必须覆盖**整条连接**"(`:217`) | | `uvcpp_web_app` | `src/webapp/uvcpp_web_app.cpp:2168-2168` | 全库唯一"有人拥有"的一处:`std::shared_ptr` | diff --git a/doc/web-http-guide.md b/doc/web-http-guide.md index 1bee4d7..cf95953 100644 --- a/doc/web-http-guide.md +++ b/doc/web-http-guide.md @@ -67,7 +67,7 @@ **三、`web/` 有 h2,但入口有三条。** 服务端 `set_http2_enabled(true)` (`src/web/uvcpp_http_server.h:357-357`)加 TLS+ALPN,服务端 `set_h2c_enabled(true)` (明文先验知识,RFC 9113 §3.4),客户端 `set_http2_enabled(true)` -(`src/web/uvcpp_http_client.h:684-684`)。 +(`src/web/uvcpp_http_client.h:686-686`)。 前两条都**默认关**;只有 `webapp/` 框架层默认开、零配置自动协商。 **不做 `Upgrade: h2c` 协商**(RFC 9113 已删除该机制),**也不做嗅探** —— 明文这条腿 只认那 24 个字节。 @@ -95,7 +95,7 @@ `uvcpp_http_server` **自己不碰 TLS** —— 它没有任何 SSL API。要上 https 必须 `get_tcp_server()->set_ssl_context(...)`,**而且必须在 `listen()` 之前** (`tests/functional/web_ssl_h2_client_func.cpp:186-186`)。握手超时归 -`uvcpp_tcp_server`(默认 10000 ms,`src/net/uvcpp_tcp_server.h:805-805`)。 +`uvcpp_tcp_server`(默认 10000 ms,`src/net/uvcpp_tcp_server.h:807-807`)。 --- @@ -471,7 +471,7 @@ int doc_client_async() { `send` / `get` / `post` 的回调签名逐字是 `std::function`(`src/web/uvcpp_http_client.h:219-274`)。 -交付的 `resp` 是成员 `pending_resp_`(`src/web/uvcpp_http_client.h:648-648`)的 const 引用 —— **存到下次 `send()` +交付的 `resp` 是成员 `pending_resp_`(`src/web/uvcpp_http_client.h:650-650`)的 const 引用 —— **存到下次 `send()` 就被覆写**。 **异步路径没有超时,`connect()` 也不设**(`src/web/uvcpp_http_client.cpp:64-68`)。 @@ -481,7 +481,7 @@ int doc_client_async() { "对端在响应收完前断开"时 `send()` 的回调永远不来。 **在响应回调里 `delete` 客户端是预期的用法。** 所有闭包都捕一个 `alive_token_` -弱引用(`src/web/uvcpp_http_client.h:631-642`),析构第一件事就 reset +弱引用(`src/web/uvcpp_http_client.h:633-644`),析构第一件事就 reset (`src/web/uvcpp_http_client.cpp:84-84`)—— 你不需要为它做任何额外的事。 ### 流式响应(`send_stream`,`1.8.2` 起) @@ -531,7 +531,7 @@ int doc_client_sync() { ### 三个容易写错的地方 **一、keep-alive 有两个方向:请求那头听调用方的,响应那头听对端的。** -`keep_alive_` 是**调用方的偏好**(`src/web/uvcpp_http_client.h:615-615` 初值 `true`、 +`keep_alive_` 是**调用方的偏好**(`src/web/uvcpp_http_client.h:617-617` 初值 `true`、 `src/web/uvcpp_http_client.h:297-297` 声明 `set_keep_alive`、`src/web/uvcpp_http_client.cpp:1355-1355` setter)。`set_keep_alive(false)` 会让请求报文带上 `connection: close`(`src/web/uvcpp_http_client.cpp:591-610`); 默认的 `true` 则不补头,报文里那条 `connection: keep-alive` 是 diff --git a/doc/web-ws-guide.md b/doc/web-ws-guide.md index 08ee85b..6cd8592 100644 --- a/doc/web-ws-guide.md +++ b/doc/web-ws-guide.md @@ -288,7 +288,7 @@ void close(ws_close_code code = ws_close_code::NORMAL, const std::string& reason = std::string()); // src/web/uvcpp_ws_client.h:164-165 int run(uv_run_mode md = UV_RUN_DEFAULT); // src/web/uvcpp_ws_client.h:171-171 void stop(); // src/web/uvcpp_ws_client.h:172-172 -void set_ssl_context(uvcpp_ssl_context* ctx); // src/web/uvcpp_ws_client.h:211-211 +void set_ssl_context(uvcpp_ssl_context* ctx); // src/web/uvcpp_ws_client.h:213-213 ``` ```cpp diff --git a/doc/webapp-support-guide.md b/doc/webapp-support-guide.md index cbdf786..c7c6c6d 100644 --- a/doc/webapp-support-guide.md +++ b/doc/webapp-support-guide.md @@ -70,7 +70,7 @@ `uvcpp/uvcpp_config.h` 提供;自己传一个冲突的值是硬 `#error`)。 **这七个头里没有一个用 `UVCPP_WEBAPP_ENABLE` 守卫自己。** 21 个 webapp 头 -里只有 `src/webapp/uvcpp_web_ws_client.h:52` 一处(`#endif` 在 `src/webapp/uvcpp_web_ws_client.h:435-435`)用了这个宏。 +里只有 `src/webapp/uvcpp_web_ws_client.h:52` 一处(`#endif` 在 `src/webapp/uvcpp_web_ws_client.h:438-438`)用了这个宏。 所以"没开 webapp 却 include 了这七个头"是**链接期失败**(那几个 `.cpp` 没进构建, `CMakeLists.txt:2343-2344`),不是编译期被 `#if` 挡住。这与 `uvcpp_web_ws_client.h` 的做法不一致 —— 看上去是历史的,不是设计。 diff --git a/doc/worker-process-design.md b/doc/worker-process-design.md index 8ad52eb..fc89ad8 100644 --- a/doc/worker-process-design.md +++ b/doc/worker-process-design.md @@ -184,7 +184,7 @@ Windows 要真正能用,得走 **master 自己 `accept()` + 每连接 `WSADupl `uvcpp_web_app` 的 `upgraded` / `inflight`(`src/webapp/uvcpp_web_app.h:2281-2281` / `src/webapp/uvcpp_web_app.h:2222-2222`;这两个容器后来在多循环那条路上被搬进了 `loop_slot`,见 `doc/multiloop-design.md` §4.1)、 - `uvcpp_tcp_server` 的 `clients_`(`src/net/uvcpp_tcp_server.h:965-965`)都不需要切成 per-loop。 + `uvcpp_tcp_server` 的 `clients_`(`src/net/uvcpp_tcp_server.h:967-967`)都不需要切成 per-loop。 这是选这条路**白拿**的最大一块。 - **日志那条闸门在进程内照样存在。** 1.4.0 之后 `src/webapp/uvcpp_log.cpp:416-436` 的 `write()` 已经**不持锁调 sink** 了(锁内只快照一次 `sink()`,`:342-351`),但默认 diff --git a/src/net/uvcpp_tcp_server.h b/src/net/uvcpp_tcp_server.h index 2de5474..2b47640 100644 --- a/src/net/uvcpp_tcp_server.h +++ b/src/net/uvcpp_tcp_server.h @@ -703,6 +703,8 @@ class UVCPP_API uvcpp_tcp_server { * 也不负责释放)。用 `uvcpp_ssl_context` 的 SERVER 模式, * 并装好证书/私钥。 * + * **销毁顺序**:上下文必须比本对象活得久 —— 同一作用域里先声明上下文、再声明本对象; + * 反过来(先本对象后上下文)时,本对象析构收尾仍会拿这个裸指针去用,是 UB(issue #56)。 * @warning 必须在 `listen()` 之前设置。清空用 `set_ssl_context(nullptr)`。 * @warning 必须在 loop 线程调用。 */ diff --git a/src/quic/uvcpp_quic_client.h b/src/quic/uvcpp_quic_client.h index ed946da..48b2ceb 100644 --- a/src/quic/uvcpp_quic_client.h +++ b/src/quic/uvcpp_quic_client.h @@ -80,6 +80,8 @@ class UVCPP_API uvcpp_quic_client { * @param ctx 生命周期必须覆盖整条连接(**不属于本对象**)。清空用 * `set_ssl_context(nullptr)`。 * + * **销毁顺序**:上下文必须比本对象活得久 —— 同一作用域里先声明上下文、再声明本对象; + * 反过来(先本对象后上下文)时,本对象析构收尾仍会拿这个裸指针去用,是 UB(issue #56)。 * **不设就是没配**:QUIC 没有明文模式(ALPN 是 TLS 扩展),所以 * `connect()` 时上下文为空会返回 `UV_EINVAL`,而不是退化成一个不加密的连接。 */ diff --git a/src/quic/uvcpp_quic_server.h b/src/quic/uvcpp_quic_server.h index 9e36f48..ef43fa0 100644 --- a/src/quic/uvcpp_quic_server.h +++ b/src/quic/uvcpp_quic_server.h @@ -136,6 +136,8 @@ class UVCPP_API uvcpp_quic_server { * @param ctx 生命周期必须覆盖整条连接(**不属于本对象**)。清空用 * `set_ssl_context(nullptr)`。 * + * **销毁顺序**:上下文必须比本对象活得久 —— 同一作用域里先声明上下文、再声明本对象; + * 反过来(先本对象后上下文)时,本对象析构收尾仍会拿这个裸指针去用,是 UB(issue #56)。 * **不设就是没配**:QUIC 没有明文模式(ALPN 是 TLS 扩展),所以 `listen()` 时 * 上下文为空会返回 `UV_EINVAL`,而不是退化成一个不加密的服务端。 */ diff --git a/src/web/uvcpp_http_client.h b/src/web/uvcpp_http_client.h index fd5ff39..1110df0 100644 --- a/src/web/uvcpp_http_client.h +++ b/src/web/uvcpp_http_client.h @@ -388,6 +388,8 @@ class UVCPP_API uvcpp_http_client { * SSL_read/SSL_write 要独占 socket,接管不了 memory BIO 那条会话。 * 宁可报错,也不把明文写进一条已经加密的连接。 */ + /// 上下文必须比本对象活得久:客户端只存裸指针,析构收尾时 TLS 会话还会用它。 + /// 同一作用域里**先声明上下文、再声明本对象**;反过来是 UB(issue #56)。 void set_ssl_context(uvcpp_ssl_context* ctx); bool is_ssl_enabled() const; /** @brief 同步 SSL 请求路径(阻塞式握手/读写,仅 *_wait 系列使用)。 */ diff --git a/src/web/uvcpp_ws_client.h b/src/web/uvcpp_ws_client.h index 6549779..317085a 100644 --- a/src/web/uvcpp_ws_client.h +++ b/src/web/uvcpp_ws_client.h @@ -208,6 +208,8 @@ class UVCPP_API uvcpp_ws_client { #endif #if UVCPP_OPENSSL_ENABLE + /// 上下文必须比本对象活得久:只存裸指针,析构收尾时还会用它;同一作用域里先声明 + /// 它、再声明本对象(先本对象后上下文是 UB,issue #56)。 void set_ssl_context(uvcpp_ssl_context* ctx); #endif diff --git a/src/webapp/uvcpp_web_ws_client.h b/src/webapp/uvcpp_web_ws_client.h index da08bd6..aab4ab6 100644 --- a/src/webapp/uvcpp_web_ws_client.h +++ b/src/webapp/uvcpp_web_ws_client.h @@ -312,6 +312,9 @@ class UVCPP_API uvcpp_web_ws_client { /** * @brief `wss://` 用的 TLS 上下文。**生命周期要覆盖整条连接**(本层不持有)。 * + * **销毁顺序**:同一作用域里先声明上下文、再声明本对象;反过来时本对象析构收尾 + * 仍会拿这个裸指针去用,是 UB(issue #56)。 + * * 与协议层不同,这里可以在 `connect()` 之后再设:本层存着,每次重建底层 * 客户端时重新装上去。 */ diff --git a/tests/tools/doc_line_refs.lock b/tests/tools/doc_line_refs.lock index 984ee2a..7bcc6dc 100644 --- a/tests/tools/doc_line_refs.lock +++ b/tests/tools/doc_line_refs.lock @@ -364,11 +364,11 @@ src/net/uvcpp_tcp_server.h:574-574 08b07dd52467473b 08b07dd52467473b - src/net/uvcpp_tcp_server.h:59-65 6c4934b261a9cc89 4f8f1b25eeafd8a4 d43444b1e3b56248 src/net/uvcpp_tcp_server.h:693-701 d8b58caf3500ebca ba98e21b46a7f3c3 1a14c87e2385508e src/net/uvcpp_tcp_server.h:702-704 bf9968cb4e22ad54 ef52884bf8e7c50e 829abaae1045b45a -src/net/uvcpp_tcp_server.h:706-707 50942e088938071d f5ba1f839216339a 36a2016703244047 -src/net/uvcpp_tcp_server.h:709-709 cb2dd4f1b3ddbd6a cb2dd4f1b3ddbd6a - -src/net/uvcpp_tcp_server.h:805-805 cdbc26b28b6467b5 cdbc26b28b6467b5 - +src/net/uvcpp_tcp_server.h:708-709 50942e088938071d f5ba1f839216339a 36a2016703244047 +src/net/uvcpp_tcp_server.h:711-711 cb2dd4f1b3ddbd6a cb2dd4f1b3ddbd6a - +src/net/uvcpp_tcp_server.h:807-807 cdbc26b28b6467b5 cdbc26b28b6467b5 - src/net/uvcpp_tcp_server.h:92-97 451a810cbb9be70b 30f2378010013043 a251d8a336202775 -src/net/uvcpp_tcp_server.h:965-965 0e77dae47f5f5e18 0e77dae47f5f5e18 - +src/net/uvcpp_tcp_server.h:967-967 0e77dae47f5f5e18 0e77dae47f5f5e18 - src/net/uvcpp_udp_client.cpp:1148-1148 a0f156405122d91e a0f156405122d91e - src/net/uvcpp_udp_client.h:74-74 25bf4d22cd8306d1 25bf4d22cd8306d1 - src/net/uvcpp_udp_server.cpp:165-165 f756f35ae790d904 f756f35ae790d904 - @@ -497,14 +497,14 @@ src/web/uvcpp_http_client.h:219-274 68d3495d6dc6d27f 859ac3537b2a51dc f75806f32b src/web/uvcpp_http_client.h:297-297 ac2839442940b98f ac2839442940b98f - src/web/uvcpp_http_client.h:351-363 1bb68c33ddd7d992 ee565528dbe5722b 1ca3932dc0f925c0 src/web/uvcpp_http_client.h:380-389 0e4969770f315a3c 96423943c5eb9538 15de869105d2e276 -src/web/uvcpp_http_client.h:432-432 5ec5be8e44ec8d13 5ec5be8e44ec8d13 - -src/web/uvcpp_http_client.h:503-503 1a03c4409bf0b24d 1a03c4409bf0b24d - +src/web/uvcpp_http_client.h:434-434 5ec5be8e44ec8d13 5ec5be8e44ec8d13 - +src/web/uvcpp_http_client.h:505-505 1a03c4409bf0b24d 1a03c4409bf0b24d - src/web/uvcpp_http_client.h:51-53 22f2d8d7b1cbef95 24a0ea5ff3bfa408 da39a3ee5e6b4b0d -src/web/uvcpp_http_client.h:615-615 77940e08340681ed 77940e08340681ed - -src/web/uvcpp_http_client.h:631-642 5e1bd587480aa0cd 41c5717b5d15e16b 0b2b8a8ee10f67b6 -src/web/uvcpp_http_client.h:648-648 ffdce0a14f48d09e ffdce0a14f48d09e - -src/web/uvcpp_http_client.h:684-684 87d70f054eaf6247 87d70f054eaf6247 - -src/web/uvcpp_http_client.h:714-720 492d3de4ee7ad403 983b8bdf59a78818 d7e5948b212bfd26 +src/web/uvcpp_http_client.h:617-617 77940e08340681ed 77940e08340681ed - +src/web/uvcpp_http_client.h:633-644 5e1bd587480aa0cd 41c5717b5d15e16b 0b2b8a8ee10f67b6 +src/web/uvcpp_http_client.h:650-650 ffdce0a14f48d09e ffdce0a14f48d09e - +src/web/uvcpp_http_client.h:686-686 87d70f054eaf6247 87d70f054eaf6247 - +src/web/uvcpp_http_client.h:716-722 492d3de4ee7ad403 983b8bdf59a78818 d7e5948b212bfd26 src/web/uvcpp_http_client.h:78-78 b28db9b27491a2ec b28db9b27491a2ec - src/web/uvcpp_http_common.h:246-247 5d5591c858a59089 abf28ca15bd6320a 2c6c767a330c50df src/web/uvcpp_http_common.h:679-679 8440f66064369963 8440f66064369963 - @@ -670,7 +670,7 @@ src/web/uvcpp_ws_client.h:164-165 79f887cd410dc60f 65247d3f22a6925c 1f76f3341ebc src/web/uvcpp_ws_client.h:171-171 dfce7075e36d0e0a dfce7075e36d0e0a - src/web/uvcpp_ws_client.h:172-172 96d3559398aa018e 96d3559398aa018e - src/web/uvcpp_ws_client.h:206-206 1b8278d66ed4cfe0 1b8278d66ed4cfe0 - -src/web/uvcpp_ws_client.h:211-211 cb2dd4f1b3ddbd6a cb2dd4f1b3ddbd6a - +src/web/uvcpp_ws_client.h:213-213 cb2dd4f1b3ddbd6a cb2dd4f1b3ddbd6a - src/web/uvcpp_ws_client.h:34-34 d5e8c6bfebc5d629 d5e8c6bfebc5d629 - src/web/uvcpp_ws_client.h:43-55 2bb502980db447a3 c4d2345910e45855 6bfd5fa82e88e4ce src/web/uvcpp_ws_client.h:56-56 48ef6d3897eb5aab 48ef6d3897eb5aab - @@ -1045,7 +1045,7 @@ src/webapp/uvcpp_web_util.h:449-451 4c9252b2dd29c486 e3b5cff9df83b751 640a24243f src/webapp/uvcpp_web_util.h:453-457 9ff2e4958b28c525 2e594c3e2d43c9cc 801242e1ce112eb2 src/webapp/uvcpp_web_util.h:494-494 c1438ca98c7caa1f c1438ca98c7caa1f - src/webapp/uvcpp_web_work_limit.cpp:222-226 83782a20836777fc c2b7df6201fdd336 3c6564d375e78b9d -src/webapp/uvcpp_web_ws_client.h:435-435 7c944a0bf34320a1 7c944a0bf34320a1 - +src/webapp/uvcpp_web_ws_client.h:438-438 7c944a0bf34320a1 7c944a0bf34320a1 - src/webapp/uvcpp_web_ws_client.h:52-52 54180563d582dd6f 54180563d582dd6f - tests/functional/web_app_context_func.cpp:920-920 2b72c521e6313c92 2b72c521e6313c92 - tests/functional/web_app_log_func.cpp:103-103 cd7473c402def02f cd7473c402def02f -