Skip to content

Commit ef8c2fd

Browse files
authored
[k2] fix signature of curl_multi_strerror (#1579)
* Used errno instead of multi handler as parameter * Added tests --------- Signed-off-by: Petr Shumilov <p.shumilov@vkteam.ru>
1 parent 73bbf64 commit ef8c2fd

6 files changed

Lines changed: 126 additions & 18 deletions

File tree

runtime-light/state/image-state.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "runtime-light/allocator/allocator-state.h"
1919
#include "runtime-light/core/reference-counter/reference-counter-functions.h"
2020
#include "runtime-light/k2-platform/k2-api.h"
21+
#include "runtime-light/stdlib/curl/curl-state.h"
2122
#include "runtime-light/stdlib/diagnostics/logs.h"
2223
#include "runtime-light/stdlib/file/file-system-state.h"
2324
#include "runtime-light/stdlib/math/math-state.h"
@@ -48,6 +49,7 @@ struct ImageState final : private vk::not_copyable {
4849
TimeImageState time_image_state;
4950
MathImageState math_image_state;
5051
RpcImageState rpc_image_state;
52+
CurlImageState curl_image_state;
5153

5254
ImageState() noexcept {
5355
if (const int64_t sysconf_max_buffer_size{k2::sysconf(_SC_GETPW_R_SIZE_MAX)}; sysconf_max_buffer_size != -1) {

runtime-light/stdlib/curl/curl-multi-functions.h

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ inline auto f$curl_multi_add_handle(kphp::web::curl::multi_type multi_id, kphp::
4646

4747
auto res{co_await kphp::forks::id_managed(kphp::web::composite_transfer_add(kphp::web::composite_transfer{multi_id}, kphp::web::simple_transfer{easy_id}))};
4848
if (!res.has_value()) [[unlikely]] {
49-
multi_ctx.set_errno(res.error().code, res.error().description);
49+
multi_ctx.set_errno(res.error().code);
5050
kphp::web::curl::print_error("could not add a curl easy handler into multi handle", std::move(res.error()));
5151
co_return multi_ctx.error_code;
5252
}
@@ -67,7 +67,7 @@ inline auto f$curl_multi_remove_handle(kphp::web::curl::multi_type multi_id,
6767
auto res{
6868
co_await kphp::forks::id_managed(kphp::web::composite_transfer_remove(kphp::web::composite_transfer{multi_id}, kphp::web::simple_transfer{easy_id}))};
6969
if (!res.has_value()) [[unlikely]] {
70-
multi_ctx.set_errno(res.error().code, res.error().description);
70+
multi_ctx.set_errno(res.error().code);
7171
kphp::web::curl::print_error("could not remove a curl easy handler from multi handle", std::move(res.error()));
7272
co_return multi_ctx.error_code;
7373
}
@@ -100,7 +100,7 @@ inline auto f$curl_multi_setopt(kphp::web::curl::multi_type multi_id, int64_t op
100100
return true;
101101
}
102102
default:
103-
multi_ctx.set_errno(kphp::web::curl::CURLME::UNKNOWN_OPTION, "a libcurl function was given an incorrect PROXYTYPE kind");
103+
multi_ctx.set_errno(kphp::web::curl::CURLME::UNKNOWN_OPTION);
104104
return false;
105105
}
106106
}
@@ -130,7 +130,7 @@ inline auto f$curl_multi_exec(kphp::web::curl::multi_type multi_id, int64_t& sti
130130
auto res{co_await kphp::forks::id_managed(kphp::web::composite_transfer_perform(kphp::web::composite_transfer{multi_id}))};
131131
auto& multi_ctx{curl_state.multi_ctx.get_or_init(multi_id)};
132132
if (!res.has_value()) [[unlikely]] {
133-
multi_ctx.set_errno(res.error().code, res.error().description);
133+
multi_ctx.set_errno(res.error().code);
134134
kphp::web::curl::print_error("could not execute curl multi handle", std::move(res.error()));
135135
co_return multi_ctx.error_code;
136136
}
@@ -148,7 +148,7 @@ inline auto f$curl_multi_getcontent(kphp::web::curl::easy_type easy_id) noexcept
148148
if (easy_ctx.return_transfer) {
149149
auto res{co_await kphp::forks::id_managed(kphp::web::simple_transfer_get_response(kphp::web::simple_transfer{easy_id}))};
150150
if (!res.has_value()) [[unlikely]] {
151-
easy_ctx.set_errno(res.error().code, res.error().description);
151+
easy_ctx.set_errno(res.error().code);
152152
kphp::web::curl::print_error("could not get response of curl easy handle", std::move(res.error()));
153153
co_return false;
154154
}
@@ -165,26 +165,47 @@ inline auto f$curl_multi_close(kphp::web::curl::multi_type multi_id) noexcept ->
165165
auto& multi_ctx{curl_state.multi_ctx.get_or_init(multi_id)};
166166
auto res{co_await kphp::forks::id_managed(kphp::web::composite_transfer_close(kphp::web::composite_transfer{multi_id}))};
167167
if (!res.has_value()) [[unlikely]] {
168-
multi_ctx.set_errno(res.error().code, res.error().description);
168+
multi_ctx.set_errno(res.error().code);
169169
kphp::web::curl::print_error("could not close curl multi handle", std::move(res.error()));
170170
co_return;
171171
}
172172
multi_ctx.set_errno(kphp::web::curl::CURLE::OK);
173173
co_return;
174174
}
175175

176-
inline auto f$curl_multi_strerror(kphp::web::curl::multi_type multi_id) noexcept -> Optional<string> {
177-
auto& curl_state{CurlInstanceState::get()};
178-
if (!curl_state.multi_ctx.has(multi_id)) [[unlikely]] {
176+
inline auto f$curl_multi_strerror(int64_t error_num) noexcept -> Optional<string> {
177+
switch (static_cast<kphp::web::curl::CURLME>(error_num)) {
178+
case kphp::web::curl::CURLME::CALL_MULTI_PERFORM:
179+
return CurlImageState::get().CURLME_CALL_MULTI_PERFORM;
180+
case kphp::web::curl::CURLME::OK:
181+
return CurlImageState::get().CURLME_OK;
182+
case kphp::web::curl::CURLME::BAD_HANDLE:
183+
return CurlImageState::get().CURLME_BAD_HANDLE;
184+
case kphp::web::curl::CURLME::BAD_EASY_HANDLE:
185+
return CurlImageState::get().CURLME_BAD_EASY_HANDLE;
186+
case kphp::web::curl::CURLME::OUT_OF_MEMORY:
187+
return CurlImageState::get().CURLME_OUT_OF_MEMORY;
188+
case kphp::web::curl::CURLME::INTERNAL_ERROR:
189+
return CurlImageState::get().CURLME_INTERNAL_ERROR;
190+
case kphp::web::curl::CURLME::BAD_SOCKET:
191+
return CurlImageState::get().CURLME_BAD_SOCKET;
192+
case kphp::web::curl::CURLME::UNKNOWN_OPTION:
193+
return CurlImageState::get().CURLME_UNKNOWN_OPTION;
194+
case kphp::web::curl::CURLME::ADDED_ALREADY:
195+
return CurlImageState::get().CURLME_ADDED_ALREADY;
196+
case kphp::web::curl::CURLME::RECURSIVE_API_CALL:
197+
return CurlImageState::get().CURLME_RECURSIVE_API_CALL;
198+
case kphp::web::curl::CURLME::WAKEUP_FAILURE:
199+
return CurlImageState::get().CURLME_WAKEUP_FAILURE;
200+
case kphp::web::curl::CURLME::BAD_FUNCTION_ARGUMENT:
201+
return CurlImageState::get().CURLME_BAD_FUNCTION_ARGUMENT;
202+
case kphp::web::curl::CURLME::ABORTED_BY_CALLBACK:
203+
return CurlImageState::get().CURLME_ABORTED_BY_CALLBACK;
204+
case kphp::web::curl::CURLME::UNRECOVERABLE_POLL:
205+
return CurlImageState::get().CURLME_UNRECOVERABLE_POLL;
206+
default:
179207
return {};
180208
}
181-
auto& multi_ctx{curl_state.multi_ctx.get_or_init(multi_id)};
182-
if (multi_ctx.error_code != static_cast<int64_t>(kphp::web::curl::CURLME::OK)) [[likely]] {
183-
const auto* const desc_data{reinterpret_cast<const char*>(multi_ctx.error_description.data())};
184-
const auto desc_size{static_cast<string::size_type>(multi_ctx.error_description.size())};
185-
return string{desc_data, desc_size};
186-
}
187-
return {};
188209
}
189210

190211
inline auto f$curl_multi_errno(kphp::web::curl::multi_type multi_id) noexcept -> Optional<int64_t> {
@@ -205,7 +226,7 @@ inline auto f$curl_multi_select(kphp::web::curl::multi_type multi_id, double tim
205226
auto res{co_await kphp::forks::id_managed(kphp::web::composite_transfer_wait_updates(
206227
kphp::web::composite_transfer{multi_id}, std::chrono::duration_cast<std::chrono::seconds>(std::chrono::duration<double>{timeout})))};
207228
if (!res.has_value()) [[unlikely]] {
208-
multi_ctx.set_errno(res.error().code, res.error().description);
229+
multi_ctx.set_errno(res.error().code);
209230
kphp::web::curl::print_error("could not select curl multi handle", std::move(res.error()));
210231
co_return multi_ctx.error_code;
211232
}

runtime-light/stdlib/curl/curl-state.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@
44

55
#include "runtime-light/stdlib/curl/curl-state.h"
66

7+
#include "runtime-light/state/image-state.h"
78
#include "runtime-light/state/instance-state.h"
89

910
CurlInstanceState& CurlInstanceState::get() noexcept {
1011
return InstanceState::get().curl_instance_state;
1112
}
13+
14+
const CurlImageState& CurlImageState::get() noexcept {
15+
return ImageState::get().curl_image_state;
16+
}

runtime-light/stdlib/curl/curl-state.h

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
#include "common/mixin/not_copyable.h"
88
#include "runtime-common/core/allocator/script-allocator.h"
99
#include "runtime-common/core/std/containers.h"
10+
#include "runtime-light/core/reference-counter/reference-counter-functions.h"
1011
#include "runtime-light/stdlib/curl/curl-context.h"
1112
#include "runtime-light/stdlib/curl/defs.h"
13+
#include "runtime-light/stdlib/diagnostics/logs.h"
1214

1315
struct CurlInstanceState final : private vk::not_copyable {
1416
public:
@@ -58,3 +60,54 @@ inline auto CurlInstanceState::multi_ctx::get_or_init(kphp::web::curl::multi_typ
5860
inline auto CurlInstanceState::multi_ctx::has(kphp::web::curl::multi_type multi_id) noexcept -> bool {
5961
return ctx.find(multi_id) != ctx.end();
6062
}
63+
64+
struct CurlImageState final : private vk::not_copyable {
65+
string CURLME_CALL_MULTI_PERFORM{kphp::web::curl::details::CURLME_CALL_MULTI_PERFORM.data(), kphp::web::curl::details::CURLME_CALL_MULTI_PERFORM.size()};
66+
string CURLME_OK{kphp::web::curl::details::CURLME_OK.data(), kphp::web::curl::details::CURLME_OK.size()};
67+
string CURLME_BAD_HANDLE{kphp::web::curl::details::CURLME_BAD_HANDLE.data(), kphp::web::curl::details::CURLME_BAD_HANDLE.size()};
68+
string CURLME_BAD_EASY_HANDLE{kphp::web::curl::details::CURLME_BAD_EASY_HANDLE.data(), kphp::web::curl::details::CURLME_BAD_EASY_HANDLE.size()};
69+
string CURLME_OUT_OF_MEMORY{kphp::web::curl::details::CURLME_OUT_OF_MEMORY.data(), kphp::web::curl::details::CURLME_OUT_OF_MEMORY.size()};
70+
string CURLME_INTERNAL_ERROR{kphp::web::curl::details::CURLME_INTERNAL_ERROR.data(), kphp::web::curl::details::CURLME_INTERNAL_ERROR.size()};
71+
string CURLME_BAD_SOCKET{kphp::web::curl::details::CURLME_BAD_SOCKET.data(), kphp::web::curl::details::CURLME_BAD_SOCKET.size()};
72+
string CURLME_UNKNOWN_OPTION{kphp::web::curl::details::CURLME_UNKNOWN_OPTION.data(), kphp::web::curl::details::CURLME_UNKNOWN_OPTION.size()};
73+
string CURLME_ADDED_ALREADY{kphp::web::curl::details::CURLME_ADDED_ALREADY.data(), kphp::web::curl::details::CURLME_ADDED_ALREADY.size()};
74+
string CURLME_RECURSIVE_API_CALL{kphp::web::curl::details::CURLME_RECURSIVE_API_CALL.data(), kphp::web::curl::details::CURLME_RECURSIVE_API_CALL.size()};
75+
string CURLME_WAKEUP_FAILURE{kphp::web::curl::details::CURLME_WAKEUP_FAILURE.data(), kphp::web::curl::details::CURLME_WAKEUP_FAILURE.size()};
76+
string CURLME_BAD_FUNCTION_ARGUMENT{kphp::web::curl::details::CURLME_BAD_FUNCTION_ARGUMENT.data(),
77+
kphp::web::curl::details::CURLME_BAD_FUNCTION_ARGUMENT.size()};
78+
string CURLME_ABORTED_BY_CALLBACK{kphp::web::curl::details::CURLME_ABORTED_BY_CALLBACK.data(), kphp::web::curl::details::CURLME_ABORTED_BY_CALLBACK.size()};
79+
string CURLME_UNRECOVERABLE_POLL{kphp::web::curl::details::CURLME_UNRECOVERABLE_POLL.data(), kphp::web::curl::details::CURLME_UNRECOVERABLE_POLL.size()};
80+
81+
CurlImageState() noexcept {
82+
kphp::log::assertion((kphp::core::set_reference_counter_recursive(CURLME_CALL_MULTI_PERFORM, ExtraRefCnt::for_global_const),
83+
kphp::core::is_reference_counter_recursive(CURLME_CALL_MULTI_PERFORM, ExtraRefCnt::for_global_const)));
84+
kphp::log::assertion((kphp::core::set_reference_counter_recursive(CURLME_OK, ExtraRefCnt::for_global_const),
85+
kphp::core::is_reference_counter_recursive(CURLME_OK, ExtraRefCnt::for_global_const)));
86+
kphp::log::assertion((kphp::core::set_reference_counter_recursive(CURLME_BAD_HANDLE, ExtraRefCnt::for_global_const),
87+
kphp::core::is_reference_counter_recursive(CURLME_BAD_HANDLE, ExtraRefCnt::for_global_const)));
88+
kphp::log::assertion((kphp::core::set_reference_counter_recursive(CURLME_BAD_EASY_HANDLE, ExtraRefCnt::for_global_const),
89+
kphp::core::is_reference_counter_recursive(CURLME_BAD_EASY_HANDLE, ExtraRefCnt::for_global_const)));
90+
kphp::log::assertion((kphp::core::set_reference_counter_recursive(CURLME_OUT_OF_MEMORY, ExtraRefCnt::for_global_const),
91+
kphp::core::is_reference_counter_recursive(CURLME_OUT_OF_MEMORY, ExtraRefCnt::for_global_const)));
92+
kphp::log::assertion((kphp::core::set_reference_counter_recursive(CURLME_INTERNAL_ERROR, ExtraRefCnt::for_global_const),
93+
kphp::core::is_reference_counter_recursive(CURLME_INTERNAL_ERROR, ExtraRefCnt::for_global_const)));
94+
kphp::log::assertion((kphp::core::set_reference_counter_recursive(CURLME_BAD_SOCKET, ExtraRefCnt::for_global_const),
95+
kphp::core::is_reference_counter_recursive(CURLME_BAD_SOCKET, ExtraRefCnt::for_global_const)));
96+
kphp::log::assertion((kphp::core::set_reference_counter_recursive(CURLME_UNKNOWN_OPTION, ExtraRefCnt::for_global_const),
97+
kphp::core::is_reference_counter_recursive(CURLME_UNKNOWN_OPTION, ExtraRefCnt::for_global_const)));
98+
kphp::log::assertion((kphp::core::set_reference_counter_recursive(CURLME_ADDED_ALREADY, ExtraRefCnt::for_global_const),
99+
kphp::core::is_reference_counter_recursive(CURLME_ADDED_ALREADY, ExtraRefCnt::for_global_const)));
100+
kphp::log::assertion((kphp::core::set_reference_counter_recursive(CURLME_RECURSIVE_API_CALL, ExtraRefCnt::for_global_const),
101+
kphp::core::is_reference_counter_recursive(CURLME_RECURSIVE_API_CALL, ExtraRefCnt::for_global_const)));
102+
kphp::log::assertion((kphp::core::set_reference_counter_recursive(CURLME_WAKEUP_FAILURE, ExtraRefCnt::for_global_const),
103+
kphp::core::is_reference_counter_recursive(CURLME_WAKEUP_FAILURE, ExtraRefCnt::for_global_const)));
104+
kphp::log::assertion((kphp::core::set_reference_counter_recursive(CURLME_BAD_FUNCTION_ARGUMENT, ExtraRefCnt::for_global_const),
105+
kphp::core::is_reference_counter_recursive(CURLME_BAD_FUNCTION_ARGUMENT, ExtraRefCnt::for_global_const)));
106+
kphp::log::assertion((kphp::core::set_reference_counter_recursive(CURLME_ABORTED_BY_CALLBACK, ExtraRefCnt::for_global_const),
107+
kphp::core::is_reference_counter_recursive(CURLME_ABORTED_BY_CALLBACK, ExtraRefCnt::for_global_const)));
108+
kphp::log::assertion((kphp::core::set_reference_counter_recursive(CURLME_UNRECOVERABLE_POLL, ExtraRefCnt::for_global_const),
109+
kphp::core::is_reference_counter_recursive(CURLME_UNRECOVERABLE_POLL, ExtraRefCnt::for_global_const)));
110+
}
111+
112+
static const CurlImageState& get() noexcept;
113+
};

runtime-light/stdlib/curl/defs.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#pragma once
66

77
#include <cstdint>
8+
#include <string_view>
89

910
#include "runtime-light/stdlib/web-transfer-lib/defs.h"
1011

@@ -259,6 +260,11 @@ enum class CURLME : int16_t {
259260
BAD_SOCKET = 5,
260261
UNKNOWN_OPTION = 6,
261262
ADDED_ALREADY = 7,
263+
RECURSIVE_API_CALL = 8,
264+
WAKEUP_FAILURE = 9,
265+
BAD_FUNCTION_ARGUMENT = 10,
266+
ABORTED_BY_CALLBACK = 11,
267+
UNRECOVERABLE_POLL = 12,
262268
};
263269

264270
enum class CURMLOPT : uint64_t {
@@ -278,3 +284,22 @@ enum class CURLPIPE : uint8_t {
278284
};
279285

280286
} // namespace kphp::web::curl
287+
288+
namespace kphp::web::curl::details {
289+
290+
inline constexpr std::string_view CURLME_CALL_MULTI_PERFORM{"Please call curl_multi_perform() soon"};
291+
inline constexpr std::string_view CURLME_OK{"No error"};
292+
inline constexpr std::string_view CURLME_BAD_HANDLE{"Invalid multi handle"};
293+
inline constexpr std::string_view CURLME_BAD_EASY_HANDLE{"Invalid easy handle"};
294+
inline constexpr std::string_view CURLME_OUT_OF_MEMORY{"Out of memory"};
295+
inline constexpr std::string_view CURLME_INTERNAL_ERROR{"Internal error"};
296+
inline constexpr std::string_view CURLME_BAD_SOCKET{"Invalid socket argument"};
297+
inline constexpr std::string_view CURLME_UNKNOWN_OPTION{"Unknown option"};
298+
inline constexpr std::string_view CURLME_ADDED_ALREADY{"The easy handle is already added to a multi handle"};
299+
inline constexpr std::string_view CURLME_RECURSIVE_API_CALL{"API function called from within callback"};
300+
inline constexpr std::string_view CURLME_WAKEUP_FAILURE{"Wakeup is unavailable or failed"};
301+
inline constexpr std::string_view CURLME_BAD_FUNCTION_ARGUMENT{"A libcurl function was given a bad argument"};
302+
inline constexpr std::string_view CURLME_ABORTED_BY_CALLBACK{"Operation was aborted by an application callback"};
303+
inline constexpr std::string_view CURLME_UNRECOVERABLE_POLL{"Unrecoverable error in select/poll"};
304+
305+
} // namespace kphp::web::curl::details

tests/phpt/curl/11_curl_multi_error.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33

44
function test_no_error() {
55
$mh = curl_multi_init();
6-
var_dump(curl_multi_errno($mh));
6+
$errno = curl_multi_errno($mh);
7+
var_dump($errno);
8+
var_dump(curl_multi_strerror($errno));
79
curl_multi_close($mh);
810
}
911

0 commit comments

Comments
 (0)