--- /dev/null
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2012 Igalia S.L.
+ */
+
+#include "test-utils.h"
+
+SoupBuffer *index_buffer;
+
+static void
+get_index (void)
+{
+ char *contents;
+ gsize length;
+ GError *error = NULL;
+
+ if (!g_file_get_contents (SRCDIR "/index.txt", &contents, &length, &error)) {
+ g_printerr ("Could not read index.txt: %s\n",
+ error->message);
+ exit (1);
+ }
+
+ index_buffer = soup_buffer_new (SOUP_MEMORY_TAKE, contents, length);
+}
+
+static void
+register_gresource (void)
+{
+ GResource *resource;
+ GError *error = NULL;
+
+ resource = g_resource_load ("soup-tests.gresource", &error);
+ if (!resource) {
+ g_printerr ("Could not load resource soup-tests.gresource: %s\n",
+ error->message);
+ exit (1);
+ }
+ g_resources_register (resource);
+ g_resource_unref (resource);
+}
+
+static void
+check_results (GString *body)
+{
+ if (body->len != index_buffer->length) {
+ debug_printf (1, " body length mismatch: expected %d, got %d\n",
+ (int)index_buffer->length, (int)body->len);
+ errors++;
+ } else if (memcmp (body->str, index_buffer->data, body->len) != 0) {
+ debug_printf (1, " body data mismatch\n");
+ errors++;
+ }
+}
+
+typedef struct {
+ GString *body;
+ char buffer[1024];
+ GMainLoop *loop;
+} AsyncRequestData;
+
+static void
+stream_closed (GObject *source, GAsyncResult *result, gpointer user_data)
+{
+ GInputStream *in = G_INPUT_STREAM (source);
+ AsyncRequestData *data = user_data;
+ GError *error = NULL;
+
+ if (!g_input_stream_close_finish (in, result, &error)) {
+ debug_printf (1, " close failed: %s\n", error->message);
+ g_error_free (error);
+ errors++;
+ }
+ g_main_loop_quit (data->loop);
+ g_object_unref (in);
+}
+
+static void
+test_read_ready (GObject *source, GAsyncResult *result, gpointer user_data)
+{
+ GInputStream *in = G_INPUT_STREAM (source);
+ AsyncRequestData *data = user_data;
+ gssize nread;
+ GError *error = NULL;
+
+ nread = g_input_stream_read_finish (in, result, &error);
+ if (nread == -1) {
+ debug_printf (1, " g_input_stream_read failed: %s\n",
+ error->message);
+ g_clear_error (&error);
+ g_input_stream_close (in, NULL, NULL);
+ g_object_unref (in);
+ errors++;
+ return;
+ } else if (nread == 0) {
+ g_input_stream_close_async (in, G_PRIORITY_DEFAULT, NULL,
+ stream_closed, data);
+ return;
+ }
+
+ g_string_append_len (data->body, data->buffer, nread);
+ g_input_stream_read_async (in, data->buffer, sizeof (data->buffer),
+ G_PRIORITY_DEFAULT, NULL,
+ test_read_ready, data);
+}
+
+static void
+async_request_sent (GObject *source, GAsyncResult *result, gpointer user_data)
+{
+ GInputStream *in;
+ AsyncRequestData *data = user_data;
+ GError *error = NULL;
+
+ in = soup_request_send_finish (SOUP_REQUEST (source), result, &error);
+ if (!in) {
+ debug_printf (1, " soup_request_send_async failed: %s\n",
+ error->message);
+ g_clear_error (&error);
+ errors++;
+ return;
+ }
+
+ g_input_stream_read_async (in, data->buffer, sizeof (data->buffer),
+ G_PRIORITY_DEFAULT, NULL,
+ test_read_ready, data);
+}
+
+static void
+do_async_request (SoupRequest *request)
+{
+ AsyncRequestData data;
+
+ data.body = g_string_new (NULL);
+ soup_request_send_async (request, NULL, async_request_sent, &data);
+
+ data.loop = g_main_loop_new (soup_session_get_async_context (soup_request_get_session (request)), TRUE);
+ g_main_loop_run (data.loop);
+ g_main_loop_unref (data.loop);
+
+ check_results (data.body);
+ g_string_free (data.body, TRUE);
+}
+
+static void
+do_sync_request (SoupRequest *request)
+{
+ GInputStream *in;
+ GString *body;
+ char buffer[1024];
+ gssize nread;
+ GError *error = NULL;
+
+ in = soup_request_send (request, NULL, &error);
+ if (!in) {
+ debug_printf (1, " soup_request_send failed: %s\n",
+ error->message);
+ g_clear_error (&error);
+ errors++;
+ return;
+ }
+
+ body = g_string_new (NULL);
+ do {
+ nread = g_input_stream_read (in, buffer, sizeof (buffer),
+ NULL, &error);
+ if (nread == -1) {
+ debug_printf (1, " g_input_stream_read failed: %s\n",
+ error->message);
+ g_clear_error (&error);
+ errors++;
+ break;
+ }
+ g_string_append_len (body, buffer, nread);
+ } while (nread > 0);
+
+ if (!g_input_stream_close (in, NULL, &error)) {
+ debug_printf (1, " g_input_stream_close failed: %s\n",
+ error->message);
+ g_clear_error (&error);
+ errors++;
+ }
+ g_object_unref (in);
+
+ check_results (body);
+ g_string_free (body, TRUE);
+}
+
+static void
+do_request_file_test (SoupRequester *requester,
+ gboolean async)
+{
+ SoupRequest *request;
+ GFile *index;
+ char *uri_string;
+ SoupURI *uri;
+
+ index = g_file_new_for_path (SRCDIR "/index.txt");
+ uri_string = g_file_get_uri (index);
+ g_object_unref (index);
+
+ uri = soup_uri_new (uri_string);
+ g_free (uri_string);
+
+ request = soup_requester_request_uri (requester, uri, NULL);
+ if (async)
+ do_async_request (request);
+ else
+ do_sync_request (request);
+ g_object_unref (request);
+
+ soup_uri_free (uri);
+}
+
+static void
+do_request_data_test (SoupRequester *requester,
+ gboolean async)
+{
+ SoupRequest *request;
+ gchar *base64;
+ char *uri_string;
+ SoupURI *uri;
+
+ base64 = g_base64_encode ((const guchar *)index_buffer->data, index_buffer->length);
+ uri_string = g_strdup_printf ("data:text/plain;charset=utf8;base64,%s", base64);
+ g_free (base64);
+
+ uri = soup_uri_new (uri_string);
+ g_free (uri_string);
+
+ request = soup_requester_request_uri (requester, uri, NULL);
+ if (async)
+ do_async_request (request);
+ else
+ do_sync_request (request);
+ g_object_unref (request);
+
+ soup_uri_free (uri);
+}
+
+static void
+do_request_gresource_test (SoupRequester *requester,
+ gboolean async)
+{
+ SoupRequest *request;
+ SoupURI *uri;
+
+ uri = soup_uri_new ("resource:///org/gnome/libsoup/tests/index.txt");
+ request = soup_requester_request_uri (requester, uri, NULL);
+ if (async)
+ do_async_request (request);
+ else
+ do_sync_request (request);
+ g_object_unref (request);
+
+ soup_uri_free (uri);
+}
+
+int
+main (int argc, char **argv)
+{
+ SoupSession *session;
+ SoupRequester *requester;
+
+ test_init (argc, argv, NULL);
+
+ get_index ();
+ register_gresource ();
+
+ /* Sync tests */
+ session = soup_test_session_new (SOUP_TYPE_SESSION_SYNC, NULL);
+ requester = soup_requester_new ();
+ soup_session_add_feature (session, SOUP_SESSION_FEATURE (requester));
+ g_object_unref (requester);
+
+ do_request_file_test (requester, FALSE);
+ do_request_data_test (requester, FALSE);
+ do_request_gresource_test (requester, FALSE);
+
+ soup_test_session_abort_unref (session);
+
+ /* Async tests */
+ session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC,
+ SOUP_SESSION_USE_THREAD_CONTEXT, TRUE,
+ NULL);
+ requester = soup_requester_new ();
+ soup_session_add_feature (session, SOUP_SESSION_FEATURE (requester));
+ g_object_unref (requester);
+
+ do_request_file_test (requester, TRUE);
+ do_request_data_test (requester, TRUE);
+ do_request_gresource_test (requester, TRUE);
+
+ soup_test_session_abort_unref (session);
+
+ test_cleanup ();
+ return errors != 0;
+}