/* If IPv6 or IPvFuture */
if (*p == '[')
{
+ start++;
+ p++;
while (1)
{
c = *p++;
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
GSocketAddressEnumerator *proxy_enum;
gchar *uri;
- uri = g_strdup_printf ("%s://%s:%u",
- self->priv->scheme ? self->priv->scheme : "none",
- self->priv->hostname, self->priv->port);
+ uri = _g_uri_from_authority (self->priv->scheme ? self->priv->scheme : "none",
+ self->priv->hostname,
+ self->priv->port,
+ NULL);
proxy_enum = g_object_new (G_TYPE_PROXY_ADDRESS_ENUMERATOR,
"connectable", connectable,
#include "ginetsocketaddress.h"
#include "gioerror.h"
#include "gnetworkaddress.h"
+#include "gnetworkingprivate.h"
#include "gresolver.h"
#include "gsimpleasyncresult.h"
#include "gsocketaddressenumerator.h"
continue;
}
- uri = g_strdup_printf ("%s://%s:%u",
- g_network_service_get_scheme (srv_enum->srv),
- hostname,
- g_srv_target_get_port (target));
+ uri = _g_uri_from_authority (g_network_service_get_scheme (srv_enum->srv),
+ hostname,
+ g_srv_target_get_port (target),
+ NULL);
g_free (hostname);
addr = g_network_address_parse_uri (uri,
g_object_get (connectable, "address", &addr, "port", &port, NULL);
ip = g_inet_address_to_string (addr);
- uri = g_strdup_printf ("none://%s:%u", ip, port);
+ uri = _g_uri_from_authority ("none", ip, port, NULL);
addr_enum = g_object_new (G_TYPE_PROXY_ADDRESS_ENUMERATOR,
"connectable", connectable,