aboutsummaryrefslogtreecommitdiffstats
path: root/src/libutil
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2015-08-11 13:04:24 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2015-08-11 13:04:24 +0100
commit6a11a168bd2d1eb725c14c43c11b8881faa9182b (patch)
treeee5c22ae6147e25634d61142cd975af000c43e1e /src/libutil
parentab7af90801ed1654a5fb557f815e2c30f8b48b3e (diff)
downloadrspamd-6a11a168bd2d1eb725c14c43c11b8881faa9182b.tar.gz
rspamd-6a11a168bd2d1eb725c14c43c11b8881faa9182b.zip
Handle merely path in HTTP requests for the router.
Diffstat (limited to 'src/libutil')
-rw-r--r--src/libutil/http.c41
1 files changed, 30 insertions, 11 deletions
diff --git a/src/libutil/http.c b/src/libutil/http.c
index 58f2378e5..3e4e4a7c4 100644
--- a/src/libutil/http.c
+++ b/src/libutil/http.c
@@ -1896,7 +1896,7 @@ rspamd_http_router_is_subdir (const gchar *parent, const gchar *sub)
static gboolean
rspamd_http_router_try_file (struct rspamd_http_connection_entry *entry,
- struct rspamd_http_message *msg, gboolean expand_path)
+ GString *lookup, gboolean expand_path)
{
struct stat st;
gint fd;
@@ -1904,7 +1904,7 @@ rspamd_http_router_try_file (struct rspamd_http_connection_entry *entry,
struct rspamd_http_message *reply_msg;
rspamd_snprintf (filebuf, sizeof (filebuf), "%s%c%v",
- entry->rt->default_fs_path, G_DIR_SEPARATOR, msg->url);
+ entry->rt->default_fs_path, G_DIR_SEPARATOR, lookup);
if (realpath (filebuf, realbuf) == NULL ||
lstat (realbuf, &st) == -1) {
@@ -1913,9 +1913,9 @@ rspamd_http_router_try_file (struct rspamd_http_connection_entry *entry,
if (S_ISDIR (st.st_mode) && expand_path) {
/* Try to append 'index.html' to the url */
- g_string_append_printf (msg->url, "%c%s", G_DIR_SEPARATOR,
+ g_string_append_printf (lookup, "%c%s", G_DIR_SEPARATOR,
"index.html");
- return rspamd_http_router_try_file (entry, msg, FALSE);
+ return rspamd_http_router_try_file (entry, lookup, FALSE);
}
else if (!S_ISREG (st.st_mode)) {
return FALSE;
@@ -1973,10 +1973,14 @@ rspamd_http_router_finish_handler (struct rspamd_http_connection *conn,
gpointer found;
struct rspamd_http_message *err_msg;
GError *err;
+ GString lookup;
+ struct http_parser_url u;
G_STATIC_ASSERT (sizeof (rspamd_http_router_handler_t) ==
sizeof (gpointer));
+ memset (&lookup, 0, sizeof (lookup));
+
if (entry->is_reply) {
/* Request is finished, it is safe to free a connection */
rspamd_http_entry_free (entry);
@@ -1984,23 +1988,35 @@ rspamd_http_router_finish_handler (struct rspamd_http_connection *conn,
else {
/* Search for path */
if (msg->url != NULL && msg->url->len != 0) {
- found = g_hash_table_lookup (entry->rt->paths, msg->url->str);
+
+ http_parser_parse_url (msg->url->str, msg->url->len, TRUE, &u);
+
+ if (u.field_set & (1 << UF_PATH)) {
+ lookup.str = msg->url->str + u.field_data[UF_PATH].off;
+ lookup.len = u.field_data[UF_PATH].len;
+ }
+ else {
+ lookup.str = msg->url->str;
+ lookup.len = msg->url->len;
+ }
+
+ found = g_hash_table_lookup (entry->rt->paths, &lookup);
memcpy (&handler, &found, sizeof (found));
- msg_debug ("requested known path: %v", msg->url);
+ msg_debug ("requested known path: %v", &lookup);
}
entry->is_reply = TRUE;
if (handler != NULL) {
return handler (entry, msg);
}
else {
- if (entry->rt->default_fs_path == NULL ||
- !rspamd_http_router_try_file (entry, msg, TRUE)) {
+ if (entry->rt->default_fs_path == NULL || lookup.len == 0 ||
+ !rspamd_http_router_try_file (entry, &lookup, TRUE)) {
err = g_error_new (HTTP_ERROR, 404,
"Not found");
if (entry->rt->error_handler != NULL) {
entry->rt->error_handler (entry, err);
}
- msg_info ("path: %v not found", msg->url);
+ msg_info ("path: %v not found", &lookup);
err_msg = rspamd_http_new_message (HTTP_RESPONSE);
err_msg->date = time (NULL);
err_msg->code = err->code;
@@ -2033,7 +2049,8 @@ rspamd_http_router_new (rspamd_http_router_error_handler_t eh,
struct stat st;
new = g_slice_alloc0 (sizeof (struct rspamd_http_connection_router));
- new->paths = g_hash_table_new (rspamd_strcase_hash, rspamd_strcase_equal);
+ new->paths = g_hash_table_new_full (rspamd_gstring_icase_hash,
+ rspamd_gstring_icase_equal, rspamd_gstring_free_hard, NULL);
new->conns = NULL;
new->error_handler = eh;
new->finish_handler = fh;
@@ -2084,12 +2101,14 @@ rspamd_http_router_add_path (struct rspamd_http_connection_router *router,
const gchar *path, rspamd_http_router_handler_t handler)
{
gpointer ptr;
+ GString *key;
G_STATIC_ASSERT (sizeof (rspamd_http_router_handler_t) ==
sizeof (gpointer));
if (path != NULL && handler != NULL && router != NULL) {
memcpy (&ptr, &handler, sizeof (ptr));
- g_hash_table_insert (router->paths, (gpointer)path, ptr);
+ key = g_string_new (path);
+ g_hash_table_insert (router->paths, key, ptr);
}
}