|
Packit Service |
ca3877 |
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
|
Packit Service |
ca3877 |
/* soup-uri.c : utility functions to parse URLs */
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/*
|
|
Packit Service |
ca3877 |
* Copyright 1999-2003 Ximian, Inc.
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
#ifdef HAVE_CONFIG_H
|
|
Packit Service |
ca3877 |
#include <config.h>
|
|
Packit Service |
ca3877 |
#endif
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
#include <string.h>
|
|
Packit Service |
ca3877 |
#include <stdlib.h>
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
#include "soup-uri.h"
|
|
Packit Service |
ca3877 |
#include "soup.h"
|
|
Packit Service |
ca3877 |
#include "soup-misc-private.h"
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* SECTION:soup-uri
|
|
Packit Service |
ca3877 |
* @short_description: URIs
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* A #SoupURI represents a (parsed) URI.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Many applications will not need to use #SoupURI directly at all; on
|
|
Packit Service |
ca3877 |
* the client side, soup_message_new() takes a stringified URI, and on
|
|
Packit Service |
ca3877 |
* the server side, the path and query components are provided for you
|
|
Packit Service |
ca3877 |
* in the server callback.
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* SoupURI:
|
|
Packit Service |
ca3877 |
* @scheme: the URI scheme (eg, "http")
|
|
Packit Service |
ca3877 |
* @user: a username, or %NULL
|
|
Packit Service |
ca3877 |
* @password: a password, or %NULL
|
|
Packit Service |
ca3877 |
* @host: the hostname or IP address, or %NULL
|
|
Packit Service |
ca3877 |
* @port: the port number on @host
|
|
Packit Service |
ca3877 |
* @path: the path on @host
|
|
Packit Service |
ca3877 |
* @query: a query for @path, or %NULL
|
|
Packit Service |
ca3877 |
* @fragment: a fragment identifier within @path, or %NULL
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* A #SoupURI represents a (parsed) URI. #SoupURI supports RFC 3986
|
|
Packit Service |
ca3877 |
* (URI Generic Syntax), and can parse any valid URI. However, libsoup
|
|
Packit Service |
ca3877 |
* only uses "http" and "https" URIs internally; You can use
|
|
Packit Service |
ca3877 |
* SOUP_URI_VALID_FOR_HTTP() to test if a #SoupURI is a valid HTTP
|
|
Packit Service |
ca3877 |
* URI.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* @scheme will always be set in any URI. It is an interned string and
|
|
Packit Service |
ca3877 |
* is always all lowercase. (If you parse a URI with a non-lowercase
|
|
Packit Service |
ca3877 |
* scheme, it will be converted to lowercase.) The macros
|
|
Packit Service |
ca3877 |
* %SOUP_URI_SCHEME_HTTP and %SOUP_URI_SCHEME_HTTPS provide the
|
|
Packit Service |
ca3877 |
* interned values for "http" and "https" and can be compared against
|
|
Packit Service |
ca3877 |
* URI @scheme values.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* @user and @password are parsed as defined in the older URI specs
|
|
Packit Service |
ca3877 |
* (ie, separated by a colon; RFC 3986 only talks about a single
|
|
Packit Service |
ca3877 |
* "userinfo" field). Note that @password is not included in the
|
|
Packit Service |
ca3877 |
* output of soup_uri_to_string(). libsoup does not normally use these
|
|
Packit Service |
ca3877 |
* fields; authentication is handled via #SoupSession signals.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* @host contains the hostname, and @port the port specified in the
|
|
Packit Service |
ca3877 |
* URI. If the URI doesn't contain a hostname, @host will be %NULL,
|
|
Packit Service |
ca3877 |
* and if it doesn't specify a port, @port may be 0. However, for
|
|
Packit Service |
ca3877 |
* "http" and "https" URIs, @host is guaranteed to be non-%NULL
|
|
Packit Service |
ca3877 |
* (trying to parse an http URI with no @host will return %NULL), and
|
|
Packit Service |
ca3877 |
* @port will always be non-0 (because libsoup knows the default value
|
|
Packit Service |
ca3877 |
* to use when it is not specified in the URI).
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* @path is always non-%NULL. For http/https URIs, @path will never be
|
|
Packit Service |
ca3877 |
* an empty string either; if the input URI has no path, the parsed
|
|
Packit Service |
ca3877 |
* #SoupURI will have a @path of "/".
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* @query and @fragment are optional for all URI types.
|
|
Packit Service |
ca3877 |
* soup_form_decode() may be useful for parsing @query.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Note that @path, @query, and @fragment may contain
|
|
Packit Service |
ca3877 |
* %-encoded characters. soup_uri_new() calls
|
|
Packit Service |
ca3877 |
* soup_uri_normalize() on them, but not soup_uri_decode(). This is
|
|
Packit Service |
ca3877 |
* necessary to ensure that soup_uri_to_string() will generate a URI
|
|
Packit Service |
ca3877 |
* that has exactly the same meaning as the original. (In theory,
|
|
Packit Service |
ca3877 |
* #SoupURI should leave @user, @password, and @host partially-encoded
|
|
Packit Service |
ca3877 |
* as well, but this would be more annoying than useful.)
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* SOUP_URI_IS_VALID:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Tests whether @uri is a valid #SoupURI; that is, that it is non-%NULL
|
|
Packit Service |
ca3877 |
* and its @scheme and @path members are also non-%NULL.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* This macro does not check whether http and https URIs have a non-%NULL
|
|
Packit Service |
ca3877 |
* @host member.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: %TRUE if @uri is valid for use.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.38
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* SOUP_URI_VALID_FOR_HTTP:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Tests if @uri is a valid #SoupURI for HTTP communication; that is, if
|
|
Packit Service |
ca3877 |
* it can be used to construct a #SoupMessage.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: %TRUE if @uri is a valid "http" or "https" URI.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.24
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* SOUP_URI_SCHEME_HTTP:
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* "http" as an interned string; you can compare this directly to a
|
|
Packit Service |
ca3877 |
* #SoupURI's <literal>scheme</literal> field using
|
|
Packit Service |
ca3877 |
* <literal>==</literal>.
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* SOUP_URI_SCHEME_HTTPS:
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* "https" as an interned string; you can compare this directly to a
|
|
Packit Service |
ca3877 |
* #SoupURI's <literal>scheme</literal> field using
|
|
Packit Service |
ca3877 |
* <literal>==</literal>.
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* SOUP_URI_SCHEME_FTP:
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* "ftp" as an interned string; you can compare this directly to a
|
|
Packit Service |
ca3877 |
* #SoupURI's <literal>scheme</literal> field using
|
|
Packit Service |
ca3877 |
* <literal>==</literal>.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.30
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* SOUP_URI_SCHEME_FILE:
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* "file" as an interned string; you can compare this directly to a
|
|
Packit Service |
ca3877 |
* #SoupURI's <literal>scheme</literal> field using
|
|
Packit Service |
ca3877 |
* <literal>==</literal>.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.30
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* SOUP_URI_SCHEME_DATA:
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* "data" as an interned string; you can compare this directly to a
|
|
Packit Service |
ca3877 |
* #SoupURI's <literal>scheme</literal> field using
|
|
Packit Service |
ca3877 |
* <literal>==</literal>.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.30
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* SOUP_URI_SCHEME_RESOURCE:
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* "data" as an interned string; you can compare this directly to a
|
|
Packit Service |
ca3877 |
* #SoupURI's <literal>scheme</literal> field using
|
|
Packit Service |
ca3877 |
* <literal>==</literal>.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.42
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* SOUP_URI_SCHEME_WS:
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* "ws" (WebSocket) as an interned string; you can compare this
|
|
Packit Service |
ca3877 |
* directly to a #SoupURI's <literal>scheme</literal> field using
|
|
Packit Service |
ca3877 |
* <literal>==</literal>.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.50
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* SOUP_URI_SCHEME_WSS:
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* "wss" (WebSocket over TLS) as an interned string; you can compare
|
|
Packit Service |
ca3877 |
* this directly to a #SoupURI's <literal>scheme</literal> field using
|
|
Packit Service |
ca3877 |
* <literal>==</literal>.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.50
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void append_uri_encoded (GString *str, const char *in, const char *extra_enc_chars);
|
|
Packit Service |
ca3877 |
static char *uri_normalized_copy (const char *str, int length, const char *unescape_extra);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
gpointer _SOUP_URI_SCHEME_HTTP, _SOUP_URI_SCHEME_HTTPS;
|
|
Packit Service |
ca3877 |
gpointer _SOUP_URI_SCHEME_WS, _SOUP_URI_SCHEME_WSS;
|
|
Packit Service |
ca3877 |
gpointer _SOUP_URI_SCHEME_FTP;
|
|
Packit Service |
ca3877 |
gpointer _SOUP_URI_SCHEME_FILE, _SOUP_URI_SCHEME_DATA, _SOUP_URI_SCHEME_RESOURCE;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static inline const char *
|
|
Packit Service |
ca3877 |
soup_uri_parse_scheme (const char *scheme, int len)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
if (len == 4 && !g_ascii_strncasecmp (scheme, "http", len)) {
|
|
Packit Service |
ca3877 |
return SOUP_URI_SCHEME_HTTP;
|
|
Packit Service |
ca3877 |
} else if (len == 5 && !g_ascii_strncasecmp (scheme, "https", len)) {
|
|
Packit Service |
ca3877 |
return SOUP_URI_SCHEME_HTTPS;
|
|
Packit Service |
ca3877 |
} else if (len == 8 && !g_ascii_strncasecmp (scheme, "resource", len)) {
|
|
Packit Service |
ca3877 |
return SOUP_URI_SCHEME_RESOURCE;
|
|
Packit Service |
ca3877 |
} else if (len == 2 && !g_ascii_strncasecmp (scheme, "ws", len)) {
|
|
Packit Service |
ca3877 |
return SOUP_URI_SCHEME_WS;
|
|
Packit Service |
ca3877 |
} else if (len == 3 && !g_ascii_strncasecmp (scheme, "wss", len)) {
|
|
Packit Service |
ca3877 |
return SOUP_URI_SCHEME_WSS;
|
|
Packit Service |
ca3877 |
} else {
|
|
Packit Service |
ca3877 |
char *lower_scheme;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
lower_scheme = g_ascii_strdown (scheme, len);
|
|
Packit Service |
ca3877 |
scheme = g_intern_static_string (lower_scheme);
|
|
Packit Service |
ca3877 |
if (scheme != (const char *)lower_scheme)
|
|
Packit Service |
ca3877 |
g_free (lower_scheme);
|
|
Packit Service |
ca3877 |
return scheme;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static inline guint
|
|
Packit Service |
ca3877 |
soup_scheme_default_port (const char *scheme)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
if (scheme == SOUP_URI_SCHEME_HTTP || scheme == SOUP_URI_SCHEME_WS)
|
|
Packit Service |
ca3877 |
return 80;
|
|
Packit Service |
ca3877 |
else if (scheme == SOUP_URI_SCHEME_HTTPS || scheme == SOUP_URI_SCHEME_WSS)
|
|
Packit Service |
ca3877 |
return 443;
|
|
Packit Service |
ca3877 |
else if (scheme == SOUP_URI_SCHEME_FTP)
|
|
Packit Service |
ca3877 |
return 21;
|
|
Packit Service |
ca3877 |
else
|
|
Packit Service |
ca3877 |
return 0;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_new_with_base:
|
|
Packit Service |
ca3877 |
* @base: a base URI
|
|
Packit Service |
ca3877 |
* @uri_string: the URI
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Parses @uri_string relative to @base.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: a parsed #SoupURI.
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
SoupURI *
|
|
Packit Service |
ca3877 |
soup_uri_new_with_base (SoupURI *base, const char *uri_string)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupURI *uri, fixed_base;
|
|
Packit Service |
ca3877 |
const char *end, *hash, *colon, *at, *path, *question;
|
|
Packit Service |
ca3877 |
const char *p, *hostend;
|
|
Packit Service |
ca3877 |
gboolean remove_dot_segments = TRUE;
|
|
Packit Service |
ca3877 |
int len;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (uri_string != NULL, NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* Allow a %NULL path in @base, for compatibility */
|
|
Packit Service |
ca3877 |
if (base && base->scheme && !base->path) {
|
|
Packit Service |
ca3877 |
g_warn_if_fail (SOUP_URI_IS_VALID (base));
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
memcpy (&fixed_base, base, sizeof (SoupURI));
|
|
Packit Service |
ca3877 |
fixed_base.path = "";
|
|
Packit Service |
ca3877 |
base = &fixed_base;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (base == NULL || SOUP_URI_IS_VALID (base), NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* First some cleanup steps (which are supposed to all be no-ops,
|
|
Packit Service |
ca3877 |
* but...). Skip initial whitespace, strip out internal tabs and
|
|
Packit Service |
ca3877 |
* line breaks, and ignore trailing whitespace.
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
while (g_ascii_isspace (*uri_string))
|
|
Packit Service |
ca3877 |
uri_string++;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
len = strcspn (uri_string, "\t\n\r");
|
|
Packit Service |
ca3877 |
if (uri_string[len]) {
|
|
Packit Service |
ca3877 |
char *clean = g_malloc (strlen (uri_string) + 1), *d;
|
|
Packit Service |
ca3877 |
const char *s;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
for (s = uri_string, d = clean; *s; s++) {
|
|
Packit Service |
ca3877 |
if (*s != '\t' && *s != '\n' && *s != '\r')
|
|
Packit Service |
ca3877 |
*d++ = *s;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
*d = '\0';
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
uri = soup_uri_new_with_base (base, clean);
|
|
Packit Service |
ca3877 |
g_free (clean);
|
|
Packit Service |
ca3877 |
return uri;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
end = uri_string + len;
|
|
Packit Service |
ca3877 |
while (end > uri_string && g_ascii_isspace (end[-1]))
|
|
Packit Service |
ca3877 |
end--;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
uri = g_slice_new0 (SoupURI);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* Find fragment. */
|
|
Packit Service |
ca3877 |
hash = strchr (uri_string, '#');
|
|
Packit Service |
ca3877 |
if (hash) {
|
|
Packit Service |
ca3877 |
uri->fragment = uri_normalized_copy (hash + 1, end - hash + 1,
|
|
Packit Service |
ca3877 |
NULL);
|
|
Packit Service |
ca3877 |
end = hash;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* Find scheme */
|
|
Packit Service |
ca3877 |
p = uri_string;
|
|
Packit Service |
ca3877 |
while (p < end && (g_ascii_isalpha (*p) ||
|
|
Packit Service |
ca3877 |
(p > uri_string && (g_ascii_isdigit (*p) ||
|
|
Packit Service |
ca3877 |
*p == '.' ||
|
|
Packit Service |
ca3877 |
*p == '+' ||
|
|
Packit Service |
ca3877 |
*p == '-'))))
|
|
Packit Service |
ca3877 |
p++;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (p > uri_string && *p == ':') {
|
|
Packit Service |
ca3877 |
uri->scheme = soup_uri_parse_scheme (uri_string, p - uri_string);
|
|
Packit Service |
ca3877 |
uri_string = p + 1;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (uri_string == end && !base && !uri->fragment) {
|
|
Packit Service |
ca3877 |
uri->path = g_strdup ("");
|
|
Packit Service |
ca3877 |
return uri;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* Check for authority */
|
|
Packit Service |
ca3877 |
if (strncmp (uri_string, "//", 2) == 0) {
|
|
Packit Service |
ca3877 |
uri_string += 2;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
path = uri_string + strcspn (uri_string, "/?#");
|
|
Packit Service |
ca3877 |
if (path > end)
|
|
Packit Service |
ca3877 |
path = end;
|
|
Packit Service |
ca3877 |
at = strchr (uri_string, '@');
|
|
Packit Service |
ca3877 |
if (at && at < path) {
|
|
Packit Service |
ca3877 |
colon = strchr (uri_string, ':');
|
|
Packit Service |
ca3877 |
if (colon && colon < at) {
|
|
Packit Service |
ca3877 |
uri->password = soup_uri_decoded_copy (colon + 1,
|
|
Packit Service |
ca3877 |
at - colon - 1, NULL);
|
|
Packit Service |
ca3877 |
} else {
|
|
Packit Service |
ca3877 |
uri->password = NULL;
|
|
Packit Service |
ca3877 |
colon = at;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
uri->user = soup_uri_decoded_copy (uri_string,
|
|
Packit Service |
ca3877 |
colon - uri_string, NULL);
|
|
Packit Service |
ca3877 |
uri_string = at + 1;
|
|
Packit Service |
ca3877 |
} else
|
|
Packit Service |
ca3877 |
uri->user = uri->password = NULL;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* Find host and port. */
|
|
Packit Service |
ca3877 |
if (*uri_string == '[') {
|
|
Packit Service |
ca3877 |
const char *pct;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
uri_string++;
|
|
Packit Service |
ca3877 |
hostend = strchr (uri_string, ']');
|
|
Packit Service |
ca3877 |
if (!hostend || hostend > path) {
|
|
Packit Service |
ca3877 |
soup_uri_free (uri);
|
|
Packit Service |
ca3877 |
return NULL;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
if (*(hostend + 1) == ':')
|
|
Packit Service |
ca3877 |
colon = hostend + 1;
|
|
Packit Service |
ca3877 |
else
|
|
Packit Service |
ca3877 |
colon = NULL;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
pct = memchr (uri_string, '%', hostend - uri_string);
|
|
Packit Service |
ca3877 |
if (!pct || (pct[1] == '2' && pct[2] == '5')) {
|
|
Packit Service |
ca3877 |
uri->host = soup_uri_decoded_copy (uri_string,
|
|
Packit Service |
ca3877 |
hostend - uri_string, NULL);
|
|
Packit Service |
ca3877 |
} else
|
|
Packit Service |
ca3877 |
uri->host = g_strndup (uri_string, hostend - uri_string);
|
|
Packit Service |
ca3877 |
} else {
|
|
Packit Service |
ca3877 |
colon = memchr (uri_string, ':', path - uri_string);
|
|
Packit Service |
ca3877 |
hostend = colon ? colon : path;
|
|
Packit Service |
ca3877 |
uri->host = soup_uri_decoded_copy (uri_string,
|
|
Packit Service |
ca3877 |
hostend - uri_string, NULL);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (colon && colon != path - 1) {
|
|
Packit Service |
ca3877 |
char *portend;
|
|
Packit Service |
ca3877 |
uri->port = strtoul (colon + 1, &portend, 10);
|
|
Packit Service |
ca3877 |
if (portend != (char *)path) {
|
|
Packit Service |
ca3877 |
soup_uri_free (uri);
|
|
Packit Service |
ca3877 |
return NULL;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
uri_string = path;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* Find query */
|
|
Packit Service |
ca3877 |
question = memchr (uri_string, '?', end - uri_string);
|
|
Packit Service |
ca3877 |
if (question) {
|
|
Packit Service |
ca3877 |
uri->query = uri_normalized_copy (question + 1,
|
|
Packit Service |
ca3877 |
end - (question + 1),
|
|
Packit Service |
ca3877 |
NULL);
|
|
Packit Service |
ca3877 |
end = question;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (end != uri_string) {
|
|
Packit Service |
ca3877 |
uri->path = uri_normalized_copy (uri_string, end - uri_string,
|
|
Packit Service |
ca3877 |
NULL);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* Apply base URI. This is spelled out in RFC 3986. */
|
|
Packit Service |
ca3877 |
if (base && !uri->scheme && uri->host)
|
|
Packit Service |
ca3877 |
uri->scheme = base->scheme;
|
|
Packit Service |
ca3877 |
else if (base && !uri->scheme) {
|
|
Packit Service |
ca3877 |
uri->scheme = base->scheme;
|
|
Packit Service |
ca3877 |
uri->user = g_strdup (base->user);
|
|
Packit Service |
ca3877 |
uri->password = g_strdup (base->password);
|
|
Packit Service |
ca3877 |
uri->host = g_strdup (base->host);
|
|
Packit Service |
ca3877 |
uri->port = base->port;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (!uri->path) {
|
|
Packit Service |
ca3877 |
uri->path = g_strdup (base->path);
|
|
Packit Service |
ca3877 |
if (!uri->query)
|
|
Packit Service |
ca3877 |
uri->query = g_strdup (base->query);
|
|
Packit Service |
ca3877 |
remove_dot_segments = FALSE;
|
|
Packit Service |
ca3877 |
} else if (*uri->path != '/') {
|
|
Packit Service |
ca3877 |
char *newpath, *last;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
last = strrchr (base->path, '/');
|
|
Packit Service |
ca3877 |
if (last) {
|
|
Packit Service |
ca3877 |
newpath = g_strdup_printf ("%.*s%s",
|
|
Packit Service |
ca3877 |
(int)(last + 1 - base->path),
|
|
Packit Service |
ca3877 |
base->path,
|
|
Packit Service |
ca3877 |
uri->path);
|
|
Packit Service |
ca3877 |
} else
|
|
Packit Service |
ca3877 |
newpath = g_strdup_printf ("/%s", uri->path);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_free (uri->path);
|
|
Packit Service |
ca3877 |
uri->path = newpath;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (remove_dot_segments && uri->path && *uri->path) {
|
|
Packit Service |
ca3877 |
char *p, *q;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* Remove "./" where "." is a complete segment. */
|
|
Packit Service |
ca3877 |
for (p = uri->path + 1; *p; ) {
|
|
Packit Service |
ca3877 |
if (*(p - 1) == '/' &&
|
|
Packit Service |
ca3877 |
*p == '.' && *(p + 1) == '/')
|
|
Packit Service |
ca3877 |
memmove (p, p + 2, strlen (p + 2) + 1);
|
|
Packit Service |
ca3877 |
else
|
|
Packit Service |
ca3877 |
p++;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
/* Remove "." at end. */
|
|
Packit Service |
ca3877 |
if (p > uri->path + 2 &&
|
|
Packit Service |
ca3877 |
*(p - 1) == '.' && *(p - 2) == '/')
|
|
Packit Service |
ca3877 |
*(p - 1) = '\0';
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* Remove "<segment>/../" where <segment> != ".." */
|
|
Packit Service |
ca3877 |
for (p = uri->path + 1; *p; ) {
|
|
Packit Service |
ca3877 |
if (!strncmp (p, "../", 3)) {
|
|
Packit Service |
ca3877 |
p += 3;
|
|
Packit Service |
ca3877 |
continue;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
q = strchr (p + 1, '/');
|
|
Packit Service |
ca3877 |
if (!q)
|
|
Packit Service |
ca3877 |
break;
|
|
Packit Service |
ca3877 |
if (strncmp (q, "/../", 4) != 0) {
|
|
Packit Service |
ca3877 |
p = q + 1;
|
|
Packit Service |
ca3877 |
continue;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
memmove (p, q + 4, strlen (q + 4) + 1);
|
|
Packit Service |
ca3877 |
p = uri->path + 1;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
/* Remove "<segment>/.." at end where <segment> != ".." */
|
|
Packit Service |
ca3877 |
q = strrchr (uri->path, '/');
|
|
Packit Service |
ca3877 |
if (q && q != uri->path && !strcmp (q, "/..")) {
|
|
Packit Service |
ca3877 |
p = q - 1;
|
|
Packit Service |
ca3877 |
while (p > uri->path && *p != '/')
|
|
Packit Service |
ca3877 |
p--;
|
|
Packit Service |
ca3877 |
if (strncmp (p, "/../", 4) != 0)
|
|
Packit Service |
ca3877 |
*(p + 1) = 0;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* Remove extraneous initial "/.."s */
|
|
Packit Service |
ca3877 |
while (!strncmp (uri->path, "/../", 4))
|
|
Packit Service |
ca3877 |
memmove (uri->path, uri->path + 3, strlen (uri->path) - 2);
|
|
Packit Service |
ca3877 |
if (!strcmp (uri->path, "/.."))
|
|
Packit Service |
ca3877 |
uri->path[1] = '\0';
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* HTTP-specific stuff */
|
|
Packit Service |
ca3877 |
if (uri->scheme == SOUP_URI_SCHEME_HTTP ||
|
|
Packit Service |
ca3877 |
uri->scheme == SOUP_URI_SCHEME_HTTPS) {
|
|
Packit Service |
ca3877 |
if (!uri->path)
|
|
Packit Service |
ca3877 |
uri->path = g_strdup ("/");
|
|
Packit Service |
ca3877 |
if (!SOUP_URI_VALID_FOR_HTTP (uri)) {
|
|
Packit Service |
ca3877 |
soup_uri_free (uri);
|
|
Packit Service |
ca3877 |
return NULL;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (uri->scheme == SOUP_URI_SCHEME_FTP) {
|
|
Packit Service |
ca3877 |
if (!uri->host) {
|
|
Packit Service |
ca3877 |
soup_uri_free (uri);
|
|
Packit Service |
ca3877 |
return NULL;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (!uri->port)
|
|
Packit Service |
ca3877 |
uri->port = soup_scheme_default_port (uri->scheme);
|
|
Packit Service |
ca3877 |
if (!uri->path)
|
|
Packit Service |
ca3877 |
uri->path = g_strdup ("");
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return uri;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_new:
|
|
Packit Service |
ca3877 |
* @uri_string: (allow-none): a URI
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Parses an absolute URI.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* You can also pass %NULL for @uri_string if you want to get back an
|
|
Packit Service |
ca3877 |
* "empty" #SoupURI that you can fill in by hand. (You will need to
|
|
Packit Service |
ca3877 |
* call at least soup_uri_set_scheme() and soup_uri_set_path(), since
|
|
Packit Service |
ca3877 |
* those fields are required.)
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: (nullable): a #SoupURI, or %NULL if the given string
|
|
Packit Service |
ca3877 |
* was found to be invalid.
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
SoupURI *
|
|
Packit Service |
ca3877 |
soup_uri_new (const char *uri_string)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupURI *uri;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (!uri_string)
|
|
Packit Service |
ca3877 |
return g_slice_new0 (SoupURI);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
uri = soup_uri_new_with_base (NULL, uri_string);
|
|
Packit Service |
ca3877 |
if (!uri)
|
|
Packit Service |
ca3877 |
return NULL;
|
|
Packit Service |
ca3877 |
if (!SOUP_URI_IS_VALID (uri)) {
|
|
Packit Service |
ca3877 |
soup_uri_free (uri);
|
|
Packit Service |
ca3877 |
return NULL;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return uri;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
char *
|
|
Packit Service |
ca3877 |
soup_uri_to_string_internal (SoupURI *uri, gboolean just_path_and_query,
|
|
Packit Service |
ca3877 |
gboolean include_password, gboolean force_port)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
GString *str;
|
|
Packit Service |
ca3877 |
char *return_result;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
ca3877 |
g_warn_if_fail (SOUP_URI_IS_VALID (uri));
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
str = g_string_sized_new (40);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (uri->scheme && !just_path_and_query)
|
|
Packit Service |
ca3877 |
g_string_append_printf (str, "%s:", uri->scheme);
|
|
Packit Service |
ca3877 |
if (uri->host && !just_path_and_query) {
|
|
Packit Service |
ca3877 |
g_string_append (str, "//");
|
|
Packit Service |
ca3877 |
if (uri->user) {
|
|
Packit Service |
ca3877 |
append_uri_encoded (str, uri->user, ":;@?/");
|
|
Packit Service |
ca3877 |
if (uri->password && include_password) {
|
|
Packit Service |
ca3877 |
g_string_append_c (str, ':');
|
|
Packit Service |
ca3877 |
append_uri_encoded (str, uri->password, ";@?/");
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
g_string_append_c (str, '@');
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
if (strchr (uri->host, ':')) {
|
|
Packit Service |
ca3877 |
const char *pct;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_string_append_c (str, '[');
|
|
Packit Service |
ca3877 |
pct = strchr (uri->host, '%');
|
|
Packit Service |
ca3877 |
if (pct) {
|
|
Packit Service |
ca3877 |
g_string_append_printf (str, "%.*s%%25%s",
|
|
Packit Service |
ca3877 |
(int) (pct - uri->host),
|
|
Packit Service |
ca3877 |
uri->host, pct + 1);
|
|
Packit Service |
ca3877 |
} else
|
|
Packit Service |
ca3877 |
g_string_append (str, uri->host);
|
|
Packit Service |
ca3877 |
g_string_append_c (str, ']');
|
|
Packit Service |
ca3877 |
} else
|
|
Packit Service |
ca3877 |
append_uri_encoded (str, uri->host, ":/");
|
|
Packit Service |
ca3877 |
if (uri->port && (force_port || uri->port != soup_scheme_default_port (uri->scheme)))
|
|
Packit Service |
ca3877 |
g_string_append_printf (str, ":%u", uri->port);
|
|
Packit Service |
ca3877 |
if (!uri->path && (uri->query || uri->fragment))
|
|
Packit Service |
ca3877 |
g_string_append_c (str, '/');
|
|
Packit Service |
ca3877 |
else if ((!uri->path || !*uri->path) &&
|
|
Packit Service |
ca3877 |
(uri->scheme == SOUP_URI_SCHEME_HTTP ||
|
|
Packit Service |
ca3877 |
uri->scheme == SOUP_URI_SCHEME_HTTPS))
|
|
Packit Service |
ca3877 |
g_string_append_c (str, '/');
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (uri->path && *uri->path)
|
|
Packit Service |
ca3877 |
g_string_append (str, uri->path);
|
|
Packit Service |
ca3877 |
else if (just_path_and_query)
|
|
Packit Service |
ca3877 |
g_string_append_c (str, '/');
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (uri->query) {
|
|
Packit Service |
ca3877 |
g_string_append_c (str, '?');
|
|
Packit Service |
ca3877 |
g_string_append (str, uri->query);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
if (uri->fragment && !just_path_and_query) {
|
|
Packit Service |
ca3877 |
g_string_append_c (str, '#');
|
|
Packit Service |
ca3877 |
g_string_append (str, uri->fragment);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return_result = str->str;
|
|
Packit Service |
ca3877 |
g_string_free (str, FALSE);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return return_result;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_to_string:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
* @just_path_and_query: if %TRUE, output just the path and query portions
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Returns a string representing @uri.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* If @just_path_and_query is %TRUE, this concatenates the path and query
|
|
Packit Service |
ca3877 |
* together. That is, it constructs the string that would be needed in
|
|
Packit Service |
ca3877 |
* the Request-Line of an HTTP request for @uri.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Note that the output will never contain a password, even if @uri
|
|
Packit Service |
ca3877 |
* does.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: a string representing @uri, which the caller must free.
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
char *
|
|
Packit Service |
ca3877 |
soup_uri_to_string (SoupURI *uri, gboolean just_path_and_query)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
return soup_uri_to_string_internal (uri, just_path_and_query, FALSE, FALSE);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_copy:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Copies @uri
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: a copy of @uri, which must be freed with soup_uri_free()
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
SoupURI *
|
|
Packit Service |
ca3877 |
soup_uri_copy (SoupURI *uri)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupURI *dup;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
ca3877 |
g_warn_if_fail (SOUP_URI_IS_VALID (uri));
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
dup = g_slice_new0 (SoupURI);
|
|
Packit Service |
ca3877 |
dup->scheme = uri->scheme;
|
|
Packit Service |
ca3877 |
dup->user = g_strdup (uri->user);
|
|
Packit Service |
ca3877 |
dup->password = g_strdup (uri->password);
|
|
Packit Service |
ca3877 |
dup->host = g_strdup (uri->host);
|
|
Packit Service |
ca3877 |
dup->port = uri->port;
|
|
Packit Service |
ca3877 |
dup->path = g_strdup (uri->path);
|
|
Packit Service |
ca3877 |
dup->query = g_strdup (uri->query);
|
|
Packit Service |
ca3877 |
dup->fragment = g_strdup (uri->fragment);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return dup;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static inline gboolean
|
|
Packit Service |
ca3877 |
parts_equal (const char *one, const char *two, gboolean insensitive)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
if (!one && !two)
|
|
Packit Service |
ca3877 |
return TRUE;
|
|
Packit Service |
ca3877 |
if (!one || !two)
|
|
Packit Service |
ca3877 |
return FALSE;
|
|
Packit Service |
ca3877 |
return insensitive ? !g_ascii_strcasecmp (one, two) : !strcmp (one, two);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_equal:
|
|
Packit Service |
ca3877 |
* @uri1: a #SoupURI
|
|
Packit Service |
ca3877 |
* @uri2: another #SoupURI
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Tests whether or not @uri1 and @uri2 are equal in all parts
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: %TRUE or %FALSE
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
gboolean
|
|
Packit Service |
ca3877 |
soup_uri_equal (SoupURI *uri1, SoupURI *uri2)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (uri1 != NULL, FALSE);
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (uri2 != NULL, FALSE);
|
|
Packit Service |
ca3877 |
g_warn_if_fail (SOUP_URI_IS_VALID (uri1));
|
|
Packit Service |
ca3877 |
g_warn_if_fail (SOUP_URI_IS_VALID (uri2));
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (uri1->scheme != uri2->scheme ||
|
|
Packit Service |
ca3877 |
uri1->port != uri2->port ||
|
|
Packit Service |
ca3877 |
!parts_equal (uri1->user, uri2->user, FALSE) ||
|
|
Packit Service |
ca3877 |
!parts_equal (uri1->password, uri2->password, FALSE) ||
|
|
Packit Service |
ca3877 |
!parts_equal (uri1->host, uri2->host, TRUE) ||
|
|
Packit Service |
ca3877 |
!parts_equal (uri1->path, uri2->path, FALSE) ||
|
|
Packit Service |
ca3877 |
!parts_equal (uri1->query, uri2->query, FALSE) ||
|
|
Packit Service |
ca3877 |
!parts_equal (uri1->fragment, uri2->fragment, FALSE))
|
|
Packit Service |
ca3877 |
return FALSE;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return TRUE;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_free:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Frees @uri.
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_uri_free (SoupURI *uri)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_if_fail (uri != NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_free (uri->user);
|
|
Packit Service |
ca3877 |
g_free (uri->password);
|
|
Packit Service |
ca3877 |
g_free (uri->host);
|
|
Packit Service |
ca3877 |
g_free (uri->path);
|
|
Packit Service |
ca3877 |
g_free (uri->query);
|
|
Packit Service |
ca3877 |
g_free (uri->fragment);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_slice_free (SoupURI, uri);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
append_uri_encoded (GString *str, const char *in, const char *extra_enc_chars)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
const unsigned char *s = (const unsigned char *)in;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
while (*s) {
|
|
Packit Service |
ca3877 |
if (soup_char_is_uri_percent_encoded (*s) ||
|
|
Packit Service |
ca3877 |
soup_char_is_uri_gen_delims (*s) ||
|
|
Packit Service |
ca3877 |
(extra_enc_chars && strchr (extra_enc_chars, *s)))
|
|
Packit Service |
ca3877 |
g_string_append_printf (str, "%%%02X", (int)*s++);
|
|
Packit Service |
ca3877 |
else
|
|
Packit Service |
ca3877 |
g_string_append_c (str, *s++);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_encode:
|
|
Packit Service |
ca3877 |
* @part: a URI part
|
|
Packit Service |
ca3877 |
* @escape_extra: (allow-none): additional reserved characters to
|
|
Packit Service |
ca3877 |
* escape (or %NULL)
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* This %-encodes the given URI part and returns the escaped
|
|
Packit Service |
ca3877 |
* version in allocated memory, which the caller must free when it is
|
|
Packit Service |
ca3877 |
* done.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: the encoded URI part
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
char *
|
|
Packit Service |
ca3877 |
soup_uri_encode (const char *part, const char *escape_extra)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
GString *str;
|
|
Packit Service |
ca3877 |
char *encoded;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (part != NULL, NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
str = g_string_new (NULL);
|
|
Packit Service |
ca3877 |
append_uri_encoded (str, part, escape_extra);
|
|
Packit Service |
ca3877 |
encoded = str->str;
|
|
Packit Service |
ca3877 |
g_string_free (str, FALSE);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return encoded;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
#define XDIGIT(c) ((c) <= '9' ? (c) - '0' : ((c) & 0x4F) - 'A' + 10)
|
|
Packit Service |
ca3877 |
#define HEXCHAR(s) ((XDIGIT (s[1]) << 4) + XDIGIT (s[2]))
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
char *
|
|
Packit Service |
ca3877 |
soup_uri_decoded_copy (const char *part, int length, int *decoded_length)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
unsigned char *s, *d;
|
|
Packit Service |
ca3877 |
char *decoded;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (part != NULL, NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
decoded = g_strndup (part, length);
|
|
Packit Service |
ca3877 |
s = d = (unsigned char *)decoded;
|
|
Packit Service |
ca3877 |
do {
|
|
Packit Service |
ca3877 |
if (*s == '%') {
|
|
Packit Service |
ca3877 |
if (!g_ascii_isxdigit (s[1]) ||
|
|
Packit Service |
ca3877 |
!g_ascii_isxdigit (s[2])) {
|
|
Packit Service |
ca3877 |
*d++ = *s;
|
|
Packit Service |
ca3877 |
continue;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
*d++ = HEXCHAR (s);
|
|
Packit Service |
ca3877 |
s += 2;
|
|
Packit Service |
ca3877 |
} else
|
|
Packit Service |
ca3877 |
*d++ = *s;
|
|
Packit Service |
ca3877 |
} while (*s++);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (decoded_length)
|
|
Packit Service |
ca3877 |
*decoded_length = d - (unsigned char *)decoded - 1;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return decoded;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_decode:
|
|
Packit Service |
ca3877 |
* @part: a URI part
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Fully %-decodes @part.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* In the past, this would return %NULL if @part contained invalid
|
|
Packit Service |
ca3877 |
* percent-encoding, but now it just ignores the problem (as
|
|
Packit Service |
ca3877 |
* soup_uri_new() already did).
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: the decoded URI part.
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
char *
|
|
Packit Service |
ca3877 |
soup_uri_decode (const char *part)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (part != NULL, NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return soup_uri_decoded_copy (part, strlen (part), NULL);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static char *
|
|
Packit Service |
ca3877 |
uri_normalized_copy (const char *part, int length,
|
|
Packit Service |
ca3877 |
const char *unescape_extra)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
unsigned char *s, *d, c;
|
|
Packit Service |
ca3877 |
char *normalized = g_strndup (part, length);
|
|
Packit Service |
ca3877 |
gboolean need_fixup = FALSE;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (!unescape_extra)
|
|
Packit Service |
ca3877 |
unescape_extra = "";
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
s = d = (unsigned char *)normalized;
|
|
Packit Service |
ca3877 |
while (*s) {
|
|
Packit Service |
ca3877 |
if (*s == '%') {
|
|
Packit Service |
ca3877 |
if (!g_ascii_isxdigit (s[1]) ||
|
|
Packit Service |
ca3877 |
!g_ascii_isxdigit (s[2])) {
|
|
Packit Service |
ca3877 |
*d++ = *s++;
|
|
Packit Service |
ca3877 |
continue;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
c = HEXCHAR (s);
|
|
Packit Service |
ca3877 |
if (soup_char_is_uri_unreserved (c) ||
|
|
Packit Service |
ca3877 |
(c && strchr (unescape_extra, c))) {
|
|
Packit Service |
ca3877 |
*d++ = c;
|
|
Packit Service |
ca3877 |
s += 3;
|
|
Packit Service |
ca3877 |
} else {
|
|
Packit Service |
ca3877 |
/* We leave it unchanged. We used to uppercase percent-encoded
|
|
Packit Service |
ca3877 |
* triplets but we do not do it any more as RFC3986 Section 6.2.2.1
|
|
Packit Service |
ca3877 |
* says that they only SHOULD be case normalized.
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
*d++ = *s++;
|
|
Packit Service |
ca3877 |
*d++ = *s++;
|
|
Packit Service |
ca3877 |
*d++ = *s++;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
} else {
|
|
Packit Service |
ca3877 |
if (!g_ascii_isgraph (*s) &&
|
|
Packit Service |
ca3877 |
!strchr (unescape_extra, *s))
|
|
Packit Service |
ca3877 |
need_fixup = TRUE;
|
|
Packit Service |
ca3877 |
*d++ = *s++;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
*d = '\0';
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (need_fixup) {
|
|
Packit Service |
ca3877 |
GString *fixed;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
fixed = g_string_new (NULL);
|
|
Packit Service |
ca3877 |
s = (guchar *)normalized;
|
|
Packit Service |
ca3877 |
while (*s) {
|
|
Packit Service |
ca3877 |
if (g_ascii_isgraph (*s) ||
|
|
Packit Service |
ca3877 |
strchr (unescape_extra, *s))
|
|
Packit Service |
ca3877 |
g_string_append_c (fixed, *s);
|
|
Packit Service |
ca3877 |
else
|
|
Packit Service |
ca3877 |
g_string_append_printf (fixed, "%%%02X", (int)*s);
|
|
Packit Service |
ca3877 |
s++;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
g_free (normalized);
|
|
Packit Service |
ca3877 |
normalized = g_string_free (fixed, FALSE);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return normalized;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_normalize:
|
|
Packit Service |
ca3877 |
* @part: a URI part
|
|
Packit Service |
ca3877 |
* @unescape_extra: (allow-none): reserved characters to unescape (or %NULL)
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* %-decodes any "unreserved" characters (or characters in
|
|
Packit Service |
ca3877 |
* @unescape_extra) in @part, and %-encodes any non-ASCII
|
|
Packit Service |
ca3877 |
* characters, spaces, and non-printing characters in @part.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* "Unreserved" characters are those that are not allowed to be used
|
|
Packit Service |
ca3877 |
* for punctuation according to the URI spec. For example, letters are
|
|
Packit Service |
ca3877 |
* unreserved, so soup_uri_normalize() will turn
|
|
Packit Service |
ca3877 |
* <literal>http://example.com/foo/b%61r</literal> into
|
|
Packit Service |
ca3877 |
* <literal>http://example.com/foo/bar</literal>, which is guaranteed
|
|
Packit Service |
ca3877 |
* to mean the same thing. However, "/" is "reserved", so
|
|
Packit Service |
ca3877 |
* <literal>http://example.com/foo%2Fbar</literal> would not
|
|
Packit Service |
ca3877 |
* be changed, because it might mean something different to the
|
|
Packit Service |
ca3877 |
* server.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* In the past, this would return %NULL if @part contained invalid
|
|
Packit Service |
ca3877 |
* percent-encoding, but now it just ignores the problem (as
|
|
Packit Service |
ca3877 |
* soup_uri_new() already did).
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: the normalized URI part
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
char *
|
|
Packit Service |
ca3877 |
soup_uri_normalize (const char *part, const char *unescape_extra)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (part != NULL, NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return uri_normalized_copy (part, strlen (part), unescape_extra);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_uses_default_port:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Tests if @uri uses the default port for its scheme. (Eg, 80 for
|
|
Packit Service |
ca3877 |
* http.) (This only works for http, https and ftp; libsoup does not know
|
|
Packit Service |
ca3877 |
* the default ports of other protocols.)
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: %TRUE or %FALSE
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
gboolean
|
|
Packit Service |
ca3877 |
soup_uri_uses_default_port (SoupURI *uri)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (uri != NULL, FALSE);
|
|
Packit Service |
ca3877 |
g_warn_if_fail (SOUP_URI_IS_VALID (uri));
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return uri->port == soup_scheme_default_port (uri->scheme);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_get_scheme:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Gets @uri's scheme.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: @uri's scheme.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.32
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
const char *
|
|
Packit Service |
ca3877 |
soup_uri_get_scheme (SoupURI *uri)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return uri->scheme;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_set_scheme:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
* @scheme: the URI scheme
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Sets @uri's scheme to @scheme. This will also set @uri's port to
|
|
Packit Service |
ca3877 |
* the default port for @scheme, if known.
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_uri_set_scheme (SoupURI *uri, const char *scheme)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_if_fail (uri != NULL);
|
|
Packit Service |
ca3877 |
g_return_if_fail (scheme != NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
uri->scheme = soup_uri_parse_scheme (scheme, strlen (scheme));
|
|
Packit Service |
ca3877 |
uri->port = soup_scheme_default_port (uri->scheme);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_get_user:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Gets @uri's user.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: @uri's user.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.32
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
const char *
|
|
Packit Service |
ca3877 |
soup_uri_get_user (SoupURI *uri)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return uri->user;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_set_user:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
* @user: (allow-none): the username, or %NULL
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Sets @uri's user to @user.
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_uri_set_user (SoupURI *uri, const char *user)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_if_fail (uri != NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_free (uri->user);
|
|
Packit Service |
ca3877 |
uri->user = g_strdup (user);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_get_password:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Gets @uri's password.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: @uri's password.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.32
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
const char *
|
|
Packit Service |
ca3877 |
soup_uri_get_password (SoupURI *uri)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return uri->password;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_set_password:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
* @password: (allow-none): the password, or %NULL
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Sets @uri's password to @password.
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_uri_set_password (SoupURI *uri, const char *password)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_if_fail (uri != NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_free (uri->password);
|
|
Packit Service |
ca3877 |
uri->password = g_strdup (password);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_get_host:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Gets @uri's host.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: @uri's host.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.32
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
const char *
|
|
Packit Service |
ca3877 |
soup_uri_get_host (SoupURI *uri)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return uri->host;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_set_host:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
* @host: (allow-none): the hostname or IP address, or %NULL
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Sets @uri's host to @host.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* If @host is an IPv6 IP address, it should not include the brackets
|
|
Packit Service |
ca3877 |
* required by the URI syntax; they will be added automatically when
|
|
Packit Service |
ca3877 |
* converting @uri to a string.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* http and https URIs should not have a %NULL @host.
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_uri_set_host (SoupURI *uri, const char *host)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_if_fail (uri != NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_free (uri->host);
|
|
Packit Service |
ca3877 |
uri->host = g_strdup (host);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_get_port:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Gets @uri's port.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: @uri's port.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.32
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
guint
|
|
Packit Service |
ca3877 |
soup_uri_get_port (SoupURI *uri)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (uri != NULL, 0);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return uri->port;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_set_port:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
* @port: the port, or 0
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Sets @uri's port to @port. If @port is 0, @uri will not have an
|
|
Packit Service |
ca3877 |
* explicitly-specified port.
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_uri_set_port (SoupURI *uri, guint port)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_if_fail (uri != NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
uri->port = port;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_get_path:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Gets @uri's path.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: @uri's path.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.32
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
const char *
|
|
Packit Service |
ca3877 |
soup_uri_get_path (SoupURI *uri)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return uri->path;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_set_path:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
* @path: the non-%NULL path
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Sets @uri's path to @path.
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_uri_set_path (SoupURI *uri, const char *path)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_if_fail (uri != NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* We allow a NULL path for compatibility, but warn about it. */
|
|
Packit Service |
ca3877 |
if (!path) {
|
|
Packit Service |
ca3877 |
g_warn_if_fail (path != NULL);
|
|
Packit Service |
ca3877 |
path = "";
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_free (uri->path);
|
|
Packit Service |
ca3877 |
uri->path = g_strdup (path);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_get_query:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Gets @uri's query.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: @uri's query.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.32
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
const char *
|
|
Packit Service |
ca3877 |
soup_uri_get_query (SoupURI *uri)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return uri->query;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_set_query:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
* @query: (allow-none): the query
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Sets @uri's query to @query.
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_uri_set_query (SoupURI *uri, const char *query)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_if_fail (uri != NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_free (uri->query);
|
|
Packit Service |
ca3877 |
uri->query = g_strdup (query);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_set_query_from_form:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
* @form: (element-type utf8 utf8): a #GHashTable containing HTML form
|
|
Packit Service |
ca3877 |
* information
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Sets @uri's query to the result of encoding @form according to the
|
|
Packit Service |
ca3877 |
* HTML form rules. See soup_form_encode_hash() for more information.
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_uri_set_query_from_form (SoupURI *uri, GHashTable *form)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_if_fail (uri != NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_free (uri->query);
|
|
Packit Service |
ca3877 |
uri->query = soup_form_encode_hash (form);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_set_query_from_fields:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
* @first_field: name of the first form field to encode into query
|
|
Packit Service |
ca3877 |
* @...: value of @first_field, followed by additional field names
|
|
Packit Service |
ca3877 |
* and values, terminated by %NULL.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Sets @uri's query to the result of encoding the given form fields
|
|
Packit Service |
ca3877 |
* and values according to the * HTML form rules. See
|
|
Packit Service |
ca3877 |
* soup_form_encode() for more information.
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_uri_set_query_from_fields (SoupURI *uri,
|
|
Packit Service |
ca3877 |
const char *first_field,
|
|
Packit Service |
ca3877 |
...)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
va_list args;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_return_if_fail (uri != NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_free (uri->query);
|
|
Packit Service |
ca3877 |
va_start (args, first_field);
|
|
Packit Service |
ca3877 |
uri->query = soup_form_encode_valist (first_field, args);
|
|
Packit Service |
ca3877 |
va_end (args);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_get_fragment:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Gets @uri's fragment.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: @uri's fragment.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.32
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
const char *
|
|
Packit Service |
ca3877 |
soup_uri_get_fragment (SoupURI *uri)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return uri->fragment;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_set_fragment:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
* @fragment: (allow-none): the fragment
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Sets @uri's fragment to @fragment.
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_uri_set_fragment (SoupURI *uri, const char *fragment)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_if_fail (uri != NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_free (uri->fragment);
|
|
Packit Service |
ca3877 |
uri->fragment = g_strdup (fragment);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_copy_host:
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Makes a copy of @uri, considering only the protocol, host, and port
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: the new #SoupURI
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.28
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
SoupURI *
|
|
Packit Service |
ca3877 |
soup_uri_copy_host (SoupURI *uri)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupURI *dup;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
ca3877 |
g_warn_if_fail (SOUP_URI_IS_VALID (uri));
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
dup = soup_uri_new (NULL);
|
|
Packit Service |
ca3877 |
dup->scheme = uri->scheme;
|
|
Packit Service |
ca3877 |
dup->host = g_strdup (uri->host);
|
|
Packit Service |
ca3877 |
dup->port = uri->port;
|
|
Packit Service |
ca3877 |
dup->path = g_strdup ("");
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return dup;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_host_hash:
|
|
Packit Service |
ca3877 |
* @key: (type Soup.URI): a #SoupURI with a non-%NULL @host member
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Hashes @key, considering only the scheme, host, and port.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: a hash
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.28
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
guint
|
|
Packit Service |
ca3877 |
soup_uri_host_hash (gconstpointer key)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
const SoupURI *uri = key;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (uri != NULL && uri->host != NULL, 0);
|
|
Packit Service |
ca3877 |
g_warn_if_fail (SOUP_URI_IS_VALID (uri));
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return GPOINTER_TO_UINT (uri->scheme) + uri->port +
|
|
Packit Service |
ca3877 |
soup_str_case_hash (uri->host);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_uri_host_equal:
|
|
Packit Service |
ca3877 |
* @v1: (type Soup.URI): a #SoupURI with a non-%NULL @host member
|
|
Packit Service |
ca3877 |
* @v2: (type Soup.URI): a #SoupURI with a non-%NULL @host member
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Compares @v1 and @v2, considering only the scheme, host, and port.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: whether or not the URIs are equal in scheme, host,
|
|
Packit Service |
ca3877 |
* and port.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.28
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
gboolean
|
|
Packit Service |
ca3877 |
soup_uri_host_equal (gconstpointer v1, gconstpointer v2)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
const SoupURI *one = v1;
|
|
Packit Service |
ca3877 |
const SoupURI *two = v2;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (one != NULL && two != NULL, one == two);
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (one->host != NULL && two->host != NULL, one->host == two->host);
|
|
Packit Service |
ca3877 |
g_warn_if_fail (SOUP_URI_IS_VALID (one));
|
|
Packit Service |
ca3877 |
g_warn_if_fail (SOUP_URI_IS_VALID (two));
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (one->scheme != two->scheme)
|
|
Packit Service |
ca3877 |
return FALSE;
|
|
Packit Service |
ca3877 |
if (one->port != two->port)
|
|
Packit Service |
ca3877 |
return FALSE;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return g_ascii_strcasecmp (one->host, two->host) == 0;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
gboolean
|
|
Packit Service |
ca3877 |
soup_uri_is_http (SoupURI *uri, char **aliases)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
int i;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (uri->scheme == SOUP_URI_SCHEME_HTTP ||
|
|
Packit Service |
ca3877 |
uri->scheme == SOUP_URI_SCHEME_WS)
|
|
Packit Service |
ca3877 |
return TRUE;
|
|
Packit Service |
ca3877 |
else if (uri->scheme == SOUP_URI_SCHEME_HTTPS ||
|
|
Packit Service |
ca3877 |
uri->scheme == SOUP_URI_SCHEME_WSS)
|
|
Packit Service |
ca3877 |
return FALSE;
|
|
Packit Service |
ca3877 |
else if (!aliases)
|
|
Packit Service |
ca3877 |
return FALSE;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
for (i = 0; aliases[i]; i++) {
|
|
Packit Service |
ca3877 |
if (uri->scheme == aliases[i])
|
|
Packit Service |
ca3877 |
return TRUE;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (aliases[0] && !aliases[1] && !strcmp (aliases[0], "*"))
|
|
Packit Service |
ca3877 |
return TRUE;
|
|
Packit Service |
ca3877 |
else
|
|
Packit Service |
ca3877 |
return FALSE;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
gboolean
|
|
Packit Service |
ca3877 |
soup_uri_is_https (SoupURI *uri, char **aliases)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
int i;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (uri->scheme == SOUP_URI_SCHEME_HTTPS ||
|
|
Packit Service |
ca3877 |
uri->scheme == SOUP_URI_SCHEME_WSS)
|
|
Packit Service |
ca3877 |
return TRUE;
|
|
Packit Service |
ca3877 |
else if (uri->scheme == SOUP_URI_SCHEME_HTTP ||
|
|
Packit Service |
ca3877 |
uri->scheme == SOUP_URI_SCHEME_WS)
|
|
Packit Service |
ca3877 |
return FALSE;
|
|
Packit Service |
ca3877 |
else if (!aliases)
|
|
Packit Service |
ca3877 |
return FALSE;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
for (i = 0; aliases[i]; i++) {
|
|
Packit Service |
ca3877 |
if (uri->scheme == aliases[i])
|
|
Packit Service |
ca3877 |
return TRUE;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return FALSE;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
G_DEFINE_BOXED_TYPE (SoupURI, soup_uri, soup_uri_copy, soup_uri_free)
|