}
struct rspamd_http_message *
-rspamd_http_connection_copy_msg (struct rspamd_http_message *msg)
+rspamd_http_connection_copy_msg (struct rspamd_http_message *msg, GError **err)
{
struct rspamd_http_message *new_msg;
struct rspamd_http_header *hdr, *nhdr, *nhdrs, *thdr, *hcur;
if (storage->shared.shm_fd == -1) {
rspamd_http_message_unref (new_msg);
+ g_set_error (err, http_error_quark (), errno,
+ "cannot dup shmem fd: %d: %s",
+ msg->body_buf.c.shared.shm_fd, strerror (errno));
+
return NULL;
}
if (fstat (storage->shared.shm_fd, &st) == -1) {
+ g_set_error (err, http_error_quark (), errno,
+ "cannot stat shmem fd: %d: %s",
+ storage->shared.shm_fd, strerror (errno));
rspamd_http_message_unref (new_msg);
+
return NULL;
}
storage->shared.shm_fd, 0);
if (new_msg->body_buf.str == MAP_FAILED) {
+ g_set_error (err, http_error_quark (), errno,
+ "cannot mmap shmem fd: %d: %s",
+ storage->shared.shm_fd, strerror (errno));
rspamd_http_message_unref (new_msg);
+
return NULL;
}
old_body = rspamd_http_message_get_body (msg, &old_len);
if (!rspamd_http_message_set_body (new_msg, old_body, old_len)) {
+ g_set_error (err, http_error_quark (), errno,
+ "cannot set body for message, length: %zd",
+ old_len);
rspamd_http_message_unref (new_msg);
+
return NULL;
}
}
guint i;
struct rspamd_proxy_backend_connection *bk_conn;
struct rspamd_http_message *msg;
+ GError *err = NULL;
coin = rspamd_random_double ();
continue;
}
- msg = rspamd_http_connection_copy_msg (session->client_message);
+ msg = rspamd_http_connection_copy_msg (session->client_message, &err);
if (msg == NULL) {
- msg_err_session ("cannot copy message to send to a mirror %s: %s",
- m->name, strerror (errno));
+ msg_err_session ("cannot copy message to send to a mirror %s: %e",
+ m->name, err);
+ if (err) {
+ g_error_free (err);
+ }
continue;
}
struct rspamd_http_message *msg;
struct rspamd_http_upstream *backend = NULL;
const rspamd_ftok_t *host;
+ GError *err = NULL;
gchar hostbuf[512];
host = rspamd_http_message_find_header (session->client_message, "Host");
goto retry;
}
+ msg = rspamd_http_connection_copy_msg (session->client_message, &err);
+ if (msg == NULL) {
+ msg_err_session ("cannot copy message to send it to the upstream: %e",
+ err);
+
+ if (err) {
+ g_error_free (err);
+ }
+
+ goto err; /* No fallback here */
+ }
+
session->master_conn->backend_conn = rspamd_http_connection_new (
NULL,
proxy_backend_master_error_handler,
session->master_conn->parser_from_ref = backend->parser_from_ref;
session->master_conn->parser_to_ref = backend->parser_to_ref;
- msg = rspamd_http_connection_copy_msg (session->client_message);
-
if (backend->key) {
msg->peer_key = rspamd_pubkey_ref (backend->key);
rspamd_http_connection_set_key (session->master_conn->backend_conn,