10 #include "libsoup/soup.h"
11 #include "test-utils.h"
14 const char *explanation;
16 const guint final_status;
19 static SoupProxyTest tests[] = {
20 { "GET -> 200", "", SOUP_STATUS_OK },
21 { "GET -> 404", "/not-found", SOUP_STATUS_NOT_FOUND },
22 { "GET -> 401 -> 200", "/Basic/realm1/", SOUP_STATUS_OK },
23 { "GET -> 401 -> 401", "/Basic/realm2/", SOUP_STATUS_UNAUTHORIZED },
24 { "GET -> 403", "http://no-such-hostname.xx/", SOUP_STATUS_FORBIDDEN },
26 static int ntests = sizeof (tests) / sizeof (tests[0]);
28 #define HTTP_SERVER "http://127.0.0.1:47524"
29 #define HTTPS_SERVER "https://127.0.0.1:47525"
36 static const char *proxies[] = {
37 "http://127.0.0.1:47526",
38 "http://127.0.0.1:47527",
39 "http://127.0.0.1:47528"
41 static const char *proxy_names[] = {
43 "authenticated proxy",
44 "unauthenticatable-to proxy"
48 authenticate (SoupSession *session, SoupMessage *msg,
49 SoupAuth *auth, gboolean retrying, gpointer data)
51 if (msg->status_code == SOUP_STATUS_UNAUTHORIZED) {
52 if (soup_auth_is_for_proxy (auth)) {
53 debug_printf (1, " got proxy auth object for 401!\n");
56 } else if (msg->status_code == SOUP_STATUS_PROXY_UNAUTHORIZED) {
57 if (!soup_auth_is_for_proxy (auth)) {
58 debug_printf (1, " got regular auth object for 407!\n");
62 debug_printf (1, " got authenticate signal with status %d\n",
68 soup_auth_authenticate (auth, "user1", "realm1");
72 set_close_on_connect (SoupSession *session, SoupMessage *msg,
73 SoupSocket *sock, gpointer user_data)
75 /* This is used to test that we can handle the server closing
76 * the connection when returning a 407 in response to a
79 if (msg->method == SOUP_METHOD_CONNECT) {
80 soup_message_headers_append (msg->request_headers,
81 "Connection", "close");
86 test_url (const char *url, int proxy, guint expected,
87 gboolean sync, gboolean close)
93 if (!tls_available && g_str_has_prefix (url, "https:"))
96 debug_printf (1, " GET %s via %s%s\n", url, proxy_names[proxy],
97 close ? " (with Connection: close)" : "");
98 if (proxy == UNAUTH_PROXY && expected != SOUP_STATUS_FORBIDDEN)
99 expected = SOUP_STATUS_PROXY_UNAUTHORIZED;
101 /* We create a new session for each request to ensure that
102 * connections/auth aren't cached between tests.
104 proxy_uri = soup_uri_new (proxies[proxy]);
105 session = soup_test_session_new (sync ? SOUP_TYPE_SESSION_SYNC : SOUP_TYPE_SESSION_ASYNC,
106 SOUP_SESSION_PROXY_URI, proxy_uri,
108 soup_uri_free (proxy_uri);
109 g_signal_connect (session, "authenticate",
110 G_CALLBACK (authenticate), NULL);
112 g_signal_connect (session, "request-started",
113 G_CALLBACK (set_close_on_connect), NULL);
116 msg = soup_message_new (SOUP_METHOD_GET, url);
118 fprintf (stderr, "proxy-test: Could not parse URI\n");
122 soup_session_send_message (session, msg);
124 debug_printf (1, " %d %s\n", msg->status_code, msg->reason_phrase);
125 if (msg->status_code != expected) {
126 debug_printf (1, " EXPECTED %d!\n", expected);
130 g_object_unref (msg);
131 soup_test_session_abort_unref (session);
135 run_test (int i, gboolean sync)
137 char *http_url, *https_url;
139 debug_printf (1, "Test %d: %s (%s)\n", i + 1, tests[i].explanation,
140 sync ? "sync" : "async");
142 if (!strncmp (tests[i].url, "http", 4)) {
143 http_url = g_strdup (tests[i].url);
144 https_url = g_strdup_printf ("https%s", tests[i].url + 4);
146 http_url = g_strconcat (HTTP_SERVER, tests[i].url, NULL);
147 https_url = g_strconcat (HTTPS_SERVER, tests[i].url, NULL);
149 test_url (http_url, SIMPLE_PROXY, tests[i].final_status, sync, FALSE);
150 test_url (https_url, SIMPLE_PROXY, tests[i].final_status, sync, FALSE);
151 test_url (http_url, AUTH_PROXY, tests[i].final_status, sync, FALSE);
152 test_url (https_url, AUTH_PROXY, tests[i].final_status, sync, FALSE);
153 test_url (https_url, AUTH_PROXY, tests[i].final_status, sync, TRUE);
154 test_url (http_url, UNAUTH_PROXY, tests[i].final_status, sync, FALSE);
155 test_url (https_url, UNAUTH_PROXY, tests[i].final_status, sync, FALSE);
160 debug_printf (1, "\n");
164 server_callback (SoupServer *server, SoupMessage *msg,
165 const char *path, GHashTable *query,
166 SoupClientContext *context, gpointer data)
168 SoupURI *uri = soup_message_get_uri (msg);
170 soup_message_set_status (msg, uri->fragment ? SOUP_STATUS_BAD_REQUEST : SOUP_STATUS_OK);
174 do_proxy_fragment_test (SoupURI *base_uri)
176 SoupSession *session;
177 SoupURI *proxy_uri, *req_uri;
180 debug_printf (1, "\nTesting request with fragment via proxy\n");
182 proxy_uri = soup_uri_new (proxies[SIMPLE_PROXY]);
183 session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC,
184 SOUP_SESSION_PROXY_URI, proxy_uri,
186 soup_uri_free (proxy_uri);
188 req_uri = soup_uri_new_with_base (base_uri, "/#foo");
189 msg = soup_message_new_from_uri (SOUP_METHOD_GET, req_uri);
190 soup_uri_free (req_uri);
191 soup_session_send_message (session, msg);
193 if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
194 debug_printf (1, " unexpected status %d %s!\n",
195 msg->status_code, msg->reason_phrase);
199 g_object_unref (msg);
200 soup_test_session_abort_unref (session);
204 do_proxy_redirect_test (void)
206 SoupSession *session;
207 SoupURI *proxy_uri, *req_uri, *new_uri;
210 debug_printf (1, "\nTesting redirection through proxy\n");
212 proxy_uri = soup_uri_new (proxies[SIMPLE_PROXY]);
213 session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC,
214 SOUP_SESSION_PROXY_URI, proxy_uri,
216 soup_uri_free (proxy_uri);
218 req_uri = soup_uri_new (HTTPS_SERVER);
219 soup_uri_set_path (req_uri, "/redirected");
220 msg = soup_message_new_from_uri (SOUP_METHOD_GET, req_uri);
221 soup_message_headers_append (msg->request_headers,
222 "Connection", "close");
223 soup_session_send_message (session, msg);
225 new_uri = soup_message_get_uri (msg);
226 if (!strcmp (req_uri->path, new_uri->path)) {
227 debug_printf (1, " message was not redirected!\n");
230 soup_uri_free (req_uri);
232 if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
233 debug_printf (1, " unexpected status %d %s!\n",
234 msg->status_code, msg->reason_phrase);
238 g_object_unref (msg);
239 soup_test_session_abort_unref (session);
243 main (int argc, char **argv)
249 test_init (argc, argv, NULL);
252 for (i = 0; i < ntests; i++) {
257 server = soup_test_server_new (TRUE);
258 soup_server_add_handler (server, NULL, server_callback, NULL, NULL);
259 base_uri = soup_uri_new ("http://127.0.0.1/");
260 soup_uri_set_port (base_uri, soup_server_get_port (server));
262 do_proxy_fragment_test (base_uri);
263 do_proxy_redirect_test ();
265 soup_uri_free (base_uri);
266 soup_test_server_quit_unref (server);