aboutsummaryrefslogtreecommitdiffstats
path: root/src/libutil/http.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2016-07-18 17:50:39 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2016-07-18 17:51:26 +0100
commitc2d4fc63c8c7834570c855bc7547f3437c6af6b1 (patch)
tree781ce9d5998a0aff4caafe688a9e0b7d4682248a /src/libutil/http.c
parenta657aaf79e628e5c736f99c52f219ef2d5a40f6e (diff)
downloadrspamd-c2d4fc63c8c7834570c855bc7547f3437c6af6b1.tar.gz
rspamd-c2d4fc63c8c7834570c855bc7547f3437c6af6b1.zip
[Feature] Implement refcount for messages
Diffstat (limited to 'src/libutil/http.c')
-rw-r--r--src/libutil/http.c36
1 files changed, 25 insertions, 11 deletions
diff --git a/src/libutil/http.c b/src/libutil/http.c
index f2d1675c4..7aabba296 100644
--- a/src/libutil/http.c
+++ b/src/libutil/http.c
@@ -1243,7 +1243,7 @@ rspamd_http_connection_reset (struct rspamd_http_connection *conn)
priv->peer_key = msg->peer_key;
msg->peer_key = NULL;
}
- rspamd_http_message_free (msg);
+ rspamd_http_message_unref (msg);
priv->msg = NULL;
}
@@ -1290,19 +1290,15 @@ rspamd_http_connection_steal_msg (struct rspamd_http_connection *conn)
}
struct rspamd_http_message *
-rspamd_http_connection_copy_msg (struct rspamd_http_connection *conn)
+rspamd_http_connection_copy_msg (struct rspamd_http_message *msg)
{
- struct rspamd_http_connection_private *priv;
- struct rspamd_http_message *new_msg, *msg;
+ struct rspamd_http_message *new_msg;
struct rspamd_http_header *hdr, *nhdr, *thdr;
const gchar *old_body;
gsize old_len;
struct stat st;
union _rspamd_storage_u *storage;
- priv = conn->priv;
- msg = priv->msg;
-
new_msg = rspamd_http_new_message (msg->type);
new_msg->flags = msg->flags;
@@ -1316,12 +1312,12 @@ rspamd_http_connection_copy_msg (struct rspamd_http_connection *conn)
storage->shared.shm_fd = dup (msg->body_buf.c.shared.shm_fd);
if (storage->shared.shm_fd == -1) {
- rspamd_http_message_free (new_msg);
+ rspamd_http_message_unref (new_msg);
return NULL;
}
if (fstat (storage->shared.shm_fd, &st) == -1) {
- rspamd_http_message_free (new_msg);
+ rspamd_http_message_unref (new_msg);
return NULL;
}
@@ -1337,7 +1333,7 @@ rspamd_http_connection_copy_msg (struct rspamd_http_connection *conn)
storage->shared.shm_fd, 0);
if (new_msg->body_buf.str == MAP_FAILED) {
- rspamd_http_message_free (new_msg);
+ rspamd_http_message_unref (new_msg);
return NULL;
}
@@ -1350,7 +1346,7 @@ rspamd_http_connection_copy_msg (struct rspamd_http_connection *conn)
old_body = rspamd_http_message_get_body (msg, &old_len);
if (!rspamd_http_message_set_body (new_msg, old_body, old_len)) {
- rspamd_http_message_free (new_msg);
+ rspamd_http_message_unref (new_msg);
return NULL;
}
}
@@ -2120,6 +2116,8 @@ rspamd_http_new_message (enum http_parser_type type)
new->type = type;
new->method = HTTP_GET;
+ REF_INIT_RETAIN (new, rspamd_http_message_free);
+
return new;
}
@@ -2184,6 +2182,8 @@ rspamd_http_message_from_url (const gchar *url)
msg->host = rspamd_fstring_new_init (host, pu.field_data[UF_HOST].len);
msg->url = rspamd_fstring_append (msg->url, path, pathlen);
+ REF_INIT_RETAIN (msg, rspamd_http_message_free);
+
return msg;
}
@@ -3166,3 +3166,17 @@ rspamd_http_date_format (gchar *buf, gsize len, time_t time)
http_month[tms.tm_mon], tms.tm_year + 1900,
tms.tm_hour, tms.tm_min, tms.tm_sec);
}
+
+struct rspamd_http_message *
+rspamd_http_message_ref (struct rspamd_http_message *msg)
+{
+ REF_RETAIN (msg);
+
+ return msg;
+}
+
+void
+rspamd_http_message_unref (struct rspamd_http_message *msg)
+{
+ REF_RELEASE (msg);
+}