|
2 | 2 |
|
3 | 3 | #include <algorithm> |
4 | 4 | #include <cstring> |
| 5 | +#include <span> |
5 | 6 | #include <string_view> |
6 | 7 |
|
7 | 8 | #include <curl-ev/native.hpp> |
@@ -72,6 +73,19 @@ void AppendFrame( |
72 | 73 | out.append(payload); |
73 | 74 | } |
74 | 75 |
|
| 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 | + |
75 | 89 | // Drain post-upgrade WebSocket bytes buffered by libcurl CONNECT_ONLY=2. |
76 | 90 | // |
77 | 91 | // 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) { |
104 | 118 | while (true) { |
105 | 119 | char buffer[kWsRecvChunkSize]; |
106 | 120 | size_t nread = 0; |
| 121 | + |
107 | 122 | 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); |
109 | 124 |
|
110 | 125 | if (rc == curl::native::CURLE_AGAIN) { |
111 | 126 | break; |
|
0 commit comments