]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Save status for HTTP errors.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 30 Apr 2014 22:33:42 +0000 (15:33 -0700)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 30 Apr 2014 22:33:42 +0000 (15:33 -0700)
src/libutil/http.c
src/libutil/http.h

index 26dc67900702dcad9c0296ca859667ebe3d32b3c..1b17b59577be11dc5b3c36648796bd638c1a463a 100644 (file)
@@ -392,6 +392,24 @@ rspamd_http_on_url (http_parser* parser, const gchar *at, size_t length)
        return 0;
 }
 
+static gint
+rspamd_http_on_status (http_parser* parser, const gchar *at, size_t length)
+{
+       struct rspamd_http_connection *conn = (struct rspamd_http_connection *)parser->data;
+       struct rspamd_http_connection_private *priv;
+
+       priv = conn->priv;
+
+       if (parser->status_code != 200) {
+               if (priv->msg->status == NULL) {
+                       priv->msg->status = g_string_sized_new (128);
+               }
+               g_string_append_len (priv->msg->status, at, length);
+       }
+
+       return 0;
+}
+
 static gint
 rspamd_http_on_header_field (http_parser* parser, const gchar *at, size_t length)
 {
@@ -664,6 +682,7 @@ rspamd_http_connection_new (rspamd_http_body_handler_t body_handler,
        http_parser_init (&priv->parser, type == RSPAMD_HTTP_SERVER ? HTTP_REQUEST : HTTP_RESPONSE);
        priv->parser.data = new;
        priv->parser_cb.on_url = rspamd_http_on_url;
+       priv->parser_cb.on_status = rspamd_http_on_status;
        priv->parser_cb.on_header_field = rspamd_http_on_header_field;
        priv->parser_cb.on_header_value = rspamd_http_on_header_value;
        priv->parser_cb.on_headers_complete = rspamd_http_on_headers_complete;
@@ -898,6 +917,7 @@ rspamd_http_new_message (enum http_parser_type type)
        new->headers = NULL;
        new->date = 0;
        new->body = NULL;
+       new->status = NULL;
        new->type = type;
        new->method = HTTP_GET;
 
@@ -920,6 +940,9 @@ rspamd_http_message_free (struct rspamd_http_message *msg)
        if (msg->url != NULL) {
                g_string_free (msg->url, TRUE);
        }
+       if (msg->status != NULL) {
+               g_string_free (msg->status, TRUE);
+       }
        g_slice_free1 (sizeof (struct rspamd_http_message), msg);
 }
 
index a761356164056bd6e72f19a324dbb280deff08f0..695f23896268a3ee5b6c440b9c80bf0761fcb475 100644 (file)
@@ -53,6 +53,7 @@ struct rspamd_http_header {
  */
 struct rspamd_http_message {
        GString *url;
+       GString *status;
        struct rspamd_http_header *headers;
        GString *body;
        enum http_parser_type type;