Updating to 2.39.2
[profile/ivi/libsoup2.4.git] / tests / proxy-test.c
index 27d8d2e..62bbd99 100644 (file)
@@ -1,3 +1,5 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
@@ -7,7 +9,10 @@
 #include <string.h>
 #include <unistd.h>
 
-#include "libsoup/soup.h"
+#define LIBSOUP_USE_UNSTABLE_REQUEST_API
+#include <libsoup/soup.h>
+#include <libsoup/soup-requester.h>
+#include <libsoup/soup-request-http.h>
 #include "test-utils.h"
 
 typedef struct {
@@ -82,6 +87,7 @@ set_close_on_connect (SoupSession *session, SoupMessage *msg,
        }
 }
 
+
 static void
 test_url (const char *url, int proxy, guint expected,
          gboolean sync, gboolean close)
@@ -131,6 +137,100 @@ test_url (const char *url, int proxy, guint expected,
        soup_test_session_abort_unref (session);
 }
 
+static GMainLoop *loop;
+
+static void
+request_completed (GObject *source, GAsyncResult *result, gpointer user_data)
+{
+       SoupRequest *req = SOUP_REQUEST (source);
+       GInputStream **stream_p = user_data;
+       GError *error = NULL;
+
+       debug_printf (2, "  Request completed\n");
+       *stream_p = soup_request_send_finish (req, result, &error);
+       if (!*stream_p) {
+               debug_printf (1, "  Unexpected error on Request: %s\n",
+                             error->message);
+               errors++;
+               g_error_free (error);
+       }
+
+       g_main_loop_quit (loop);
+}
+
+static void
+test_url_new_api (const char *url, int proxy, guint expected,
+                 gboolean sync, gboolean close)
+{
+       SoupSession *session;
+       SoupURI *proxy_uri;
+       SoupMessage *msg;
+       SoupRequester *requester;
+       SoupRequest *request;
+       GInputStream *stream;
+
+       if (!tls_available && g_str_has_prefix (url, "https:"))
+               return;
+
+       debug_printf (1, "  GET (requester API) %s via %s%s\n", url, proxy_names[proxy],
+                     close ? " (with Connection: close)" : "");
+       if (proxy == UNAUTH_PROXY && expected != SOUP_STATUS_FORBIDDEN)
+               expected = SOUP_STATUS_PROXY_UNAUTHORIZED;
+
+       /* We create a new session for each request to ensure that
+        * connections/auth aren't cached between tests.
+        */
+       proxy_uri = soup_uri_new (proxies[proxy]);
+       session = soup_test_session_new (sync ? SOUP_TYPE_SESSION_SYNC : SOUP_TYPE_SESSION_ASYNC,
+                                        SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_REQUESTER,
+                                        SOUP_SESSION_USE_THREAD_CONTEXT, TRUE,
+                                        SOUP_SESSION_PROXY_URI, proxy_uri,
+                                        NULL);
+       soup_uri_free (proxy_uri);
+
+       g_signal_connect (session, "authenticate",
+                         G_CALLBACK (authenticate), NULL);
+       if (close) {
+               g_signal_connect (session, "request-started",
+                                 G_CALLBACK (set_close_on_connect), NULL);
+       }
+
+       requester = (SoupRequester *)soup_session_get_feature (session, SOUP_TYPE_REQUESTER);
+       request = soup_requester_request (requester, url, NULL);
+       msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (request));
+
+       if (sync) {
+               GError *error = NULL;
+
+               stream = soup_request_send (request, NULL, &error);
+               if (!stream) {
+                       debug_printf (1, "  Unexpected error on Request: %s\n",
+                                     error->message);
+                       errors++;
+                       g_error_free (error);
+               }
+       } else {
+               loop = g_main_loop_new (NULL, TRUE);
+               soup_request_send_async (request, NULL, request_completed, &stream);
+               g_main_loop_run (loop);
+               g_main_loop_unref (loop);
+       }
+
+       if (stream)
+               g_input_stream_close (stream, NULL, NULL);
+
+       debug_printf (1, "  %d %s\n", msg->status_code, msg->reason_phrase);
+       if (msg->status_code != expected) {
+               debug_printf (1, "  EXPECTED %d!\n", expected);
+               errors++;
+       }
+
+       g_object_unref (msg);
+       g_object_unref (request);
+
+       soup_test_session_abort_unref (session);
+}
+
 static void
 run_test (int i, gboolean sync)
 {
@@ -146,13 +246,23 @@ run_test (int i, gboolean sync)
                http_url = g_strconcat (HTTP_SERVER, tests[i].url, NULL);
                https_url = g_strconcat (HTTPS_SERVER, tests[i].url, NULL);
        }
+
        test_url (http_url, SIMPLE_PROXY, tests[i].final_status, sync, FALSE);
+       test_url_new_api (http_url, SIMPLE_PROXY, tests[i].final_status, sync, FALSE);
        test_url (https_url, SIMPLE_PROXY, tests[i].final_status, sync, FALSE);
+       test_url_new_api (https_url, SIMPLE_PROXY, tests[i].final_status, sync, FALSE);
+
        test_url (http_url, AUTH_PROXY, tests[i].final_status, sync, FALSE);
+       test_url_new_api (http_url, AUTH_PROXY, tests[i].final_status, sync, FALSE);
        test_url (https_url, AUTH_PROXY, tests[i].final_status, sync, FALSE);
+       test_url_new_api (https_url, AUTH_PROXY, tests[i].final_status, sync, FALSE);
        test_url (https_url, AUTH_PROXY, tests[i].final_status, sync, TRUE);
+       test_url_new_api (https_url, AUTH_PROXY, tests[i].final_status, sync, TRUE);
+
        test_url (http_url, UNAUTH_PROXY, tests[i].final_status, sync, FALSE);
+       test_url_new_api (http_url, UNAUTH_PROXY, tests[i].final_status, sync, FALSE);
        test_url (https_url, UNAUTH_PROXY, tests[i].final_status, sync, FALSE);
+       test_url_new_api (https_url, UNAUTH_PROXY, tests[i].final_status, sync, FALSE);
 
        g_free (http_url);
        g_free (https_url);