Rework base URL setting

This commit is contained in:
Gergely Polonkai 2016-01-15 12:38:37 +01:00
parent 842a516e21
commit 451c7e4863

View File

@ -107,6 +107,31 @@ matrix_http_api_finalize(GObject *gobject)
G_OBJECT_CLASS(matrix_http_api_parent_class)->finalize(gobject); G_OBJECT_CLASS(matrix_http_api_parent_class)->finalize(gobject);
} }
static void
_set_url(SoupURI **uri, const gchar *base, const gchar *endpoint)
{
gchar *url;
SoupURI *new_uri;
if (base[strlen(base) - 1] == '/') {
url = g_strdup_printf("%s%s", base, endpoint + 1);
} else {
url = g_strdup_printf("%s%s", base, endpoint);
}
new_uri = soup_uri_new(url);
if (new_uri && SOUP_URI_VALID_FOR_HTTP(new_uri)) {
*uri = new_uri;
} else {
if (new_uri) {
soup_uri_free(new_uri);
}
*uri = NULL;
}
}
static void static void
matrix_http_api_set_property(GObject *gobject, matrix_http_api_set_property(GObject *gobject,
guint prop_id, guint prop_id,
@ -126,8 +151,7 @@ matrix_http_api_set_property(GObject *gobject,
{ {
const gchar *base_url; const gchar *base_url;
gchar *last_occurence; gchar *last_occurence;
gchar *url; SoupURI *api_uri;
SoupURI *new_uri;
base_url = g_value_get_string(value); base_url = g_value_get_string(value);
@ -137,45 +161,27 @@ matrix_http_api_set_property(GObject *gobject,
return; return;
} }
last_occurence = g_strrstr(base_url, API_ENDPOINT);
/* Check if the provided URL already ends with the API endpoint */ /* Check if the provided URL already ends with the API endpoint */
if (g_strcmp0(last_occurence, API_ENDPOINT) == 0) { if ((last_occurence = g_strrstr(base_url, API_ENDPOINT)) != NULL) {
/* if so, just use it */ g_warning("Provided URL (%s) already contains the API endpoint. Please use an URL without it!", base_url);
url = g_strdup(base_url);
} else {
/* if not, add the API endpoint */
gchar *url_tmp; return;
/* If the provided URL already contains the API
* endpoint, but its not at the end, print a message,
* but still continue */
if (last_occurence != NULL) {
g_info("Provided URL (%s) already contains the API endpoint but not at the end; appending anyway", base_url);
} }
url_tmp = g_strdup(base_url); _set_url(&api_uri, base_url, API_ENDPOINT);
/* Cut trailing slash, if present */ if (api_uri) {
if (url_tmp[strlen(url_tmp) - 1] == '/') { gchar *api_url;
url_tmp[strlen(url_tmp) - 1] = 0;
}
url = g_strdup_printf("%s%s", url_tmp, API_ENDPOINT);
g_free(url_tmp);
g_debug("Set base URL to %s", url);
}
new_uri = soup_uri_new(url);
if (new_uri && SOUP_URI_VALID_FOR_HTTP(new_uri)) {
if (priv->uri) { if (priv->uri) {
soup_uri_free(priv->uri); soup_uri_free(priv->uri);
} }
priv->uri = new_uri;
priv->uri = api_uri;
// Free all tokens and IDs, as they wont be valid for
// the new server
g_free(priv->token); g_free(priv->token);
priv->token = NULL; priv->token = NULL;
g_free(priv->refresh_token); g_free(priv->refresh_token);
@ -184,15 +190,20 @@ matrix_http_api_set_property(GObject *gobject,
priv->homeserver = NULL; priv->homeserver = NULL;
g_free(priv->user_id); g_free(priv->user_id);
priv->user_id = NULL; priv->user_id = NULL;
api_url = soup_uri_to_string(api_uri, FALSE);
g_debug("API URL: %s", api_url);
g_free(api_url);
} else { } else {
if (new_uri) { if (api_uri) {
soup_uri_free(new_uri); soup_uri_free(api_uri);
} }
g_warning("Invalid URL: %s", url);
}
g_free(url); g_warning("Invalid URL: %s", base_url);
}
break; break;
} }