summaryrefslogtreecommitdiffstats
path: root/src/stats/event-exporter-transport-http-post.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/stats/event-exporter-transport-http-post.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/stats/event-exporter-transport-http-post.c b/src/stats/event-exporter-transport-http-post.c
new file mode 100644
index 0000000..6d328cd
--- /dev/null
+++ b/src/stats/event-exporter-transport-http-post.c
@@ -0,0 +1,76 @@
+/* Copyright (c) 2019 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "ioloop.h"
+#include "str.h"
+#include "event-exporter.h"
+#include "http-client.h"
+#include "iostream-ssl.h"
+#include "master-service.h"
+#include "master-service-ssl-settings.h"
+
+/* the http client used to export all events with exporter=http-post */
+static struct http_client *exporter_http_client;
+
+void event_export_transport_http_post_deinit(void)
+{
+ if (exporter_http_client != NULL)
+ http_client_deinit(&exporter_http_client);
+}
+
+static void response_fxn(const struct http_response *response,
+ void *context ATTR_UNUSED)
+{
+ static time_t last_log;
+ static unsigned suppressed;
+
+ if (http_response_is_success(response))
+ return;
+
+ if (last_log == ioloop_time) {
+ suppressed++;
+ return; /* don't spam the log */
+ }
+
+ if (suppressed == 0)
+ i_error("Failed to export event via HTTP POST: %d %s",
+ response->status, response->reason);
+ else
+ i_error("Failed to export event via HTTP POST: %d %s (%u more errors suppressed)",
+ response->status, response->reason, suppressed);
+
+ last_log = ioloop_time;
+ suppressed = 0;
+}
+
+void event_export_transport_http_post(const struct exporter *exporter,
+ const buffer_t *buf)
+{
+ struct http_client_request *req;
+
+ if (exporter_http_client == NULL) {
+ const struct master_service_ssl_settings *master_ssl_set =
+ master_service_ssl_settings_get(master_service);
+ struct ssl_iostream_settings ssl_set;
+
+ struct http_client_settings set = {
+ .dns_client_socket_path = "dns-client",
+ };
+ if (master_ssl_set != NULL) {
+ master_service_ssl_client_settings_to_iostream_set(
+ master_ssl_set, pool_datastack_create(),
+ &ssl_set);
+ set.ssl = &ssl_set;
+ }
+ exporter_http_client = http_client_init(&set);
+ }
+
+ req = http_client_request_url_str(exporter_http_client, "POST",
+ exporter->transport_args,
+ response_fxn, NULL);
+ http_client_request_add_header(req, "Content-Type", exporter->format_mime_type);
+ http_client_request_set_payload_data(req, buf->data, buf->used);
+
+ http_client_request_set_timeout_msecs(req, exporter->transport_timeout);
+ http_client_request_submit(req);
+}