**/
/**
+ * SOUP_URI_IS_VALID:
+ * @uri: a #SoupURI
+ *
+ * Tests whether @uri is a valid #SoupURI; that is, that it is non-%NULL
+ * and its @scheme and @path members are also non-%NULL.
+ *
+ * This macro does not check whether http and https URIs have a non-%NULL
+ * @host member.
+ *
+ * Return value: %TRUE if @uri is valid for use.
+ *
+ * Since: 2.38
+ **/
+
+/**
* SOUP_URI_VALID_FOR_HTTP:
* @uri: a #SoupURI
*
gboolean remove_dot_segments = TRUE;
int len;
+ g_return_val_if_fail (base == NULL || SOUP_URI_IS_VALID (base), NULL);
+ g_return_val_if_fail (uri_string != NULL, NULL);
+
/* First some cleanup steps (which are supposed to all be no-ops,
* but...). Skip initial whitespace, strip out internal tabs and
* line breaks, and ignore trailing whitespace.
GString *str;
char *return_result;
- g_return_val_if_fail (uri != NULL, NULL);
+ g_return_val_if_fail (SOUP_URI_IS_VALID (uri), NULL);
/* IF YOU CHANGE ANYTHING IN THIS FUNCTION, RUN
* tests/uri-parsing AFTERWARD.
{
SoupURI *dup;
- g_return_val_if_fail (uri != NULL, NULL);
+ g_return_val_if_fail (SOUP_URI_IS_VALID (uri), NULL);
dup = g_slice_new0 (SoupURI);
dup->scheme = uri->scheme;
gboolean
soup_uri_equal (SoupURI *uri1, SoupURI *uri2)
{
+ g_return_val_if_fail (SOUP_URI_IS_VALID (uri1), FALSE);
+ g_return_val_if_fail (SOUP_URI_IS_VALID (uri2), FALSE);
+
if (uri1->scheme != uri2->scheme ||
uri1->port != uri2->port ||
!parts_equal (uri1->user, uri2->user, FALSE) ||
GString *str;
char *encoded;
+ g_return_val_if_fail (part != NULL, NULL);
+
str = g_string_new (NULL);
append_uri_encoded (str, part, escape_extra);
encoded = str->str;
unsigned char *s, *d;
char *decoded = g_strndup (part, length);
+ g_return_val_if_fail (part != NULL, NULL);
+
s = d = (unsigned char *)decoded;
do {
if (*s == '%') {
char *
soup_uri_decode (const char *part)
{
+ g_return_val_if_fail (part != NULL, NULL);
+
return uri_decoded_copy (part, strlen (part));
}
char *
soup_uri_normalize (const char *part, const char *unescape_extra)
{
+ g_return_val_if_fail (part != NULL, NULL);
+
return uri_normalized_copy (part, strlen (part), unescape_extra);
}
gboolean
soup_uri_uses_default_port (SoupURI *uri)
{
+ g_return_val_if_fail (uri != NULL, FALSE);
+ g_return_val_if_fail (SOUP_URI_IS_VALID (uri), FALSE);
+
return uri->port == soup_scheme_default_port (uri->scheme);
}
const char *
soup_uri_get_scheme (SoupURI *uri)
{
+ g_return_val_if_fail (SOUP_URI_IS_VALID (uri), NULL);
+
return uri->scheme;
}
void
soup_uri_set_scheme (SoupURI *uri, const char *scheme)
{
+ g_return_if_fail (uri != NULL);
+ g_return_if_fail (scheme != NULL);
+
uri->scheme = soup_uri_parse_scheme (scheme, strlen (scheme));
uri->port = soup_scheme_default_port (uri->scheme);
}
const char *
soup_uri_get_user (SoupURI *uri)
{
+ g_return_val_if_fail (SOUP_URI_IS_VALID (uri), NULL);
+
return uri->user;
}
/**
* soup_uri_set_user:
* @uri: a #SoupURI
- * @user: the username, or %NULL
+ * @user: (allow-none): the username, or %NULL
*
* Sets @uri's user to @user.
**/
void
soup_uri_set_user (SoupURI *uri, const char *user)
{
+ g_return_if_fail (uri != NULL);
+
g_free (uri->user);
uri->user = g_strdup (user);
}
const char *
soup_uri_get_password (SoupURI *uri)
{
+ g_return_val_if_fail (SOUP_URI_IS_VALID (uri), NULL);
+
return uri->password;
}
/**
* soup_uri_set_password:
* @uri: a #SoupURI
- * @password: the password, or %NULL
+ * @password: (allow-none): the password, or %NULL
*
* Sets @uri's password to @password.
**/
void
soup_uri_set_password (SoupURI *uri, const char *password)
{
+ g_return_if_fail (uri != NULL);
+
g_free (uri->password);
uri->password = g_strdup (password);
}
const char *
soup_uri_get_host (SoupURI *uri)
{
+ g_return_val_if_fail (SOUP_URI_IS_VALID (uri), NULL);
+
return uri->host;
}
/**
* soup_uri_set_host:
* @uri: a #SoupURI
- * @host: the hostname or IP address, or %NULL
+ * @host: (allow-none): the hostname or IP address, or %NULL
*
* Sets @uri's host to @host.
*
* If @host is an IPv6 IP address, it should not include the brackets
* required by the URI syntax; they will be added automatically when
* converting @uri to a string.
+ *
+ * http and https URIs should not have a %NULL @host.
**/
void
soup_uri_set_host (SoupURI *uri, const char *host)
{
+ g_return_if_fail (uri != NULL);
+
g_free (uri->host);
uri->host = g_strdup (host);
}
guint
soup_uri_get_port (SoupURI *uri)
{
+ g_return_val_if_fail (SOUP_URI_IS_VALID (uri), 0);
+
return uri->port;
}
void
soup_uri_set_port (SoupURI *uri, guint port)
{
+ g_return_if_fail (uri != NULL);
+
uri->port = port;
}
const char *
soup_uri_get_path (SoupURI *uri)
{
+ g_return_val_if_fail (SOUP_URI_IS_VALID (uri), NULL);
+
return uri->path;
}
/**
* soup_uri_set_path:
* @uri: a #SoupURI
- * @path: the path
+ * @path: the non-%NULL path
*
* Sets @uri's path to @path.
**/
void
soup_uri_set_path (SoupURI *uri, const char *path)
{
+ g_return_if_fail (uri != NULL);
+ g_return_if_fail (path != NULL);
+
g_free (uri->path);
uri->path = g_strdup (path);
}
const char *
soup_uri_get_query (SoupURI *uri)
{
+ g_return_val_if_fail (SOUP_URI_IS_VALID (uri), NULL);
+
return uri->query;
}
/**
* soup_uri_set_query:
* @uri: a #SoupURI
- * @query: the query
+ * @query: (allow-none): the query
*
* Sets @uri's query to @query.
**/
void
soup_uri_set_query (SoupURI *uri, const char *query)
{
+ g_return_if_fail (uri != NULL);
+
g_free (uri->query);
uri->query = g_strdup (query);
}
void
soup_uri_set_query_from_form (SoupURI *uri, GHashTable *form)
{
+ g_return_if_fail (uri != NULL);
+
g_free (uri->query);
uri->query = soup_form_encode_hash (form);
}
{
va_list args;
+ g_return_if_fail (uri != NULL);
+
g_free (uri->query);
va_start (args, first_field);
uri->query = soup_form_encode_valist (first_field, args);
const char *
soup_uri_get_fragment (SoupURI *uri)
{
+ g_return_val_if_fail (SOUP_URI_IS_VALID (uri), NULL);
+
return uri->fragment;
}
/**
* soup_uri_set_fragment:
* @uri: a #SoupURI
- * @fragment: the fragment
+ * @fragment: (allow-none): the fragment
*
* Sets @uri's fragment to @fragment.
**/
void
soup_uri_set_fragment (SoupURI *uri, const char *fragment)
{
+ g_return_if_fail (uri != NULL);
+
g_free (uri->fragment);
uri->fragment = g_strdup (fragment);
}
{
SoupURI *dup;
- g_return_val_if_fail (uri != NULL, NULL);
+ g_return_val_if_fail (SOUP_URI_IS_VALID (uri), NULL);
dup = soup_uri_new (NULL);
dup->scheme = uri->scheme;
/**
* soup_uri_host_hash:
- * @key: (type Soup.URI): a #SoupURI
+ * @key: (type Soup.URI): a #SoupURI with a non-%NULL @host member
*
* Hashes @key, considering only the scheme, host, and port.
*
{
const SoupURI *uri = key;
- g_return_val_if_fail (uri != NULL && uri->host != NULL, 0);
+ g_return_val_if_fail (SOUP_URI_IS_VALID (uri), 0);
+ g_return_val_if_fail (uri->host != NULL, 0);
return GPOINTER_TO_UINT (uri->scheme) + uri->port +
soup_str_case_hash (uri->host);
/**
* soup_uri_host_equal:
- * @v1: (type Soup.URI): a #SoupURI
- * @v2: (type Soup.URI): a #SoupURI
+ * @v1: (type Soup.URI): a #SoupURI with a non-%NULL @host member
+ * @v2: (type Soup.URI): a #SoupURI with a non-%NULL @host member
*
* Compares @v1 and @v2, considering only the scheme, host, and port.
*
const SoupURI *two = v2;
g_return_val_if_fail (one != NULL && two != NULL, one == two);
+ g_return_val_if_fail (SOUP_URI_IS_VALID (one), FALSE);
+ g_return_val_if_fail (SOUP_URI_IS_VALID (two), FALSE);
g_return_val_if_fail (one->host != NULL && two->host != NULL, one->host == two->host);
if (one->scheme != two->scheme)