21#include <unordered_map>
27namespace kcenon {
namespace monitoring {
36 std::unordered_map<std::string, std::string>
headers;
49 std::unordered_map<std::string, std::string>
headers;
75 virtual std::string
name()
const = 0;
120 response.
elapsed = std::chrono::milliseconds(10);
122 return common::ok(response);
129 std::string
name()
const override {
155 "Invalid URL: " + request.
url);
164 static bool warned =
false;
167 std::cerr <<
"[monitoring_system] WARNING: Trace export configured but no HTTP "
168 <<
"transport available. Build with MONITORING_WITH_NETWORK_SYSTEM=ON "
169 <<
"or provide a real http_transport implementation. "
170 <<
"Trace data is NOT being exported.\n";
175 "No HTTP transport available (stub mode)");
184 std::string
name()
const override {
201 auto scheme_end = url.find(
"://");
202 if (scheme_end == std::string::npos) {
205 parts.
scheme = url.substr(0, scheme_end);
208 auto host_start = scheme_end + 3;
209 auto path_start = url.find(
'/', host_start);
210 if (path_start == std::string::npos) {
211 path_start = url.length();
214 auto host_port = url.substr(host_start, path_start - host_start);
215 auto colon_pos = host_port.find(
':');
216 if (colon_pos != std::string::npos) {
217 parts.
host = host_port.substr(0, colon_pos);
219 parts.
port = std::stoi(host_port.substr(colon_pos + 1));
224 parts.
host = host_port;
225 parts.
port = (parts.
scheme ==
"https") ? 443 : 80;
229 if (path_start < url.length()) {
230 parts.
path = url.substr(path_start);
240#ifdef MONITORING_HAS_NETWORK_SYSTEM
241#include <kcenon/network/core/http_client.h>
250class network_http_transport :
public http_transport {
252 std::shared_ptr<network_system::core::http_client> client_;
255 explicit network_http_transport(std::chrono::milliseconds timeout = std::chrono::milliseconds(30000))
256 : client_(std::make_shared<network_system::core::http_client>(timeout)) {}
258 common::Result<http_response> send(
const http_request& request)
override {
260 std::map<std::string, std::string> headers(request.headers.begin(), request.headers.end());
263 network_system::core::Result<network_system::core::internal::http_response> net_result;
265 if (request.method ==
"GET") {
266 net_result = client_->get(request.url, {}, headers);
267 }
else if (request.method ==
"POST") {
268 net_result = client_->post(request.url, request.body, headers);
269 }
else if (request.method ==
"PUT") {
270 std::string body_str(request.body.begin(), request.body.end());
271 net_result = client_->put(request.url, body_str, headers);
272 }
else if (request.method ==
"DELETE") {
273 net_result = client_->del(request.url, headers);
274 }
else if (request.method ==
"HEAD") {
275 net_result = client_->head(request.url, headers);
276 }
else if (request.method ==
"PATCH") {
277 std::string body_str(request.body.begin(), request.body.end());
278 net_result = client_->patch(request.url, body_str, headers);
280 return common::make_error<http_response>(
static_cast<int>(monitoring_error_code::invalid_configuration),
281 "Unsupported HTTP method: " + request.method);
285 return common::make_error<http_response>(
static_cast<int>(monitoring_error_code::operation_failed),
286 "HTTP request failed: " + net_result.error().message);
290 http_response response;
291 response.status_code = net_result->status_code;
292 response.status_message = net_result->status_text;
293 response.body = net_result->body;
296 for (
const auto& [key, value] : net_result->headers) {
297 response.headers[key] = value;
300 return common::ok(response);
303 bool is_available()
const override {
307 std::string name()
const override {
308 return "network_system";
320#ifdef MONITORING_HAS_NETWORK_SYSTEM
321 return std::make_unique<network_http_transport>();
323 return std::make_unique<simple_http_client>();
331 return std::make_unique<stub_http_transport>();
334#ifdef MONITORING_HAS_NETWORK_SYSTEM
338inline std::unique_ptr<network_http_transport> create_network_transport(
339 std::chrono::milliseconds timeout = std::chrono::milliseconds(30000)) {
340 return std::make_unique<network_http_transport>(timeout);
Abstract HTTP transport interface.
virtual bool is_available() const =0
Check if transport is available.
virtual std::string name() const =0
Get transport name.
virtual ~http_transport()=default
virtual common::Result< http_response > send(const http_request &request)=0
Send HTTP request and receive response.
Simple HTTP client using basic socket operations.
url_parts parse_url(const std::string &url)
simple_http_client(std::chrono::milliseconds timeout=std::chrono::milliseconds(30000))
common::Result< http_response > send(const http_request &request) override
Send HTTP request and receive response.
std::string name() const override
Get transport name.
std::chrono::milliseconds default_timeout_
bool is_available() const override
Check if transport is available.
Stub HTTP transport for testing.
void set_simulate_success(bool success)
Set whether to simulate success or failure.
void set_response_handler(std::function< http_response(const http_request &)> handler)
Set custom response handler for testing.
std::string name() const override
Get transport name.
common::Result< http_response > send(const http_request &request) override
Send HTTP request and receive response.
std::function< http_response(const http_request &)> response_handler_
stub_http_transport()=default
bool is_available() const override
Check if transport is available.
Monitoring system specific error codes.
std::unique_ptr< http_transport > create_default_transport()
Create default HTTP transport.
std::unique_ptr< stub_http_transport > create_stub_transport()
Create stub HTTP transport for testing.
Result pattern type definitions for monitoring system.
Extended error information with context.
common::error_info to_common_error() const
Convert to common_system error_info.
HTTP request configuration.
std::chrono::milliseconds timeout
std::vector< uint8_t > body
std::unordered_map< std::string, std::string > headers
std::chrono::milliseconds elapsed
std::string status_message
std::vector< uint8_t > body
std::unordered_map< std::string, std::string > headers