summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Winship <danw@gnome.org>2013-12-01 15:17:33 -0500
committerDan Winship <danw@gnome.org>2014-11-22 17:32:28 -0500
commit6ac2781bf997aefdc1c0782c508d79a74e6ec200 (patch)
tree19eab5095fc6d3a002698fbf6a6abbfd94a5fab8
parent7ed12e6d4dc4c037b109ea772ea92d7452fb289a (diff)
downloadglib-6ac2781bf997aefdc1c0782c508d79a74e6ec200.tar.gz
gio: port to use guri functionswip/danw/guri
-rw-r--r--gio/gicon.c6
-rw-r--r--gio/gnetworkaddress.c297
-rw-r--r--gio/gnetworkingprivate.h9
-rw-r--r--gio/gnetworkservice.c11
-rw-r--r--gio/gproxyaddressenumerator.c45
-rw-r--r--gio/gsimpleproxyresolver.c10
-rw-r--r--gio/gsocketaddress.c4
7 files changed, 44 insertions, 338 deletions
diff --git a/gio/gicon.c b/gio/gicon.c
index b5080dae2..cf4dbaf9c 100644
--- a/gio/gicon.c
+++ b/gio/gicon.c
@@ -391,14 +391,14 @@ ensure_builtin_icon_types (void)
static GIcon *
g_icon_new_for_string_simple (const gchar *str)
{
- gchar *scheme;
+ const gchar *scheme;
GIcon *icon;
if (str[0] == '.')
return NULL;
/* handle special GFileIcon and GThemedIcon cases */
- scheme = g_uri_parse_scheme (str);
+ scheme = g_uri_peek_scheme (str);
if (scheme != NULL || str[0] == '/' || str[0] == G_DIR_SEPARATOR)
{
GFile *location;
@@ -409,8 +409,6 @@ g_icon_new_for_string_simple (const gchar *str)
else
icon = g_themed_icon_new (str);
- g_free (scheme);
-
return icon;
}
diff --git a/gio/gnetworkaddress.c b/gio/gnetworkaddress.c
index 5cb4c7438..fc5898d1c 100644
--- a/gio/gnetworkaddress.c
+++ b/gio/gnetworkaddress.c
@@ -441,279 +441,6 @@ g_network_address_parse (const gchar *host_and_port,
return connectable;
}
-/* Allowed characters outside alphanumeric for unreserved. */
-#define G_URI_OTHER_UNRESERVED "-._~"
-
-/* This or something equivalent will eventually go into glib/guri.h */
-gboolean
-_g_uri_parse_authority (const char *uri,
- char **host,
- guint16 *port,
- char **userinfo)
-{
- char *tmp_str;
- const char *start, *p, *at, *delim;
- char c;
-
- g_return_val_if_fail (uri != NULL, FALSE);
-
- if (host)
- *host = NULL;
-
- if (port)
- *port = 0;
-
- if (userinfo)
- *userinfo = NULL;
-
- /* From RFC 3986 Decodes:
- * URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
- * hier-part = "//" authority path-abempty
- * path-abempty = *( "/" segment )
- * authority = [ userinfo "@" ] host [ ":" port ]
- */
-
- /* Check we have a valid scheme */
- tmp_str = g_uri_parse_scheme (uri);
-
- if (tmp_str == NULL)
- return FALSE;
-
- g_free (tmp_str);
-
- /* Decode hier-part:
- * hier-part = "//" authority path-abempty
- */
- p = uri;
- start = strstr (p, "//");
-
- if (start == NULL)
- return FALSE;
-
- start += 2;
-
- /* check if the @ sign is part of the authority before attempting to
- * decode the userinfo */
- delim = strpbrk (start, "/?#[]");
- at = strchr (start, '@');
- if (at && delim && at > delim)
- at = NULL;
-
- if (at != NULL)
- {
- /* Decode userinfo:
- * userinfo = *( unreserved / pct-encoded / sub-delims / ":" )
- * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
- * pct-encoded = "%" HEXDIG HEXDIG
- */
- p = start;
- while (1)
- {
- c = *p++;
-
- if (c == '@')
- break;
-
- /* pct-encoded */
- if (c == '%')
- {
- if (!(g_ascii_isxdigit (p[0]) ||
- g_ascii_isxdigit (p[1])))
- return FALSE;
-
- p++;
-
- continue;
- }
-
- /* unreserved / sub-delims / : */
- if (!(g_ascii_isalnum (c) ||
- strchr (G_URI_OTHER_UNRESERVED, c) ||
- strchr (G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS, c) ||
- c == ':'))
- return FALSE;
- }
-
- if (userinfo)
- *userinfo = g_strndup (start, p - start - 1);
-
- start = p;
- }
- else
- {
- p = start;
- }
-
-
- /* decode host:
- * host = IP-literal / IPv4address / reg-name
- * reg-name = *( unreserved / pct-encoded / sub-delims )
- */
-
- /* If IPv6 or IPvFuture */
- if (*p == '[')
- {
- gboolean has_scope_id = FALSE, has_bad_scope_id = FALSE;
-
- start++;
- p++;
- while (1)
- {
- c = *p++;
-
- if (c == ']')
- break;
-
- if (c == '%' && !has_scope_id)
- {
- has_scope_id = TRUE;
- if (p[0] != '2' || p[1] != '5')
- has_bad_scope_id = TRUE;
- continue;
- }
-
- /* unreserved / sub-delims */
- if (!(g_ascii_isalnum (c) ||
- strchr (G_URI_OTHER_UNRESERVED, c) ||
- strchr (G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS, c) ||
- c == ':' ||
- c == '.'))
- goto error;
- }
-
- if (host)
- {
- if (has_bad_scope_id)
- *host = g_strndup (start, p - start - 1);
- else
- *host = g_uri_unescape_segment (start, p - 1, NULL);
- }
-
- c = *p++;
- }
- else
- {
- while (1)
- {
- c = *p++;
-
- if (c == ':' ||
- c == '/' ||
- c == '?' ||
- c == '#' ||
- c == '\0')
- break;
-
- /* pct-encoded */
- if (c == '%')
- {
- if (!(g_ascii_isxdigit (p[0]) ||
- g_ascii_isxdigit (p[1])))
- goto error;
-
- p++;
-
- continue;
- }
-
- /* unreserved / sub-delims */
- if (!(g_ascii_isalnum (c) ||
- strchr (G_URI_OTHER_UNRESERVED, c) ||
- strchr (G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS, c)))
- goto error;
- }
-
- if (host)
- *host = g_uri_unescape_segment (start, p - 1, NULL);
- }
-
- if (c == ':')
- {
- /* Decode port:
- * port = *DIGIT
- */
- guint tmp = 0;
-
- while (1)
- {
- c = *p++;
-
- if (c == '/' ||
- c == '?' ||
- c == '#' ||
- c == '\0')
- break;
-
- if (!g_ascii_isdigit (c))
- goto error;
-
- tmp = (tmp * 10) + (c - '0');
-
- if (tmp > 65535)
- goto error;
- }
- if (port)
- *port = (guint16) tmp;
- }
-
- return TRUE;
-
-error:
- if (host && *host)
- {
- g_free (*host);
- *host = NULL;
- }
-
- if (userinfo && *userinfo)
- {
- g_free (*userinfo);
- *userinfo = NULL;
- }
-
- return FALSE;
-}
-
-gchar *
-_g_uri_from_authority (const gchar *protocol,
- const gchar *host,
- guint port,
- const gchar *userinfo)
-{
- GString *uri;
-
- uri = g_string_new (protocol);
- g_string_append (uri, "://");
-
- if (userinfo)
- {
- g_string_append_uri_escaped (uri, userinfo, G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO, FALSE);
- g_string_append_c (uri, '@');
- }
-
- if (g_hostname_is_non_ascii (host))
- {
- gchar *ace_encoded = g_hostname_to_ascii (host);
-
- if (!ace_encoded)
- {
- g_string_free (uri, TRUE);
- return NULL;
- }
- g_string_append (uri, ace_encoded);
- g_free (ace_encoded);
- }
- else if (strchr (host, ':'))
- g_string_append_printf (uri, "[%s]", host);
- else
- g_string_append (uri, host);
-
- if (port != 0)
- g_string_append_printf (uri, ":%u", port);
-
- return g_string_free (uri, FALSE);
-}
-
/**
* g_network_address_parse_uri:
* @uri: the hostname and optionally a port
@@ -739,21 +466,21 @@ g_network_address_parse_uri (const gchar *uri,
GSocketConnectable *conn;
gchar *scheme;
gchar *hostname;
- guint16 port;
+ gint port;
- if (!_g_uri_parse_authority (uri, &hostname, &port, NULL))
+ if (!g_uri_split_network (uri, G_URI_PARSE_STRICT,
+ &scheme, &hostname, &port,
+ NULL))
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT,
- "Invalid URI '%s'",
- uri);
+ "Invalid URI '%s'",
+ uri);
return NULL;
}
- if (port == 0)
+ if (port == -1)
port = default_port;
- scheme = g_uri_parse_scheme (uri);
-
conn = g_object_new (G_TYPE_NETWORK_ADDRESS,
"hostname", hostname,
"port", port,
@@ -1058,10 +785,12 @@ g_network_address_connectable_proxy_enumerate (GSocketConnectable *connectable)
GSocketAddressEnumerator *proxy_enum;
gchar *uri;
- uri = _g_uri_from_authority (self->priv->scheme ? self->priv->scheme : "none",
- self->priv->hostname,
- self->priv->port,
- NULL);
+ uri = g_uri_join (0,
+ self->priv->scheme ? self->priv->scheme : "none",
+ NULL,
+ self->priv->hostname,
+ self->priv->port,
+ "", NULL, NULL);
proxy_enum = g_object_new (G_TYPE_PROXY_ADDRESS_ENUMERATOR,
"connectable", connectable,
diff --git a/gio/gnetworkingprivate.h b/gio/gnetworkingprivate.h
index b28ff4417..335dd6cbb 100644
--- a/gio/gnetworkingprivate.h
+++ b/gio/gnetworkingprivate.h
@@ -23,15 +23,6 @@
G_BEGIN_DECLS
-gboolean _g_uri_parse_authority (const char *uri,
- char **host,
- guint16 *port,
- char **userinfo);
-gchar * _g_uri_from_authority (const gchar *protocol,
- const gchar *host,
- guint port,
- const gchar *userinfo);
-
guint64 g_resolver_get_serial (GResolver *resolver);
gint g_socket (gint domain,
diff --git a/gio/gnetworkservice.c b/gio/gnetworkservice.c
index 497d6fd35..30484f2a9 100644
--- a/gio/gnetworkservice.c
+++ b/gio/gnetworkservice.c
@@ -29,7 +29,7 @@
#include "ginetsocketaddress.h"
#include "gioerror.h"
#include "gnetworkaddress.h"
-#include "gnetworkingprivate.h"
+#include "gnetworking.h"
#include "gresolver.h"
#include "gtask.h"
#include "gsocketaddressenumerator.h"
@@ -463,10 +463,11 @@ g_network_service_address_enumerator_next (GSocketAddressEnumerator *enumerator
continue;
}
- uri = _g_uri_from_authority (g_network_service_get_scheme (srv_enum->srv),
- hostname,
- g_srv_target_get_port (target),
- NULL);
+ uri = g_uri_join (0, g_network_service_get_scheme (srv_enum->srv),
+ NULL,
+ hostname,
+ g_srv_target_get_port (target),
+ "", NULL, NULL);
g_free (hostname);
addr = g_network_address_parse_uri (uri,
diff --git a/gio/gproxyaddressenumerator.c b/gio/gproxyaddressenumerator.c
index c34fca971..02e8c3002 100644
--- a/gio/gproxyaddressenumerator.c
+++ b/gio/gproxyaddressenumerator.c
@@ -27,7 +27,6 @@
#include "ginetaddress.h"
#include "glibintl.h"
#include "gnetworkaddress.h"
-#include "gnetworkingprivate.h"
#include "gproxy.h"
#include "gproxyaddress.h"
#include "gproxyresolver.h"
@@ -65,7 +64,7 @@ struct _GProxyAddressEnumeratorPrivate
GSocketAddressEnumerator *addr_enum;
GSocketAddress *proxy_address;
const gchar *proxy_uri;
- gchar *proxy_type;
+ const gchar *proxy_type;
gchar *proxy_username;
gchar *proxy_password;
gboolean supports_hostname;
@@ -79,8 +78,6 @@ static void
save_userinfo (GProxyAddressEnumeratorPrivate *priv,
const gchar *proxy)
{
- gchar *userinfo;
-
if (priv->proxy_username)
{
g_free (priv->proxy_username);
@@ -93,23 +90,14 @@ save_userinfo (GProxyAddressEnumeratorPrivate *priv,
priv->proxy_password = NULL;
}
- if (_g_uri_parse_authority (proxy, NULL, NULL, &userinfo))
- {
- if (userinfo)
- {
- gchar **split = g_strsplit (userinfo, ":", 2);
-
- if (split[0] != NULL)
- {
- priv->proxy_username = g_uri_unescape_string (split[0], NULL);
- if (split[1] != NULL)
- priv->proxy_password = g_uri_unescape_string (split[1], NULL);
- }
-
- g_strfreev (split);
- g_free (userinfo);
- }
- }
+ g_uri_split_with_user (proxy, 0,
+ NULL, /* scheme */
+ &priv->proxy_username,
+ &priv->proxy_password,
+ NULL, /* auth params */
+ NULL, NULL, /* host, port */
+ NULL, NULL, NULL, /* path, query, fragment */
+ NULL);
}
static void
@@ -124,8 +112,7 @@ next_enumerator (GProxyAddressEnumeratorPrivate *priv)
GProxy *proxy;
priv->proxy_uri = *priv->next_proxy++;
- g_free (priv->proxy_type);
- priv->proxy_type = g_uri_parse_scheme (priv->proxy_uri);
+ priv->proxy_type = g_uri_peek_scheme (priv->proxy_uri);
if (priv->proxy_type == NULL)
continue;
@@ -195,7 +182,7 @@ g_proxy_address_enumerator_next (GSocketAddressEnumerator *enumerator,
while (result == NULL && (*priv->next_proxy || priv->addr_enum))
{
gchar *dest_hostname;
- gchar *dest_protocol;
+ const gchar *dest_protocol;
GInetSocketAddress *inetsaddr;
GInetAddress *inetaddr;
guint16 port;
@@ -269,7 +256,7 @@ g_proxy_address_enumerator_next (GSocketAddressEnumerator *enumerator,
{
dest_hostname = g_strdup (priv->dest_hostname);
}
- dest_protocol = g_uri_parse_scheme (priv->dest_uri);
+ dest_protocol = g_uri_peek_scheme (priv->dest_uri);
g_return_val_if_fail (G_IS_INET_SOCKET_ADDRESS (priv->proxy_address),
NULL);
@@ -290,7 +277,6 @@ g_proxy_address_enumerator_next (GSocketAddressEnumerator *enumerator,
"uri", priv->proxy_uri,
NULL);
g_free (dest_hostname);
- g_free (dest_protocol);
if (priv->supports_hostname || priv->next_dest_ip == NULL)
{
@@ -338,7 +324,8 @@ return_result (GTask *task)
}
else
{
- gchar *dest_hostname, *dest_protocol;
+ gchar *dest_hostname;
+ const gchar *dest_protocol;
GInetSocketAddress *inetsaddr;
GInetAddress *inetaddr;
guint16 port;
@@ -359,7 +346,7 @@ return_result (GTask *task)
{
dest_hostname = g_strdup (priv->dest_hostname);
}
- dest_protocol = g_uri_parse_scheme (priv->dest_uri);
+ dest_protocol = g_uri_peek_scheme (priv->dest_uri);
g_return_if_fail (G_IS_INET_SOCKET_ADDRESS (priv->proxy_address));
@@ -379,7 +366,6 @@ return_result (GTask *task)
"uri", priv->proxy_uri,
NULL);
g_free (dest_hostname);
- g_free (dest_protocol);
if (priv->supports_hostname || priv->next_dest_ip == NULL)
{
@@ -683,7 +669,6 @@ g_proxy_address_enumerator_finalize (GObject *object)
if (priv->addr_enum)
g_object_unref (priv->addr_enum);
- g_free (priv->proxy_type);
g_free (priv->proxy_username);
g_free (priv->proxy_password);
diff --git a/gio/gsimpleproxyresolver.c b/gio/gsimpleproxyresolver.c
index 8610e2b4e..345314212 100644
--- a/gio/gsimpleproxyresolver.c
+++ b/gio/gsimpleproxyresolver.c
@@ -25,7 +25,6 @@
#include "gsimpleproxyresolver.h"
#include "ginetaddress.h"
#include "ginetaddressmask.h"
-#include "gnetworkingprivate.h"
#include "gtask.h"
#include "glibintl.h"
@@ -325,10 +324,13 @@ g_simple_proxy_resolver_lookup (GProxyResolver *proxy_resolver,
if (priv->ignore_ips || priv->ignore_domains)
{
gchar *host = NULL;
- gushort port;
+ gint port;
- if (_g_uri_parse_authority (uri, &host, &port, NULL) &&
- ignore_host (resolver, host, port))
+ if (g_uri_split (uri, 0, NULL, NULL,
+ &host, &port,
+ NULL, NULL, NULL,
+ NULL) &&
+ ignore_host (resolver, host, CLAMP (port, 0, 65535)))
proxy = "direct://";
g_free (host);
diff --git a/gio/gsocketaddress.c b/gio/gsocketaddress.c
index 676d94a3f..740fac682 100644
--- a/gio/gsocketaddress.c
+++ b/gio/gsocketaddress.c
@@ -26,7 +26,7 @@
#include "gsocketaddress.h"
#include "ginetaddress.h"
#include "ginetsocketaddress.h"
-#include "gnetworkingprivate.h"
+#include "gnetworking.h"
#include "gproxyaddress.h"
#include "gproxyaddressenumerator.h"
#include "gsocketaddressenumerator.h"
@@ -396,7 +396,7 @@ g_socket_address_connectable_proxy_enumerate (GSocketConnectable *connectable)
g_object_get (connectable, "address", &addr, "port", &port, NULL);
ip = g_inet_address_to_string (addr);
- uri = _g_uri_from_authority ("none", ip, port, NULL);
+ uri = g_uri_join (0, "none", NULL, ip, port, "", NULL, NULL);
addr_enum = g_object_new (G_TYPE_PROXY_ADDRESS_ENUMERATOR,
"connectable", connectable,