Skip to content

Commit 613cc89

Browse files
committed
feat ci: fix builds and runs of websocket tests on CI
Tests: протестировано CI commit_hash:c7e6fa3f9d7452dfa8a86726c64ea2cf35dab753
1 parent ed61678 commit 613cc89

2 files changed

Lines changed: 20 additions & 3 deletions

File tree

.github/workflows/ci.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ jobs:
4444
id: ubuntu24_clang18_debug_sanitize-addr-ub
4545
# Sanitizer consumes too much virtual memory and Subprocess tests fail with:
4646
# "Error while fork: Cannot allocate memory" (std::system_error)
47-
tests-flags: '--gtest_filter=-Subprocess.*'
47+
#
48+
# curl lacks ws:// support
49+
tests-flags: '--gtest_filter=-Subprocess.*:HttpClientWebSocket.*'
4850
tests-env: ''
4951
5052
- cmake-flags: >-
@@ -63,7 +65,7 @@ jobs:
6365
os: ubuntu-24.04
6466
info: gcc-13 + release
6567
id: ubuntu24_gcc13_release
66-
tests-flags: '--gtest_filter=-StackUsageMonitorTest.BacktraceLogging'
68+
tests-flags: '--gtest_filter=-StackUsageMonitorTest.BacktraceLogging:HttpClientWebSocket.*'
6769
tests-env: ''
6870
6971
name: '${{matrix.os}}: ${{matrix.info}}'

core/src/clients/http/websocket_response.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include <algorithm>
44
#include <cstring>
5+
#include <span>
56
#include <string_view>
67

78
#include <curl-ev/native.hpp>
@@ -72,6 +73,19 @@ void AppendFrame(
7273
out.append(payload);
7374
}
7475

76+
template <class Easy, class MetaPtr>
77+
auto WorkaroundCurlWsRecv(Easy* easy, std::span<char> buffer, size_t& nread, MetaPtr& meta) {
78+
if constexpr (requires { curl::native::curl_ws_recv(easy, buffer.data(), buffer.size(), &nread, &meta); }) {
79+
return curl::native::curl_ws_recv(easy, buffer.data(), buffer.size(), &nread, &meta);
80+
} else {
81+
// old curl libraries have no `const`
82+
curl::native::curl_ws_frame* meta_nonconst = nullptr;
83+
const auto code = curl::native::curl_ws_recv(easy, buffer.data(), buffer.size(), &nread, &meta_nonconst);
84+
meta = meta_nonconst;
85+
return code;
86+
}
87+
}
88+
7589
// Drain post-upgrade WebSocket bytes buffered by libcurl CONNECT_ONLY=2.
7690
//
7791
// Why we cannot just return curl's buffer "as is" on libcurl 8.17:
@@ -104,8 +118,9 @@ std::string DrainCurlWebSocketPreambleImpl(curl::native::CURL* easy) {
104118
while (true) {
105119
char buffer[kWsRecvChunkSize];
106120
size_t nread = 0;
121+
107122
const curl::native::curl_ws_frame* meta = nullptr;
108-
const auto rc = curl::native::curl_ws_recv(easy, buffer, sizeof(buffer), &nread, &meta);
123+
const auto rc = WorkaroundCurlWsRecv(easy, buffer, nread, meta);
109124

110125
if (rc == curl::native::CURLE_AGAIN) {
111126
break;

0 commit comments

Comments
 (0)