fix missing request headers

This commit is contained in:
Scott E. Graves 2024-12-31 11:29:05 -06:00
parent bf700b9d59
commit ae7d5fe284
5 changed files with 51 additions and 38 deletions

View File

@ -61,13 +61,14 @@ public:
[[nodiscard]] static auto reset_curl(CURL *curl_handle) -> CURL *; [[nodiscard]] static auto reset_curl(CURL *curl_handle) -> CURL *;
public: public:
[[nodiscard]] static auto [[nodiscard]] static auto construct_url(CURL *curl,
construct_url(CURL *curl, const std::string &relative_path, const std::string &relative_path,
const host_config &cfg) -> std::string; const host_config &cfg)
-> std::string;
[[nodiscard]] static auto [[nodiscard]] static auto create_host_config(const s3_config &cfg,
create_host_config(const s3_config &cfg, bool use_s3_path_style)
bool use_s3_path_style) -> host_config; -> host_config;
[[nodiscard]] static auto url_encode(CURL *curl, const std::string &data, [[nodiscard]] static auto url_encode(CURL *curl, const std::string &data,
bool allow_slash) -> std::string; bool allow_slash) -> std::string;
@ -75,8 +76,8 @@ public:
template <typename request_type> template <typename request_type>
[[nodiscard]] static auto [[nodiscard]] static auto
make_encrypted_request(const host_config &cfg, const request_type &request, make_encrypted_request(const host_config &cfg, const request_type &request,
long &response_code, long &response_code, stop_type &stop_requested)
stop_type &stop_requested) -> bool { -> bool {
response_code = 0; response_code = 0;
if (not request.decryption_token.has_value() || if (not request.decryption_token.has_value() ||
@ -193,6 +194,16 @@ public:
request.aws_service.value().c_str()); request.aws_service.value().c_str());
} }
curl_slist *header_list{nullptr};
if (not request.headers.empty()) {
for (const auto &&header : request.headers) {
header_list = curl_slist_append(
header_list,
fmt::format("{}: {}", header.first, header.second).c_str());
}
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list);
}
auto url = construct_url(curl, request.get_path(), cfg) + parameters; auto url = construct_url(curl, request.get_path(), cfg) + parameters;
curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
@ -200,6 +211,11 @@ public:
CURLcode curl_code{}; CURLcode curl_code{};
curl_request.get_result(curl_code, response_code); curl_request.get_result(curl_code, response_code);
if (header_list != nullptr) {
curl_slist_free_all(header_list);
}
if (curl_code != CURLE_OK) { if (curl_code != CURLE_OK) {
event_system::instance().raise<curl_error>(url, curl_code); event_system::instance().raise<curl_error>(url, curl_code);
return false; return false;
@ -215,26 +231,30 @@ public:
public: public:
void enable_s3_path_style(bool enable) override; void enable_s3_path_style(bool enable) override;
[[nodiscard]] auto [[nodiscard]] auto make_request(const curl::requests::http_delete &del,
make_request(const curl::requests::http_delete &del, long &response_code, long &response_code,
stop_type &stop_requested) const -> bool override; stop_type &stop_requested) const
-> bool override;
[[nodiscard]] auto [[nodiscard]] auto make_request(const curl::requests::http_get &get,
make_request(const curl::requests::http_get &get, long &response_code, long &response_code,
stop_type &stop_requested) const -> bool override; stop_type &stop_requested) const
-> bool override;
[[nodiscard]] auto [[nodiscard]] auto make_request(const curl::requests::http_head &head,
make_request(const curl::requests::http_head &head, long &response_code, long &response_code,
stop_type &stop_requested) const -> bool override; stop_type &stop_requested) const
-> bool override;
[[nodiscard]] auto [[nodiscard]] auto make_request(const curl::requests::http_post &post_file,
make_request(const curl::requests::http_post &post_file, long &response_code, long &response_code,
stop_type &stop_requested) const -> bool override; stop_type &stop_requested) const
-> bool override;
[[nodiscard]] auto [[nodiscard]] auto make_request(const curl::requests::http_put_file &put_file,
make_request(const curl::requests::http_put_file &put_file, long &response_code,
long &response_code, stop_type &stop_requested) const
stop_type &stop_requested) const -> bool override; -> bool override;
}; };
} // namespace repertory } // namespace repertory

View File

@ -32,15 +32,15 @@ struct http_post final : http_request_base {
auto operator=(const http_post &) -> http_post & = default; auto operator=(const http_post &) -> http_post & = default;
auto operator=(http_post &&) -> http_post & = default; auto operator=(http_post &&) -> http_post & = default;
~http_post() override; ~http_post() override = default;
std::optional<nlohmann::json> json; std::optional<nlohmann::json> json;
[[nodiscard]] auto [[nodiscard]] auto set_method(CURL *curl,
set_method(CURL *curl, stop_type & /*stop_requested*/) const -> bool override; stop_type & /*stop_requested*/) const
-> bool override;
private: private:
mutable curl_slist *headers{nullptr};
mutable std::optional<std::string> json_str; mutable std::optional<std::string> json_str;
}; };
} // namespace repertory::curl::requests } // namespace repertory::curl::requests

View File

@ -51,7 +51,7 @@ struct http_request_base {
bool allow_timeout{}; bool allow_timeout{};
std::optional<std::string> aws_service; std::optional<std::string> aws_service;
std::optional<std::string> decryption_token{}; std::optional<std::string> decryption_token{};
http_headers headers{}; mutable http_headers headers{};
std::string path{}; std::string path{};
http_query_parameters query{}; http_query_parameters query{};
std::optional<http_range> range{}; std::optional<http_range> range{};

View File

@ -22,18 +22,11 @@
#include "comm/curl/requests/http_post.hpp" #include "comm/curl/requests/http_post.hpp"
namespace repertory::curl::requests { namespace repertory::curl::requests {
http_post::~http_post() {
if (headers != nullptr) {
curl_slist_free_all(headers);
}
}
auto http_post::set_method(CURL *curl, stop_type & /*stop_requested*/) const auto http_post::set_method(CURL *curl, stop_type & /*stop_requested*/) const
-> bool { -> bool {
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST"); curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
if (json.has_value()) { if (json.has_value()) {
headers = curl_slist_append(headers, "content-type: application/json"); headers["content-type"] = "application/json";
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
json_str = json->dump(); json_str = json->dump();
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_str->c_str()); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_str->c_str());

View File

@ -468,7 +468,7 @@ struct http_range final {
std::uint64_t end{}; std::uint64_t end{};
}; };
using http_headers = std::unordered_map<std::string, std::string>; using http_headers = std::map<std::string, std::string>;
using http_query_parameters = std::map<std::string, std::string>; using http_query_parameters = std::map<std::string, std::string>;
using http_ranges = std::vector<http_range>; using http_ranges = std::vector<http_range>;
#endif // defined(PROJECT_ENABLE_CURL) #endif // defined(PROJECT_ENABLE_CURL)