From ec4592e610619438d53393f4fb25938801f0a5e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martti=20Rannanj=C3=A4rvi?= Date: Tue, 26 Jun 2018 12:38:50 +0300 Subject: [PATCH] fts-solr: Append '/' to URL path when missing in configuration This fixes a crash when url parameter has empty path like http://localhost:8080 instead of http://localhost:8080/ and makes using url like http://localhost:8080/solr behave the same as http://localhost:8080/solr/ --- src/plugins/fts-solr/solr-connection.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/plugins/fts-solr/solr-connection.c b/src/plugins/fts-solr/solr-connection.c index 3d1546e48a..947ea76af2 100644 --- a/src/plugins/fts-solr/solr-connection.c +++ b/src/plugins/fts-solr/solr-connection.c @@ -101,6 +101,20 @@ static int solr_xml_parse(struct solr_connection *conn, return 0; } +/* Regardless of the specified URL, make sure path ends in '/' */ +static char *solr_connection_create_http_base_url(struct http_url *http_url) +{ + if (http_url->path == NULL) + return i_strconcat("/", http_url->enc_query, NULL); + size_t len = strlen(http_url->path); + if (len > 0 && http_url->path[len-1] != '/') + return i_strconcat(http_url->path, "/", + http_url->enc_query, NULL); + /* http_url->path is NULL on empty path, so this is impossible. */ + i_assert(len != 0); + return i_strconcat(http_url->path, http_url->enc_query, NULL); +} + int solr_connection_init(const char *url, const struct ssl_iostream_settings *ssl_client_set, bool debug, struct solr_connection **conn_r, @@ -121,7 +135,7 @@ int solr_connection_init(const char *url, conn = i_new(struct solr_connection, 1); conn->http_host = i_strdup(http_url->host.name); conn->http_port = http_url->port; - conn->http_base_url = i_strconcat(http_url->path, http_url->enc_query, NULL); + conn->http_base_url = solr_connection_create_http_base_url(http_url); conn->http_ssl = http_url->have_ssl; if (http_url->user != NULL) { conn->http_user = i_strdup(http_url->user);