|
Packit Service |
ca3877 |
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
#include "test-utils.h"
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
#include <glib/gprintf.h>
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
#include <locale.h>
|
|
Packit Service |
ca3877 |
#include <signal.h>
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
#ifdef HAVE_APACHE
|
|
Packit Service |
ca3877 |
static gboolean apache_running;
|
|
Packit Service |
ca3877 |
#endif
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static SoupLogger *logger;
|
|
Packit Service |
ca3877 |
static SoupBuffer *index_buffer;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
int debug_level;
|
|
Packit Service |
ca3877 |
gboolean expect_warning, tls_available;
|
|
Packit Service |
ca3877 |
static int http_debug_level;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static gboolean
|
|
Packit Service |
ca3877 |
increment_debug_level (const char *option_name, const char *value,
|
|
Packit Service |
ca3877 |
gpointer data, GError **error)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
debug_level++;
|
|
Packit Service |
ca3877 |
return TRUE;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static gboolean
|
|
Packit Service |
ca3877 |
increment_http_debug_level (const char *option_name, const char *value,
|
|
Packit Service |
ca3877 |
gpointer data, GError **error)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
http_debug_level++;
|
|
Packit Service |
ca3877 |
return TRUE;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static GOptionEntry debug_entry[] = {
|
|
Packit Service |
ca3877 |
{ "debug", 'd', G_OPTION_FLAG_NO_ARG,
|
|
Packit Service |
ca3877 |
G_OPTION_ARG_CALLBACK, increment_debug_level,
|
|
Packit Service |
ca3877 |
"Enable (or increase) test-specific debugging", NULL },
|
|
Packit Service |
ca3877 |
{ "http-debug", 'H', G_OPTION_FLAG_NO_ARG,
|
|
Packit Service |
ca3877 |
G_OPTION_ARG_CALLBACK, increment_http_debug_level,
|
|
Packit Service |
ca3877 |
"Enable (or increase) HTTP-level debugging", NULL },
|
|
Packit Service |
ca3877 |
{ NULL }
|
|
Packit Service |
ca3877 |
};
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
quit (int sig)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
#ifdef HAVE_APACHE
|
|
Packit Service |
ca3877 |
if (apache_running)
|
|
Packit Service |
ca3877 |
apache_cleanup ();
|
|
Packit Service |
ca3877 |
#endif
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
exit (1);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
test_init (int argc, char **argv, GOptionEntry *entries)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
GOptionContext *opts;
|
|
Packit Service |
ca3877 |
char *name;
|
|
Packit Service |
ca3877 |
GError *error = NULL;
|
|
Packit Service |
ca3877 |
GTlsBackend *tls_backend;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
setlocale (LC_ALL, "");
|
|
Packit Service |
ca3877 |
g_setenv ("GSETTINGS_BACKEND", "memory", TRUE);
|
|
Packit Service |
ca3877 |
g_setenv ("GIO_USE_PROXY_RESOLVER", "dummy", TRUE);
|
|
Packit Service |
ca3877 |
g_setenv ("GIO_USE_VFS", "local", TRUE);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
name = strrchr (argv[0], '/');
|
|
Packit Service |
ca3877 |
if (!name++)
|
|
Packit Service |
ca3877 |
name = argv[0];
|
|
Packit Service |
ca3877 |
if (!strncmp (name, "lt-", 3))
|
|
Packit Service |
ca3877 |
name += 3;
|
|
Packit Service |
ca3877 |
g_set_prgname (name);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_test_init (&argc, &argv, NULL);
|
|
Packit Service |
ca3877 |
g_test_set_nonfatal_assertions ();
|
|
Packit Service |
ca3877 |
g_test_bug_base ("https://bugzilla.gnome.org/");
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
opts = g_option_context_new (NULL);
|
|
Packit Service |
ca3877 |
g_option_context_add_main_entries (opts, debug_entry, NULL);
|
|
Packit Service |
ca3877 |
if (entries)
|
|
Packit Service |
ca3877 |
g_option_context_add_main_entries (opts, entries, NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (!g_option_context_parse (opts, &argc, &argv, &error)) {
|
|
Packit Service |
ca3877 |
g_printerr ("Could not parse arguments: %s\n",
|
|
Packit Service |
ca3877 |
error->message);
|
|
Packit Service |
ca3877 |
g_printerr ("%s",
|
|
Packit Service |
ca3877 |
g_option_context_get_help (opts, TRUE, NULL));
|
|
Packit Service |
ca3877 |
exit (1);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
g_option_context_free (opts);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* Exit cleanly on ^C in case we're valgrinding. */
|
|
Packit Service |
ca3877 |
signal (SIGINT, quit);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
tls_backend = g_tls_backend_get_default ();
|
|
Packit Service |
ca3877 |
tls_available = g_tls_backend_supports_tls (tls_backend);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
test_cleanup (void)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
#ifdef HAVE_APACHE
|
|
Packit Service |
ca3877 |
if (apache_running)
|
|
Packit Service |
ca3877 |
apache_cleanup ();
|
|
Packit Service |
ca3877 |
#endif
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (logger)
|
|
Packit Service |
ca3877 |
g_object_unref (logger);
|
|
Packit Service |
ca3877 |
if (index_buffer)
|
|
Packit Service |
ca3877 |
soup_buffer_free (index_buffer);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_main_context_unref (g_main_context_default ());
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
debug_printf (1, "\n");
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
debug_printf (int level, const char *format, ...)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
va_list args;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (debug_level < level)
|
|
Packit Service |
ca3877 |
return;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
va_start (args, format);
|
|
Packit Service |
ca3877 |
g_vprintf (format, args);
|
|
Packit Service |
ca3877 |
va_end (args);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
#ifdef HAVE_APACHE
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static gboolean
|
|
Packit Service |
ca3877 |
apache_cmd (const char *cmd)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
GPtrArray *argv;
|
|
Packit Service |
ca3877 |
char *server_root, *cwd, *pid_file;
|
|
Packit Service |
ca3877 |
#ifdef HAVE_APACHE_2_4
|
|
Packit Service |
ca3877 |
char *default_runtime_dir;
|
|
Packit Service |
ca3877 |
#endif
|
|
Packit Service |
ca3877 |
int status;
|
|
Packit Service |
ca3877 |
gboolean ok;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
server_root = g_test_build_filename (G_TEST_BUILT, "", NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
cwd = g_get_current_dir ();
|
|
Packit Service |
ca3877 |
#ifdef HAVE_APACHE_2_4
|
|
Packit Service |
ca3877 |
default_runtime_dir = g_strdup_printf ("DefaultRuntimeDir %s", cwd);
|
|
Packit Service |
ca3877 |
#endif
|
|
Packit Service |
ca3877 |
pid_file = g_strdup_printf ("PidFile %s/httpd.pid", cwd);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
argv = g_ptr_array_new ();
|
|
Packit Service |
ca3877 |
g_ptr_array_add (argv, APACHE_HTTPD);
|
|
Packit Service |
ca3877 |
g_ptr_array_add (argv, "-d");
|
|
Packit Service |
ca3877 |
g_ptr_array_add (argv, server_root);
|
|
Packit Service |
ca3877 |
g_ptr_array_add (argv, "-f");
|
|
Packit Service |
ca3877 |
g_ptr_array_add (argv, "httpd.conf");
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
#ifdef HAVE_APACHE_2_4
|
|
Packit Service |
ca3877 |
g_ptr_array_add (argv, "-c");
|
|
Packit Service |
ca3877 |
g_ptr_array_add (argv, default_runtime_dir);
|
|
Packit Service |
ca3877 |
#endif
|
|
Packit Service |
ca3877 |
g_ptr_array_add (argv, "-c");
|
|
Packit Service |
ca3877 |
g_ptr_array_add (argv, pid_file);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_ptr_array_add (argv, "-k");
|
|
Packit Service |
ca3877 |
g_ptr_array_add (argv, (char *)cmd);
|
|
Packit Service |
ca3877 |
g_ptr_array_add (argv, NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
ok = g_spawn_sync (cwd, (char **)argv->pdata, NULL, 0, NULL, NULL,
|
|
Packit Service |
ca3877 |
NULL, NULL, &status, NULL);
|
|
Packit Service |
ca3877 |
if (ok)
|
|
Packit Service |
ca3877 |
ok = (status == 0);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_free (server_root);
|
|
Packit Service |
ca3877 |
g_free (cwd);
|
|
Packit Service |
ca3877 |
g_free (pid_file);
|
|
Packit Service |
ca3877 |
#ifdef HAVE_APACHE_2_4
|
|
Packit Service |
ca3877 |
g_free (default_runtime_dir);
|
|
Packit Service |
ca3877 |
#endif
|
|
Packit Service |
ca3877 |
g_ptr_array_free (argv, TRUE);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return ok;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
apache_init (void)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
if (g_getenv ("SOUP_TESTS_IN_MAKE_CHECK"))
|
|
Packit Service |
ca3877 |
return;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (!apache_cmd ("start")) {
|
|
Packit Service |
ca3877 |
g_printerr ("Could not start apache\n");
|
|
Packit Service |
ca3877 |
exit (1);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
apache_running = TRUE;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
apache_cleanup (void)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
pid_t pid;
|
|
Packit Service |
ca3877 |
char *contents;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (g_file_get_contents ("httpd.pid", &contents, NULL, NULL)) {
|
|
Packit Service |
ca3877 |
pid = strtoul (contents, NULL, 10);
|
|
Packit Service |
ca3877 |
g_free (contents);
|
|
Packit Service |
ca3877 |
} else
|
|
Packit Service |
ca3877 |
pid = 0;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (!apache_cmd ("graceful-stop"))
|
|
Packit Service |
ca3877 |
return;
|
|
Packit Service |
ca3877 |
apache_running = FALSE;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (pid) {
|
|
Packit Service |
ca3877 |
while (kill (pid, 0) == 0)
|
|
Packit Service |
ca3877 |
g_usleep (100);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
#endif /* HAVE_APACHE */
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
SoupSession *
|
|
Packit Service |
ca3877 |
soup_test_session_new (GType type, ...)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
va_list args;
|
|
Packit Service |
ca3877 |
const char *propname;
|
|
Packit Service |
ca3877 |
SoupSession *session;
|
|
Packit Service |
ca3877 |
GTlsDatabase *tlsdb;
|
|
Packit Service |
ca3877 |
char *cafile;
|
|
Packit Service |
ca3877 |
GError *error = NULL;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
va_start (args, type);
|
|
Packit Service |
ca3877 |
propname = va_arg (args, const char *);
|
|
Packit Service |
ca3877 |
session = (SoupSession *)g_object_new_valist (type, propname, args);
|
|
Packit Service |
ca3877 |
va_end (args);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (tls_available) {
|
|
Packit Service |
ca3877 |
cafile = g_test_build_filename (G_TEST_DIST, "test-cert.pem", NULL);
|
|
Packit Service |
ca3877 |
tlsdb = g_tls_file_database_new (cafile, &error);
|
|
Packit Service |
ca3877 |
g_free (cafile);
|
|
Packit Service |
ca3877 |
if (error) {
|
|
Packit Service |
ca3877 |
if (g_strcmp0 (g_getenv ("GIO_USE_TLS"), "dummy") == 0)
|
|
Packit Service |
ca3877 |
g_clear_error (&error);
|
|
Packit Service |
ca3877 |
else
|
|
Packit Service |
ca3877 |
g_assert_no_error (error);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_object_set (G_OBJECT (session),
|
|
Packit Service |
ca3877 |
SOUP_SESSION_TLS_DATABASE, tlsdb,
|
|
Packit Service |
ca3877 |
NULL);
|
|
Packit Service |
ca3877 |
g_clear_object (&tlsdb);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (http_debug_level && !logger) {
|
|
Packit Service |
ca3877 |
SoupLoggerLogLevel level = MIN ((SoupLoggerLogLevel)http_debug_level, SOUP_LOGGER_LOG_BODY);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
logger = soup_logger_new (level, -1);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (logger)
|
|
Packit Service |
ca3877 |
soup_session_add_feature (session, SOUP_SESSION_FEATURE (logger));
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return session;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_test_session_abort_unref (SoupSession *session)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
soup_session_abort (session);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_assert_cmpint (G_OBJECT (session)->ref_count, ==, 1);
|
|
Packit Service |
ca3877 |
g_object_unref (session);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
server_listen (SoupServer *server)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
GError *error = NULL;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
soup_server_listen_local (server, 0, 0, &error);
|
|
Packit Service |
ca3877 |
if (error) {
|
|
Packit Service |
ca3877 |
g_printerr ("Unable to create server: %s\n", error->message);
|
|
Packit Service |
ca3877 |
exit (1);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static GMutex server_start_mutex;
|
|
Packit Service |
ca3877 |
static GCond server_start_cond;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static gpointer
|
|
Packit Service |
ca3877 |
run_server_thread (gpointer user_data)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupServer *server = user_data;
|
|
Packit Service |
ca3877 |
SoupTestServerOptions options =
|
|
Packit Service |
ca3877 |
GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (server), "options"));
|
|
Packit Service |
ca3877 |
GMainContext *context;
|
|
Packit Service |
ca3877 |
GMainLoop *loop;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
context = g_main_context_new ();
|
|
Packit Service |
ca3877 |
g_main_context_push_thread_default (context);
|
|
Packit Service |
ca3877 |
loop = g_main_loop_new (context, FALSE);
|
|
Packit Service |
ca3877 |
g_object_set_data (G_OBJECT (server), "GMainLoop", loop);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (!(options & SOUP_TEST_SERVER_NO_DEFAULT_LISTENER))
|
|
Packit Service |
ca3877 |
server_listen (server);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_mutex_lock (&server_start_mutex);
|
|
Packit Service |
ca3877 |
g_cond_signal (&server_start_cond);
|
|
Packit Service |
ca3877 |
g_mutex_unlock (&server_start_mutex);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_main_loop_run (loop);
|
|
Packit Service |
ca3877 |
g_main_loop_unref (loop);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
soup_server_disconnect (server);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_main_context_pop_thread_default (context);
|
|
Packit Service |
ca3877 |
g_main_context_unref (context);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return NULL;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
SoupServer *
|
|
Packit Service |
ca3877 |
soup_test_server_new (SoupTestServerOptions options)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupServer *server;
|
|
Packit Service |
ca3877 |
GTlsCertificate *cert = NULL;
|
|
Packit Service |
ca3877 |
GError *error = NULL;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (tls_available) {
|
|
Packit Service |
ca3877 |
char *ssl_cert_file, *ssl_key_file;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
ssl_cert_file = g_test_build_filename (G_TEST_DIST, "test-cert.pem", NULL);
|
|
Packit Service |
ca3877 |
ssl_key_file = g_test_build_filename (G_TEST_DIST, "test-key.pem", NULL);
|
|
Packit Service |
ca3877 |
cert = g_tls_certificate_new_from_files (ssl_cert_file,
|
|
Packit Service |
ca3877 |
ssl_key_file,
|
|
Packit Service |
ca3877 |
&error);
|
|
Packit Service |
ca3877 |
g_free (ssl_cert_file);
|
|
Packit Service |
ca3877 |
g_free (ssl_key_file);
|
|
Packit Service |
ca3877 |
if (error) {
|
|
Packit Service |
ca3877 |
g_printerr ("Unable to create server: %s\n", error->message);
|
|
Packit Service |
ca3877 |
exit (1);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
server = soup_server_new (SOUP_SERVER_TLS_CERTIFICATE, cert,
|
|
Packit Service |
ca3877 |
NULL);
|
|
Packit Service |
ca3877 |
g_clear_object (&cert);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_object_set_data (G_OBJECT (server), "options", GUINT_TO_POINTER (options));
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (options & SOUP_TEST_SERVER_IN_THREAD) {
|
|
Packit Service |
ca3877 |
GThread *thread;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_mutex_lock (&server_start_mutex);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
thread = g_thread_new ("server_thread", run_server_thread, server);
|
|
Packit Service |
ca3877 |
g_cond_wait (&server_start_cond, &server_start_mutex);
|
|
Packit Service |
ca3877 |
g_mutex_unlock (&server_start_mutex);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_object_set_data (G_OBJECT (server), "thread", thread);
|
|
Packit Service |
ca3877 |
} else if (!(options & SOUP_TEST_SERVER_NO_DEFAULT_LISTENER))
|
|
Packit Service |
ca3877 |
server_listen (server);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return server;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static SoupURI *
|
|
Packit Service |
ca3877 |
find_server_uri (SoupServer *server, const char *scheme, const char *host)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
GSList *uris, *u;
|
|
Packit Service |
ca3877 |
SoupURI *uri, *ret_uri = NULL;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
uris = soup_server_get_uris (server);
|
|
Packit Service |
ca3877 |
for (u = uris; u; u = u->next) {
|
|
Packit Service |
ca3877 |
uri = u->data;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (scheme && strcmp (uri->scheme, scheme) != 0)
|
|
Packit Service |
ca3877 |
continue;
|
|
Packit Service |
ca3877 |
if (host && strcmp (uri->host, host) != 0)
|
|
Packit Service |
ca3877 |
continue;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
ret_uri = soup_uri_copy (uri);
|
|
Packit Service |
ca3877 |
break;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
g_slist_free_full (uris, (GDestroyNotify)soup_uri_free);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return ret_uri;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static SoupURI *
|
|
Packit Service |
ca3877 |
add_listener (SoupServer *server, const char *scheme, const char *host)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupServerListenOptions options = 0;
|
|
Packit Service |
ca3877 |
GError *error = NULL;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (!g_strcmp0 (scheme, SOUP_URI_SCHEME_HTTPS))
|
|
Packit Service |
ca3877 |
options |= SOUP_SERVER_LISTEN_HTTPS;
|
|
Packit Service |
ca3877 |
if (!g_strcmp0 (host, "127.0.0.1"))
|
|
Packit Service |
ca3877 |
options |= SOUP_SERVER_LISTEN_IPV4_ONLY;
|
|
Packit Service |
ca3877 |
else if (!g_strcmp0 (host, "::1"))
|
|
Packit Service |
ca3877 |
options |= SOUP_SERVER_LISTEN_IPV6_ONLY;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
soup_server_listen_local (server, 0, options, &error);
|
|
Packit Service |
ca3877 |
g_assert_no_error (error);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return find_server_uri (server, scheme, host);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
typedef struct {
|
|
Packit Service |
ca3877 |
GMutex mutex;
|
|
Packit Service |
ca3877 |
GCond cond;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
SoupServer *server;
|
|
Packit Service |
ca3877 |
const char *scheme;
|
|
Packit Service |
ca3877 |
const char *host;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
SoupURI *uri;
|
|
Packit Service |
ca3877 |
} AddListenerData;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static gboolean
|
|
Packit Service |
ca3877 |
add_listener_in_thread (gpointer user_data)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
AddListenerData *data = user_data;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
data->uri = add_listener (data->server, data->scheme, data->host);
|
|
Packit Service |
ca3877 |
g_mutex_lock (&data->mutex);
|
|
Packit Service |
ca3877 |
g_cond_signal (&data->cond);
|
|
Packit Service |
ca3877 |
g_mutex_unlock (&data->mutex);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return FALSE;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
SoupURI *
|
|
Packit Service |
ca3877 |
soup_test_server_get_uri (SoupServer *server,
|
|
Packit Service |
ca3877 |
const char *scheme,
|
|
Packit Service |
ca3877 |
const char *host)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupURI *uri;
|
|
Packit Service |
ca3877 |
GMainLoop *loop;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
uri = find_server_uri (server, scheme, host);
|
|
Packit Service |
ca3877 |
if (uri)
|
|
Packit Service |
ca3877 |
return uri;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* Need to add a new listener */
|
|
Packit Service |
ca3877 |
loop = g_object_get_data (G_OBJECT (server), "GMainLoop");
|
|
Packit Service |
ca3877 |
if (loop) {
|
|
Packit Service |
ca3877 |
GMainContext *context = g_main_loop_get_context (loop);
|
|
Packit Service |
ca3877 |
AddListenerData data;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_mutex_init (&data.mutex);
|
|
Packit Service |
ca3877 |
g_cond_init (&data.cond);
|
|
Packit Service |
ca3877 |
data.server = server;
|
|
Packit Service |
ca3877 |
data.scheme = scheme;
|
|
Packit Service |
ca3877 |
data.host = host;
|
|
Packit Service |
ca3877 |
data.uri = NULL;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_mutex_lock (&data.mutex);
|
|
Packit Service |
ca3877 |
soup_add_completion (context, add_listener_in_thread, &data);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
while (!data.uri)
|
|
Packit Service |
ca3877 |
g_cond_wait (&data.cond, &data.mutex);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_mutex_unlock (&data.mutex);
|
|
Packit Service |
ca3877 |
g_mutex_clear (&data.mutex);
|
|
Packit Service |
ca3877 |
g_cond_clear (&data.cond);
|
|
Packit Service |
ca3877 |
uri = data.uri;
|
|
Packit Service |
ca3877 |
} else
|
|
Packit Service |
ca3877 |
uri = add_listener (server, scheme, host);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return uri;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static gboolean
|
|
Packit Service |
ca3877 |
done_waiting (gpointer user_data)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
gboolean *done = user_data;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
*done = TRUE;
|
|
Packit Service |
ca3877 |
return FALSE;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
disconnect_and_wait (SoupServer *server,
|
|
Packit Service |
ca3877 |
GMainContext *context)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
GSource *source;
|
|
Packit Service |
ca3877 |
gboolean done = FALSE;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
source = g_idle_source_new ();
|
|
Packit Service |
ca3877 |
g_source_set_priority (source, G_PRIORITY_LOW);
|
|
Packit Service |
ca3877 |
g_source_set_callback (source, done_waiting, &done, NULL);
|
|
Packit Service |
ca3877 |
g_source_attach (source, context);
|
|
Packit Service |
ca3877 |
g_source_unref (source);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
soup_server_disconnect (server);
|
|
Packit Service |
ca3877 |
while (!done)
|
|
Packit Service |
ca3877 |
g_main_context_iteration (context, TRUE);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static gboolean
|
|
Packit Service |
ca3877 |
idle_quit_server (gpointer user_data)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupServer *server = user_data;
|
|
Packit Service |
ca3877 |
GMainLoop *loop = g_object_get_data (G_OBJECT (server), "GMainLoop");
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
disconnect_and_wait (server, g_main_loop_get_context (loop));
|
|
Packit Service |
ca3877 |
g_main_loop_quit (loop);
|
|
Packit Service |
ca3877 |
return FALSE;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_test_server_quit_unref (SoupServer *server)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
GThread *thread;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
thread = g_object_get_data (G_OBJECT (server), "thread");
|
|
Packit Service |
ca3877 |
if (thread) {
|
|
Packit Service |
ca3877 |
GMainLoop *loop;
|
|
Packit Service |
ca3877 |
GMainContext *context;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
loop = g_object_get_data (G_OBJECT (server), "GMainLoop");
|
|
Packit Service |
ca3877 |
context = g_main_loop_get_context (loop);
|
|
Packit Service |
ca3877 |
g_main_context_ref (context);
|
|
Packit Service |
ca3877 |
soup_add_completion (context, idle_quit_server, server);
|
|
Packit Service |
ca3877 |
g_main_context_unref (context);
|
|
Packit Service |
ca3877 |
g_thread_join (thread);
|
|
Packit Service |
ca3877 |
} else
|
|
Packit Service |
ca3877 |
disconnect_and_wait (server, NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_assert_cmpint (G_OBJECT (server)->ref_count, ==, 1);
|
|
Packit Service |
ca3877 |
g_object_unref (server);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
typedef struct {
|
|
Packit Service |
ca3877 |
GMainLoop *loop;
|
|
Packit Service |
ca3877 |
GAsyncResult *result;
|
|
Packit Service |
ca3877 |
} AsyncAsSyncData;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
async_as_sync_callback (GObject *object,
|
|
Packit Service |
ca3877 |
GAsyncResult *result,
|
|
Packit Service |
ca3877 |
gpointer user_data)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
AsyncAsSyncData *data = user_data;
|
|
Packit Service |
ca3877 |
GMainContext *context;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
data->result = g_object_ref (result);
|
|
Packit Service |
ca3877 |
context = g_main_loop_get_context (data->loop);
|
|
Packit Service |
ca3877 |
while (g_main_context_pending (context))
|
|
Packit Service |
ca3877 |
g_main_context_iteration (context, FALSE);
|
|
Packit Service |
ca3877 |
g_main_loop_quit (data->loop);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
typedef struct {
|
|
Packit Service |
ca3877 |
SoupRequest *req;
|
|
Packit Service |
ca3877 |
GCancellable *cancellable;
|
|
Packit Service |
ca3877 |
SoupTestRequestFlags flags;
|
|
Packit Service |
ca3877 |
} CancelData;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static CancelData *
|
|
Packit Service |
ca3877 |
create_cancel_data (SoupRequest *req,
|
|
Packit Service |
ca3877 |
GCancellable *cancellable,
|
|
Packit Service |
ca3877 |
SoupTestRequestFlags flags)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
CancelData *cancel_data;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (!flags)
|
|
Packit Service |
ca3877 |
return NULL;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
cancel_data = g_slice_new0 (CancelData);
|
|
Packit Service |
ca3877 |
cancel_data->flags = flags;
|
|
Packit Service |
ca3877 |
if (flags & SOUP_TEST_REQUEST_CANCEL_MESSAGE && SOUP_IS_REQUEST_HTTP (req))
|
|
Packit Service |
ca3877 |
cancel_data->req = g_object_ref (req);
|
|
Packit Service |
ca3877 |
else if (flags & SOUP_TEST_REQUEST_CANCEL_CANCELLABLE)
|
|
Packit Service |
ca3877 |
cancel_data->cancellable = g_object_ref (cancellable);
|
|
Packit Service |
ca3877 |
return cancel_data;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
inline static void
|
|
Packit Service |
ca3877 |
cancel_message_or_cancellable (CancelData *cancel_data)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
if (cancel_data->flags & SOUP_TEST_REQUEST_CANCEL_MESSAGE) {
|
|
Packit Service |
ca3877 |
SoupRequest *req = cancel_data->req;
|
|
Packit Service |
ca3877 |
SoupMessage *msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (req));
|
|
Packit Service |
ca3877 |
soup_session_cancel_message (soup_request_get_session (req), msg,
|
|
Packit Service |
ca3877 |
SOUP_STATUS_CANCELLED);
|
|
Packit Service |
ca3877 |
g_object_unref (msg);
|
|
Packit Service |
ca3877 |
g_object_unref (req);
|
|
Packit Service |
ca3877 |
} else if (cancel_data->flags & SOUP_TEST_REQUEST_CANCEL_CANCELLABLE) {
|
|
Packit Service |
ca3877 |
g_cancellable_cancel (cancel_data->cancellable);
|
|
Packit Service |
ca3877 |
g_object_unref (cancel_data->cancellable);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
g_slice_free (CancelData, cancel_data);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static gboolean
|
|
Packit Service |
ca3877 |
cancel_request_timeout (gpointer data)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
cancel_message_or_cancellable ((CancelData *) data);
|
|
Packit Service |
ca3877 |
return FALSE;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static gpointer
|
|
Packit Service |
ca3877 |
cancel_request_thread (gpointer data)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_usleep (100000); /* .1s */
|
|
Packit Service |
ca3877 |
cancel_message_or_cancellable ((CancelData *) data);
|
|
Packit Service |
ca3877 |
return NULL;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
GInputStream *
|
|
Packit Service |
ca3877 |
soup_test_request_send (SoupRequest *req,
|
|
Packit Service |
ca3877 |
GCancellable *cancellable,
|
|
Packit Service |
ca3877 |
guint flags,
|
|
Packit Service |
ca3877 |
GError **error)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
AsyncAsSyncData data;
|
|
Packit Service |
ca3877 |
GInputStream *stream;
|
|
Packit Service |
ca3877 |
CancelData *cancel_data = create_cancel_data (req, cancellable, flags);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (SOUP_IS_SESSION_SYNC (soup_request_get_session (req))) {
|
|
Packit Service |
ca3877 |
GThread *thread;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (cancel_data)
|
|
Packit Service |
ca3877 |
thread = g_thread_new ("cancel_request_thread", cancel_request_thread,
|
|
Packit Service |
ca3877 |
cancel_data);
|
|
Packit Service |
ca3877 |
stream = soup_request_send (req, cancellable, error);
|
|
Packit Service |
ca3877 |
if (cancel_data)
|
|
Packit Service |
ca3877 |
g_thread_unref (thread);
|
|
Packit Service |
ca3877 |
return stream;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
data.loop = g_main_loop_new (g_main_context_get_thread_default (), FALSE);
|
|
Packit Service |
ca3877 |
if (cancel_data &&
|
|
Packit Service |
ca3877 |
(flags & SOUP_TEST_REQUEST_CANCEL_SOON || flags & SOUP_TEST_REQUEST_CANCEL_IMMEDIATE)) {
|
|
Packit Service |
ca3877 |
guint interval = flags & SOUP_TEST_REQUEST_CANCEL_SOON ? 100 : 0;
|
|
Packit Service |
ca3877 |
g_timeout_add_full (G_PRIORITY_HIGH, interval, cancel_request_timeout, cancel_data, NULL);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
if (cancel_data && (flags & SOUP_TEST_REQUEST_CANCEL_PREEMPTIVE))
|
|
Packit Service |
ca3877 |
cancel_message_or_cancellable (cancel_data);
|
|
Packit Service |
ca3877 |
soup_request_send_async (req, cancellable, async_as_sync_callback, &data);
|
|
Packit Service |
ca3877 |
g_main_loop_run (data.loop);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
stream = soup_request_send_finish (req, data.result, error);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (cancel_data && (flags & SOUP_TEST_REQUEST_CANCEL_AFTER_SEND_FINISH)) {
|
|
Packit Service |
ca3877 |
GMainContext *context;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
cancel_message_or_cancellable (cancel_data);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
context = g_main_loop_get_context (data.loop);
|
|
Packit Service |
ca3877 |
while (g_main_context_pending (context))
|
|
Packit Service |
ca3877 |
g_main_context_iteration (context, FALSE);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_main_loop_unref (data.loop);
|
|
Packit Service |
ca3877 |
g_object_unref (data.result);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return stream;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
gboolean
|
|
Packit Service |
ca3877 |
soup_test_request_read_all (SoupRequest *req,
|
|
Packit Service |
ca3877 |
GInputStream *stream,
|
|
Packit Service |
ca3877 |
GCancellable *cancellable,
|
|
Packit Service |
ca3877 |
GError **error)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
char buf[8192];
|
|
Packit Service |
ca3877 |
AsyncAsSyncData data;
|
|
Packit Service |
ca3877 |
gsize nread;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (!SOUP_IS_SESSION_SYNC (soup_request_get_session (req)))
|
|
Packit Service |
ca3877 |
data.loop = g_main_loop_new (g_main_context_get_thread_default (), FALSE);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
do {
|
|
Packit Service |
ca3877 |
if (SOUP_IS_SESSION_SYNC (soup_request_get_session (req))) {
|
|
Packit Service |
ca3877 |
nread = g_input_stream_read (stream, buf, sizeof (buf),
|
|
Packit Service |
ca3877 |
cancellable, error);
|
|
Packit Service |
ca3877 |
} else {
|
|
Packit Service |
ca3877 |
g_input_stream_read_async (stream, buf, sizeof (buf),
|
|
Packit Service |
ca3877 |
G_PRIORITY_DEFAULT, cancellable,
|
|
Packit Service |
ca3877 |
async_as_sync_callback, &data);
|
|
Packit Service |
ca3877 |
g_main_loop_run (data.loop);
|
|
Packit Service |
ca3877 |
nread = g_input_stream_read_finish (stream, data.result, error);
|
|
Packit Service |
ca3877 |
g_object_unref (data.result);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
} while (nread > 0);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (!SOUP_IS_SESSION_SYNC (soup_request_get_session (req)))
|
|
Packit Service |
ca3877 |
g_main_loop_unref (data.loop);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return nread == 0;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
gboolean
|
|
Packit Service |
ca3877 |
soup_test_request_close_stream (SoupRequest *req,
|
|
Packit Service |
ca3877 |
GInputStream *stream,
|
|
Packit Service |
ca3877 |
GCancellable *cancellable,
|
|
Packit Service |
ca3877 |
GError **error)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
AsyncAsSyncData data;
|
|
Packit Service |
ca3877 |
gboolean ok;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (SOUP_IS_SESSION_SYNC (soup_request_get_session (req)))
|
|
Packit Service |
ca3877 |
return g_input_stream_close (stream, cancellable, error);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
data.loop = g_main_loop_new (g_main_context_get_thread_default (), FALSE);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_input_stream_close_async (stream, G_PRIORITY_DEFAULT, cancellable,
|
|
Packit Service |
ca3877 |
async_as_sync_callback, &data);
|
|
Packit Service |
ca3877 |
g_main_loop_run (data.loop);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
ok = g_input_stream_close_finish (stream, data.result, error);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_main_loop_unref (data.loop);
|
|
Packit Service |
ca3877 |
g_object_unref (data.result);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return ok;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_test_register_resources (void)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
static gboolean registered = FALSE;
|
|
Packit Service |
ca3877 |
GResource *resource;
|
|
Packit Service |
ca3877 |
char *path;
|
|
Packit Service |
ca3877 |
GError *error = NULL;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (registered)
|
|
Packit Service |
ca3877 |
return;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
path = g_test_build_filename (G_TEST_BUILT, "soup-tests.gresource", NULL);
|
|
Packit Service |
ca3877 |
resource = g_resource_load (path, &error);
|
|
Packit Service |
ca3877 |
if (!resource) {
|
|
Packit Service |
ca3877 |
g_printerr ("Could not load resource soup-tests.gresource: %s\n",
|
|
Packit Service |
ca3877 |
error->message);
|
|
Packit Service |
ca3877 |
exit (1);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
g_free (path);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_resources_register (resource);
|
|
Packit Service |
ca3877 |
g_resource_unref (resource);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
registered = TRUE;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
SoupBuffer *
|
|
Packit Service |
ca3877 |
soup_test_load_resource (const char *name,
|
|
Packit Service |
ca3877 |
GError **error)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
GBytes *bytes;
|
|
Packit Service |
ca3877 |
char *path;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
soup_test_register_resources ();
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
path = g_build_path ("/", "/org/gnome/libsoup/tests/resources", name, NULL);
|
|
Packit Service |
ca3877 |
bytes = g_resources_lookup_data (path, G_RESOURCE_LOOKUP_FLAGS_NONE, error);
|
|
Packit Service |
ca3877 |
g_free (path);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (!bytes)
|
|
Packit Service |
ca3877 |
return NULL;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return soup_buffer_new_with_owner (g_bytes_get_data (bytes, NULL),
|
|
Packit Service |
ca3877 |
g_bytes_get_size (bytes),
|
|
Packit Service |
ca3877 |
bytes,
|
|
Packit Service |
ca3877 |
(GDestroyNotify) g_bytes_unref);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
SoupBuffer *
|
|
Packit Service |
ca3877 |
soup_test_get_index (void)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
if (!index_buffer) {
|
|
Packit Service |
ca3877 |
char *path, *contents;
|
|
Packit Service |
ca3877 |
gsize length;
|
|
Packit Service |
ca3877 |
GError *error = NULL;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
path = g_test_build_filename (G_TEST_DIST, "index.txt", NULL);
|
|
Packit Service |
ca3877 |
if (!g_file_get_contents (path, &contents, &length, &error)) {
|
|
Packit Service |
ca3877 |
g_printerr ("Could not read index.txt: %s\n",
|
|
Packit Service |
ca3877 |
error->message);
|
|
Packit Service |
ca3877 |
exit (1);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
g_free (path);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
index_buffer = soup_buffer_new (SOUP_MEMORY_TAKE, contents, length);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return index_buffer;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
#ifndef G_HAVE_ISO_VARARGS
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_test_assert (gboolean expr, const char *fmt, ...)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
char *message;
|
|
Packit Service |
ca3877 |
va_list args;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (G_UNLIKELY (!expr)) {
|
|
Packit Service |
ca3877 |
va_start (args, fmt);
|
|
Packit Service |
ca3877 |
message = g_strdup_vprintf (fmt, args);
|
|
Packit Service |
ca3877 |
va_end (args);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_assertion_message (G_LOG_DOMAIN,
|
|
Packit Service |
ca3877 |
"???", 0, "???"
|
|
Packit Service |
ca3877 |
message);
|
|
Packit Service |
ca3877 |
g_free (message);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
#endif
|