|
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 |
}
|