Blame libsoup/soup-misc.c

Packit Service ca3877
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
Packit Service ca3877
/*
Packit Service ca3877
 * soup-misc.c: Miscellaneous functions
Packit Service ca3877
Packit Service ca3877
 * Copyright (C) 2000-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
Packit Service ca3877
#include "soup-misc.h"
Packit Service ca3877
#include "soup-misc-private.h"
Packit Service ca3877
Packit Service ca3877
/**
Packit Service ca3877
 * SECTION:soup-misc
Packit Service ca3877
 * @short_description: Miscellaneous functions
Packit Service ca3877
 *
Packit Service ca3877
 **/
Packit Service ca3877
Packit Service ca3877
const gboolean soup_ssl_supported = TRUE;
Packit Service ca3877
Packit Service ca3877
/**
Packit Service ca3877
 * soup_str_case_hash:
Packit Service ca3877
 * @key: ASCII string to hash
Packit Service ca3877
 *
Packit Service ca3877
 * Hashes @key in a case-insensitive manner.
Packit Service ca3877
 *
Packit Service ca3877
 * Return value: the hash code.
Packit Service ca3877
 **/
Packit Service ca3877
guint
Packit Service ca3877
soup_str_case_hash (gconstpointer key)
Packit Service ca3877
{
Packit Service ca3877
	const char *p = key;
Packit Service ca3877
	guint h = g_ascii_toupper(*p);
Packit Service ca3877
Packit Service ca3877
	if (h)
Packit Service ca3877
		for (p += 1; *p != '\0'; p++)
Packit Service ca3877
			h = (h << 5) - h + g_ascii_toupper(*p);
Packit Service ca3877
Packit Service ca3877
	return h;
Packit Service ca3877
}
Packit Service ca3877
Packit Service ca3877
/**
Packit Service ca3877
 * soup_str_case_equal:
Packit Service ca3877
 * @v1: an ASCII string
Packit Service ca3877
 * @v2: another ASCII string
Packit Service ca3877
 *
Packit Service ca3877
 * Compares @v1 and @v2 in a case-insensitive manner
Packit Service ca3877
 *
Packit Service ca3877
 * Return value: %TRUE if they are equal (modulo case)
Packit Service ca3877
 **/
Packit Service ca3877
gboolean
Packit Service ca3877
soup_str_case_equal (gconstpointer v1,
Packit Service ca3877
		     gconstpointer v2)
Packit Service ca3877
{
Packit Service ca3877
	const char *string1 = v1;
Packit Service ca3877
	const char *string2 = v2;
Packit Service ca3877
Packit Service ca3877
	return g_ascii_strcasecmp (string1, string2) == 0;
Packit Service ca3877
}
Packit Service ca3877
Packit Service ca3877
/**
Packit Service ca3877
 * soup_add_io_watch: (skip)
Packit Service ca3877
 * @async_context: (allow-none): the #GMainContext to dispatch the I/O
Packit Service ca3877
 * watch in, or %NULL for the default context
Packit Service ca3877
 * @chan: the #GIOChannel to watch
Packit Service ca3877
 * @condition: the condition to watch for
Packit Service ca3877
 * @function: the callback to invoke when @condition occurs
Packit Service ca3877
 * @data: user data to pass to @function
Packit Service ca3877
 *
Packit Service ca3877
 * Adds an I/O watch as with g_io_add_watch(), but using the given
Packit Service ca3877
 * @async_context.
Packit Service ca3877
 *
Packit Service ca3877
 * Return value: a #GSource, which can be removed from @async_context
Packit Service ca3877
 * with g_source_destroy().
Packit Service ca3877
 **/
Packit Service ca3877
GSource *
Packit Service ca3877
soup_add_io_watch (GMainContext *async_context,
Packit Service ca3877
		   GIOChannel *chan, GIOCondition condition,
Packit Service ca3877
		   GIOFunc function, gpointer data)
Packit Service ca3877
{
Packit Service ca3877
	GSource *watch = g_io_create_watch (chan, condition);
Packit Service ca3877
	g_source_set_callback (watch, (GSourceFunc) function, data, NULL);
Packit Service ca3877
	g_source_attach (watch, async_context);
Packit Service ca3877
	g_source_unref (watch);
Packit Service ca3877
	return watch;
Packit Service ca3877
}
Packit Service ca3877
Packit Service ca3877
/**
Packit Service ca3877
 * soup_add_idle: (skip)
Packit Service ca3877
 * @async_context: (allow-none): the #GMainContext to dispatch the I/O
Packit Service ca3877
 * watch in, or %NULL for the default context
Packit Service ca3877
 * @function: the callback to invoke at idle time
Packit Service ca3877
 * @data: user data to pass to @function
Packit Service ca3877
 *
Packit Service ca3877
 * Adds an idle event as with g_idle_add(), but using the given
Packit Service ca3877
 * @async_context.
Packit Service ca3877
 *
Packit Service ca3877
 * If you want @function to run "right away", use
Packit Service ca3877
 * soup_add_completion(), since that sets a higher priority on the
Packit Service ca3877
 * #GSource than soup_add_idle() does.
Packit Service ca3877
 *
Packit Service ca3877
 * Return value: a #GSource, which can be removed from @async_context
Packit Service ca3877
 * with g_source_destroy().
Packit Service ca3877
 **/
Packit Service ca3877
GSource *
Packit Service ca3877
soup_add_idle (GMainContext *async_context,
Packit Service ca3877
	       GSourceFunc function, gpointer data)
Packit Service ca3877
{
Packit Service ca3877
	GSource *source = g_idle_source_new ();
Packit Service ca3877
	g_source_set_callback (source, function, data, NULL);
Packit Service ca3877
	g_source_attach (source, async_context);
Packit Service ca3877
	g_source_unref (source);
Packit Service ca3877
	return source;
Packit Service ca3877
}
Packit Service ca3877
Packit Service ca3877
GSource *
Packit Service ca3877
soup_add_completion_reffed (GMainContext   *async_context,
Packit Service ca3877
			    GSourceFunc     function,
Packit Service ca3877
			    gpointer        data,
Packit Service ca3877
			    GDestroyNotify  dnotify)
Packit Service ca3877
{
Packit Service ca3877
	GSource *source = g_idle_source_new ();
Packit Service ca3877
Packit Service ca3877
	g_source_set_priority (source, G_PRIORITY_DEFAULT);
Packit Service ca3877
	g_source_set_callback (source, function, data, dnotify);
Packit Service ca3877
	g_source_attach (source, async_context);
Packit Service ca3877
	return source;
Packit Service ca3877
}
Packit Service ca3877
Packit Service ca3877
/**
Packit Service ca3877
 * soup_add_completion: (skip)
Packit Service ca3877
 * @async_context: (allow-none): the #GMainContext to dispatch the I/O
Packit Service ca3877
 * watch in, or %NULL for the default context
Packit Service ca3877
 * @function: the callback to invoke
Packit Service ca3877
 * @data: user data to pass to @function
Packit Service ca3877
 *
Packit Service ca3877
 * Adds @function to be executed from inside @async_context with the
Packit Service ca3877
 * default priority. Use this when you want to complete an action in
Packit Service ca3877
 * @async_context's main loop, as soon as possible.
Packit Service ca3877
 *
Packit Service ca3877
 * Return value: a #GSource, which can be removed from @async_context
Packit Service ca3877
 * with g_source_destroy().
Packit Service ca3877
 *
Packit Service ca3877
 * Since: 2.24
Packit Service ca3877
 **/
Packit Service ca3877
GSource *
Packit Service ca3877
soup_add_completion (GMainContext *async_context,
Packit Service ca3877
	             GSourceFunc function, gpointer data)
Packit Service ca3877
{
Packit Service ca3877
	GSource *source;
Packit Service ca3877
Packit Service ca3877
	source = soup_add_completion_reffed (async_context, function, data, NULL);
Packit Service ca3877
	g_source_unref (source);
Packit Service ca3877
	return source;
Packit Service ca3877
}
Packit Service ca3877
Packit Service ca3877
/**
Packit Service ca3877
 * soup_add_timeout: (skip)
Packit Service ca3877
 * @async_context: (allow-none): the #GMainContext to dispatch the I/O
Packit Service ca3877
 * watch in, or %NULL for the default context
Packit Service ca3877
 * @interval: the timeout interval, in milliseconds
Packit Service ca3877
 * @function: the callback to invoke at timeout time
Packit Service ca3877
 * @data: user data to pass to @function
Packit Service ca3877
 *
Packit Service ca3877
 * Adds a timeout as with g_timeout_add(), but using the given
Packit Service ca3877
 * @async_context.
Packit Service ca3877
 *
Packit Service ca3877
 * Return value: a #GSource, which can be removed from @async_context
Packit Service ca3877
 * with g_source_destroy().
Packit Service ca3877
 **/
Packit Service ca3877
GSource *
Packit Service ca3877
soup_add_timeout (GMainContext *async_context,
Packit Service ca3877
		  guint interval,
Packit Service ca3877
		  GSourceFunc function, gpointer data)
Packit Service ca3877
{
Packit Service ca3877
	GSource *source = g_timeout_source_new (interval);
Packit Service ca3877
	g_source_set_callback (source, function, data, NULL);
Packit Service ca3877
	g_source_attach (source, async_context);
Packit Service ca3877
	g_source_unref (source);
Packit Service ca3877
	return source;
Packit Service ca3877
}
Packit Service ca3877
Packit Service ca3877
/* 00 URI_UNRESERVED
Packit Service ca3877
 * 01 URI_PCT_ENCODED
Packit Service ca3877
 * 02 URI_GEN_DELIMS
Packit Service ca3877
 * 04 URI_SUB_DELIMS
Packit Service ca3877
 * 08 HTTP_SEPARATOR
Packit Service ca3877
 * 10 HTTP_CTL
Packit Service ca3877
 */
Packit Service ca3877
const char soup_char_attributes[] = {
Packit Service ca3877
	/* 0x00 - 0x07 */
Packit Service ca3877
	0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
Packit Service ca3877
	/* 0x08 - 0x0f */
Packit Service ca3877
	0x11, 0x19, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
Packit Service ca3877
	/* 0x10 - 0x17 */
Packit Service ca3877
	0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
Packit Service ca3877
	/* 0x18 - 0x1f */
Packit Service ca3877
	0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
Packit Service ca3877
	/*  !"#$%&' */
Packit Service ca3877
	0x09, 0x04, 0x09, 0x02, 0x04, 0x01, 0x04, 0x04,
Packit Service ca3877
	/* ()*+,-./ */
Packit Service ca3877
	0x0c, 0x0c, 0x04, 0x04, 0x0c, 0x00, 0x00, 0x0a,
Packit Service ca3877
	/* 01234567 */
Packit Service ca3877
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit Service ca3877
	/* 89:;<=>? */
Packit Service ca3877
	0x00, 0x00, 0x0a, 0x0c, 0x09, 0x0a, 0x09, 0x0a,
Packit Service ca3877
	/* @ABCDEFG */
Packit Service ca3877
	0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit Service ca3877
	/* HIJKLMNO */
Packit Service ca3877
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit Service ca3877
	/* PQRSTUVW */
Packit Service ca3877
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit Service ca3877
	/* XYZ[\]^_ */
Packit Service ca3877
	0x00, 0x00, 0x00, 0x0a, 0x09, 0x0a, 0x01, 0x00,
Packit Service ca3877
	/* `abcdefg */
Packit Service ca3877
	0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit Service ca3877
	/* hijklmno */
Packit Service ca3877
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit Service ca3877
	/* pqrstuvw */
Packit Service ca3877
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit Service ca3877
	/* xyz{|}~  */
Packit Service ca3877
	0x00, 0x00, 0x00, 0x09, 0x01, 0x09, 0x00, 0x11,
Packit Service ca3877
	/* 0x80 - 0xFF */
Packit Service ca3877
	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Packit Service ca3877
	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Packit Service ca3877
	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Packit Service ca3877
	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Packit Service ca3877
	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Packit Service ca3877
	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Packit Service ca3877
	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Packit Service ca3877
	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Packit Service ca3877
	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Packit Service ca3877
	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Packit Service ca3877
	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Packit Service ca3877
	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Packit Service ca3877
	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Packit Service ca3877
	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Packit Service ca3877
	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Packit Service ca3877
	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
Packit Service ca3877
};
Packit Service ca3877
Packit Service ca3877
/**
Packit Service ca3877
 * soup_host_matches_host
Packit Service ca3877
 * @host: a URI
Packit Service ca3877
 * @compare_with: a URI
Packit Service ca3877
 *
Packit Service ca3877
 * Checks if the @host and @compare_with exactly match or prefixed with a dot.
Packit Service ca3877
 *
Packit Service ca3877
 * Return value: %TRUE if the hosts match, %FALSE otherwise
Packit Service ca3877
 *
Packit Service ca3877
 * Since: 2.54
Packit Service ca3877
 **/
Packit Service ca3877
gboolean
Packit Service ca3877
soup_host_matches_host (const gchar *host, const gchar *compare_with)
Packit Service ca3877
{
Packit Service ca3877
	char *match;
Packit Service ca3877
	int dlen;
Packit Service ca3877
Packit Service ca3877
	g_return_val_if_fail (host != NULL, FALSE);
Packit Service ca3877
	g_return_val_if_fail (compare_with != NULL, FALSE);
Packit Service ca3877
Packit Service ca3877
	if (!g_ascii_strcasecmp (host, compare_with))
Packit Service ca3877
		return TRUE;
Packit Service ca3877
	if (*host != '.')
Packit Service ca3877
		return FALSE;
Packit Service ca3877
	if (!g_ascii_strcasecmp (host + 1, compare_with))
Packit Service ca3877
		return TRUE;
Packit Service ca3877
	dlen = strlen (host);
Packit Service ca3877
	while ((match = strstr (compare_with, host))) {
Packit Service ca3877
		if (!match[dlen])
Packit Service ca3877
			return TRUE;
Packit Service ca3877
		compare_with = match + 1;
Packit Service ca3877
	}
Packit Service ca3877
	return FALSE;
Packit Service ca3877
}