From 53ab3de17aed083910e2d6df4de96aafbcce97db Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Wed, 11 Jan 2017 13:40:33 +0000 Subject: [PATCH] [Minor] Treat special HTTP methods specially --- interface/js/rspamd.js | 3 ++ src/libutil/http.c | 78 +++++++++++++++++++++++++----------------- src/libutil/http.h | 1 + 3 files changed, 51 insertions(+), 31 deletions(-) diff --git a/interface/js/rspamd.js b/interface/js/rspamd.js index c414ccbf1..41fc43986 100644 --- a/interface/js/rspamd.js +++ b/interface/js/rspamd.js @@ -451,6 +451,9 @@ on_error(neighbours_status[ind], jqXHR, textStatus, errorThrown); } + if (neighbours_status.every(function (elt) {return elt.checked;})) { + on_success(neighbours_status); + } } //error display }); diff --git a/src/libutil/http.c b/src/libutil/http.c index df167d615..deed78a1a 100644 --- a/src/libutil/http.c +++ b/src/libutil/http.c @@ -2965,6 +2965,32 @@ rspamd_http_router_try_file (struct rspamd_http_connection_entry *entry, return TRUE; } +static void +rspamd_http_router_send_error (GError *err, + struct rspamd_http_connection_entry *entry) +{ + struct rspamd_http_message *err_msg; + + err_msg = rspamd_http_new_message (HTTP_RESPONSE); + err_msg->date = time (NULL); + err_msg->code = err->code; + rspamd_http_message_set_body (err_msg, err->message, + strlen (err->message)); + entry->is_reply = TRUE; + err_msg->status = rspamd_fstring_new_init (err->message, strlen (err->message)); + rspamd_http_router_insert_headers (entry->rt, err_msg); + rspamd_http_connection_reset (entry->conn); + rspamd_http_connection_write_message (entry->conn, + err_msg, + NULL, + "text/plain", + entry, + entry->conn->fd, + entry->rt->ptv, + entry->rt->ev_base); +} + + static int rspamd_http_router_finish_handler (struct rspamd_http_connection *conn, struct rspamd_http_message *msg) @@ -2972,7 +2998,7 @@ rspamd_http_router_finish_handler (struct rspamd_http_connection *conn, struct rspamd_http_connection_entry *entry = conn->ud; rspamd_http_router_handler_t handler = NULL; gpointer found; - struct rspamd_http_message *err_msg; + GError *err; rspamd_ftok_t lookup; struct http_parser_url u; @@ -2991,6 +3017,24 @@ rspamd_http_router_finish_handler (struct rspamd_http_connection *conn, rspamd_http_entry_free (entry); } else { + if (G_UNLIKELY (msg->method != HTTP_GET && msg->method != HTTP_POST)) { + if (router->unknown_method_handler) { + return router->unknown_method_handler (entry, msg); + } + else { + err = g_error_new (HTTP_ERROR, 500, + "Invalid method"); + if (entry->rt->error_handler != NULL) { + entry->rt->error_handler (entry, err); + } + + rspamd_http_router_send_error (err, entry); + g_error_free (err); + + return 0; + } + } + /* Search for path */ if (msg->url != NULL && msg->url->len != 0) { @@ -3020,21 +3064,7 @@ rspamd_http_router_finish_handler (struct rspamd_http_connection *conn, entry->rt->error_handler (entry, err); } - err_msg = rspamd_http_new_message (HTTP_RESPONSE); - err_msg->date = time (NULL); - err_msg->code = err->code; - rspamd_http_message_set_body (err_msg, err->message, - strlen (err->message)); - rspamd_http_router_insert_headers (router, err_msg); - rspamd_http_connection_reset (entry->conn); - rspamd_http_connection_write_message (entry->conn, - err_msg, - NULL, - "text/plain", - entry, - entry->conn->fd, - entry->rt->ptv, - entry->rt->ev_base); + rspamd_http_router_send_error (err, entry); g_error_free (err); return 0; @@ -3069,21 +3099,7 @@ rspamd_http_router_finish_handler (struct rspamd_http_connection *conn, } msg_info ("path: %T not found", &lookup); - err_msg = rspamd_http_new_message (HTTP_RESPONSE); - err_msg->date = time (NULL); - err_msg->code = err->code; - rspamd_http_router_insert_headers (router, err_msg); - rspamd_http_message_set_body (err_msg, err->message, - strlen (err->message)); - rspamd_http_connection_reset (entry->conn); - rspamd_http_connection_write_message (entry->conn, - err_msg, - NULL, - "text/plain", - entry, - entry->conn->fd, - entry->rt->ptv, - entry->rt->ev_base); + rspamd_http_router_send_error (err, entry); g_error_free (err); } } diff --git a/src/libutil/http.h b/src/libutil/http.h index f41c3ee31..3bad64ae2 100644 --- a/src/libutil/http.h +++ b/src/libutil/http.h @@ -134,6 +134,7 @@ struct rspamd_http_connection_router { struct event_base *ev_base; struct rspamd_keypair_cache *cache; gchar *default_fs_path; + rspamd_http_router_handler_t unknown_method_handler; struct rspamd_cryptobox_keypair *key; rspamd_http_router_error_handler_t error_handler; rspamd_http_router_finish_handler_t finish_handler; -- 2.39.5