Browse Source

[Minor] Treat special HTTP methods specially

pull/1337/head
Vsevolod Stakhov 9 years ago
parent
commit
53ab3de17a
  1. 3
      interface/js/rspamd.js
  2. 78
      src/libutil/http.c
  3. 1
      src/libutil/http.h

3
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
});

78
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);
}
}

1
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;

Loading…
Cancel
Save