1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * Copyright 2007-2012 Red Hat, Inc.
8 #include <libsoup/soup.h>
10 #include "test-utils.h"
12 SoupServer *server, *ssl_server;
13 SoupURI *base_uri, *ssl_base_uri;
16 auth_callback (SoupAuthDomain *auth_domain, SoupMessage *msg,
17 const char *username, const char *password, gpointer data)
19 return !strcmp (username, "user") && !strcmp (password, "password");
23 timeout_finish_message (gpointer msg)
25 SoupServer *server = g_object_get_data (G_OBJECT (msg), "server");
27 soup_server_unpause_message (server, msg);
32 server_callback (SoupServer *server, SoupMessage *msg,
33 const char *path, GHashTable *query,
34 SoupClientContext *context, gpointer data)
36 SoupURI *uri = soup_message_get_uri (msg);
37 const char *server_protocol = data;
39 soup_message_headers_append (msg->response_headers,
40 "X-Handled-By", "server_callback");
42 if (!strcmp (path, "*")) {
43 debug_printf (1, " default server_callback got request for '*'!\n");
45 soup_message_set_status (msg, SOUP_STATUS_INTERNAL_SERVER_ERROR);
49 if (msg->method != SOUP_METHOD_GET && msg->method != SOUP_METHOD_POST) {
50 soup_message_set_status (msg, SOUP_STATUS_NOT_IMPLEMENTED);
54 if (!strcmp (path, "/redirect")) {
55 soup_message_set_redirect (msg, SOUP_STATUS_FOUND, "/");
59 if (!strcmp (path, "/alias-redirect")) {
60 SoupURI *redirect_uri;
61 char *redirect_string;
62 const char *redirect_protocol;
64 redirect_protocol = soup_message_headers_get_one (msg->request_headers, "X-Redirect-Protocol");
66 redirect_uri = soup_uri_copy (uri);
67 soup_uri_set_scheme (redirect_uri, "foo");
68 if (!g_strcmp0 (redirect_protocol, "https"))
69 soup_uri_set_port (redirect_uri, ssl_base_uri->port);
71 soup_uri_set_port (redirect_uri, base_uri->port);
72 soup_uri_set_path (redirect_uri, "/alias-redirected");
73 redirect_string = soup_uri_to_string (redirect_uri, FALSE);
75 soup_message_set_redirect (msg, SOUP_STATUS_FOUND, redirect_string);
76 g_free (redirect_string);
77 soup_uri_free (redirect_uri);
79 } else if (!strcmp (path, "/alias-redirected")) {
80 soup_message_set_status (msg, SOUP_STATUS_OK);
81 soup_message_headers_append (msg->response_headers,
82 "X-Redirected-Protocol",
87 if (!strcmp (path, "/slow")) {
88 soup_server_pause_message (server, msg);
89 g_object_set_data (G_OBJECT (msg), "server", server);
90 soup_add_timeout (soup_server_get_async_context (server),
91 1000, timeout_finish_message, msg);
94 soup_message_set_status (msg, SOUP_STATUS_OK);
95 if (!strcmp (uri->host, "foo")) {
96 soup_message_set_response (msg, "text/plain",
97 SOUP_MEMORY_STATIC, "foo-index", 9);
100 soup_message_set_response (msg, "text/plain",
101 SOUP_MEMORY_STATIC, "index", 5);
107 server_star_callback (SoupServer *server, SoupMessage *msg,
108 const char *path, GHashTable *query,
109 SoupClientContext *context, gpointer data)
111 soup_message_headers_append (msg->response_headers,
112 "X-Handled-By", "star_callback");
114 if (strcmp (path, "*") != 0) {
115 debug_printf (1, " server_star_callback got request for '%s'!\n", path);
117 soup_message_set_status (msg, SOUP_STATUS_INTERNAL_SERVER_ERROR);
121 if (msg->method != SOUP_METHOD_OPTIONS) {
122 soup_message_set_status (msg, SOUP_STATUS_METHOD_NOT_ALLOWED);
126 soup_message_set_status (msg, SOUP_STATUS_OK);
129 /* Host header handling: client must be able to override the default
130 * value, server must be able to recognize different Host values.
136 SoupSession *session;
137 SoupMessage *one, *two;
139 debug_printf (1, "Host handling\n");
141 session = soup_test_session_new (SOUP_TYPE_SESSION_SYNC, NULL);
143 one = soup_message_new_from_uri ("GET", base_uri);
144 two = soup_message_new_from_uri ("GET", base_uri);
145 soup_message_headers_replace (two->request_headers, "Host", "foo");
147 soup_session_send_message (session, one);
148 soup_session_send_message (session, two);
150 soup_test_session_abort_unref (session);
152 if (!SOUP_STATUS_IS_SUCCESSFUL (one->status_code)) {
153 debug_printf (1, " Message 1 failed: %d %s\n",
154 one->status_code, one->reason_phrase);
156 } else if (strcmp (one->response_body->data, "index") != 0) {
157 debug_printf (1, " Unexpected response to message 1: '%s'\n",
158 one->response_body->data);
161 g_object_unref (one);
163 if (!SOUP_STATUS_IS_SUCCESSFUL (two->status_code)) {
164 debug_printf (1, " Message 2 failed: %d %s\n",
165 two->status_code, two->reason_phrase);
167 } else if (strcmp (two->response_body->data, "foo-index") != 0) {
168 debug_printf (1, " Unexpected response to message 2: '%s'\n",
169 two->response_body->data);
172 g_object_unref (two);
175 /* Dropping the application's ref on the session from a callback
176 * should not cause the session to be freed at an incorrect time.
177 * (This test will crash if it fails.) #533473
180 cu_one_completed (SoupSession *session, SoupMessage *msg, gpointer loop)
182 debug_printf (2, " Message 1 completed\n");
183 if (msg->status_code != SOUP_STATUS_CANT_CONNECT) {
184 debug_printf (1, " Unexpected status on Message 1: %d %s\n",
185 msg->status_code, msg->reason_phrase);
188 g_object_unref (session);
192 cu_idle_quit (gpointer loop)
194 g_main_loop_quit (loop);
199 cu_two_completed (SoupSession *session, SoupMessage *msg, gpointer loop)
201 debug_printf (2, " Message 2 completed\n");
202 if (msg->status_code != SOUP_STATUS_CANT_CONNECT) {
203 debug_printf (1, " Unexpected status on Message 2: %d %s\n",
204 msg->status_code, msg->reason_phrase);
207 g_idle_add (cu_idle_quit, loop);
211 do_callback_unref_test (void)
213 SoupServer *bad_server;
215 SoupSession *session;
216 SoupMessage *one, *two;
220 debug_printf (1, "\nCallback unref handling\n");
222 /* Get a guaranteed-bad URI */
223 addr = soup_address_new ("127.0.0.1", SOUP_ADDRESS_ANY_PORT);
224 soup_address_resolve_sync (addr, NULL);
225 bad_server = soup_server_new (SOUP_SERVER_INTERFACE, addr,
227 g_object_unref (addr);
229 bad_uri = g_strdup_printf ("http://127.0.0.1:%u/",
230 soup_server_get_port (bad_server));
231 g_object_unref (bad_server);
233 session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, NULL);
234 g_object_add_weak_pointer (G_OBJECT (session), (gpointer *)&session);
236 loop = g_main_loop_new (NULL, TRUE);
238 one = soup_message_new ("GET", bad_uri);
239 g_object_add_weak_pointer (G_OBJECT (one), (gpointer *)&one);
240 two = soup_message_new ("GET", bad_uri);
241 g_object_add_weak_pointer (G_OBJECT (two), (gpointer *)&two);
244 soup_session_queue_message (session, one, cu_one_completed, loop);
245 soup_session_queue_message (session, two, cu_two_completed, loop);
247 g_main_loop_run (loop);
248 g_main_loop_unref (loop);
251 g_object_remove_weak_pointer (G_OBJECT (session), (gpointer *)&session);
252 debug_printf (1, " Session not destroyed?\n");
254 g_object_unref (session);
257 g_object_remove_weak_pointer (G_OBJECT (one), (gpointer *)&one);
258 debug_printf (1, " Message 1 not destroyed?\n");
260 g_object_unref (one);
263 g_object_remove_weak_pointer (G_OBJECT (two), (gpointer *)&two);
264 debug_printf (1, " Message 2 not destroyed?\n");
266 g_object_unref (two);
269 /* Otherwise, if we haven't crashed, we're ok. */
272 /* SoupSession should clean up all signal handlers on a message after
273 * it is finished, allowing the message to be reused if desired.
277 ensure_no_signal_handlers (SoupMessage *msg, guint *signal_ids, guint n_signal_ids)
281 for (i = 0; i < n_signal_ids; i++) {
282 if (g_signal_handler_find (msg, G_SIGNAL_MATCH_ID, signal_ids[i],
283 0, NULL, NULL, NULL)) {
284 debug_printf (1, " Message has handler for '%s'\n",
285 g_signal_name (signal_ids[i]));
292 reuse_test_authenticate (SoupSession *session, SoupMessage *msg,
293 SoupAuth *auth, gboolean retrying)
295 /* Get it wrong the first time, then succeed */
297 soup_auth_authenticate (auth, "user", "wrong password");
299 soup_auth_authenticate (auth, "user", "password");
303 do_msg_reuse_test (void)
305 SoupSession *session;
308 guint *signal_ids, n_signal_ids;
310 debug_printf (1, "\nSoupMessage reuse\n");
312 signal_ids = g_signal_list_ids (SOUP_TYPE_MESSAGE, &n_signal_ids);
314 session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, NULL);
315 g_signal_connect (session, "authenticate",
316 G_CALLBACK (reuse_test_authenticate), NULL);
318 debug_printf (1, " First message\n");
319 msg = soup_message_new_from_uri ("GET", base_uri);
320 soup_session_send_message (session, msg);
321 ensure_no_signal_handlers (msg, signal_ids, n_signal_ids);
323 debug_printf (1, " Redirect message\n");
324 uri = soup_uri_new_with_base (base_uri, "/redirect");
325 soup_message_set_uri (msg, uri);
327 soup_session_send_message (session, msg);
328 if (!soup_uri_equal (soup_message_get_uri (msg), base_uri)) {
329 debug_printf (1, " Message did not get redirected!\n");
332 ensure_no_signal_handlers (msg, signal_ids, n_signal_ids);
334 debug_printf (1, " Auth message\n");
335 uri = soup_uri_new_with_base (base_uri, "/auth");
336 soup_message_set_uri (msg, uri);
338 soup_session_send_message (session, msg);
339 if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
340 debug_printf (1, " Message did not get authenticated!\n");
343 ensure_no_signal_handlers (msg, signal_ids, n_signal_ids);
345 /* One last try to make sure the auth stuff got cleaned up */
346 debug_printf (1, " Last message\n");
347 soup_message_set_uri (msg, base_uri);
348 soup_session_send_message (session, msg);
349 ensure_no_signal_handlers (msg, signal_ids, n_signal_ids);
351 soup_test_session_abort_unref (session);
352 g_object_unref (msg);
356 /* Server handlers for "*" work but are separate from handlers for
357 * all other URIs. #590751
362 SoupSession *session;
365 const char *handled_by;
367 debug_printf (1, "\nOPTIONS *\n");
369 session = soup_test_session_new (SOUP_TYPE_SESSION_SYNC, NULL);
370 star_uri = soup_uri_copy (base_uri);
371 soup_uri_set_path (star_uri, "*");
373 debug_printf (1, " Testing with no handler\n");
374 msg = soup_message_new_from_uri ("OPTIONS", star_uri);
375 soup_session_send_message (session, msg);
377 if (msg->status_code != SOUP_STATUS_NOT_FOUND) {
378 debug_printf (1, " Unexpected response: %d %s\n",
379 msg->status_code, msg->reason_phrase);
382 handled_by = soup_message_headers_get_one (msg->response_headers,
385 /* Should have been rejected by SoupServer directly */
386 debug_printf (1, " Message reached handler '%s'\n",
390 g_object_unref (msg);
392 soup_server_add_handler (server, "*", server_star_callback, NULL, NULL);
394 debug_printf (1, " Testing with handler\n");
395 msg = soup_message_new_from_uri ("OPTIONS", star_uri);
396 soup_session_send_message (session, msg);
398 if (msg->status_code != SOUP_STATUS_OK) {
399 debug_printf (1, " Unexpected response: %d %s\n",
400 msg->status_code, msg->reason_phrase);
403 handled_by = soup_message_headers_get_one (msg->response_headers,
406 debug_printf (1, " Message did not reach handler!\n");
408 } else if (strcmp (handled_by, "star_callback") != 0) {
409 debug_printf (1, " Message reached incorrect handler '%s'\n",
413 g_object_unref (msg);
415 soup_test_session_abort_unref (session);
416 soup_uri_free (star_uri);
419 /* Handle unexpectedly-early aborts. #596074, #618641 */
421 ea_msg_completed_one (SoupSession *session, SoupMessage *msg, gpointer loop)
423 debug_printf (2, " Message 1 completed\n");
424 if (msg->status_code != SOUP_STATUS_CANCELLED) {
425 debug_printf (1, " Unexpected status on Message 1: %d %s\n",
426 msg->status_code, msg->reason_phrase);
429 g_main_loop_quit (loop);
433 ea_abort_session (gpointer session)
435 soup_session_abort (session);
440 ea_connection_state_changed (GObject *conn, GParamSpec *pspec, gpointer session)
442 SoupConnectionState state;
444 g_object_get (conn, "state", &state, NULL);
445 if (state == SOUP_CONNECTION_CONNECTING) {
446 g_idle_add_full (G_PRIORITY_HIGH,
449 g_signal_handlers_disconnect_by_func (conn, ea_connection_state_changed, session);
454 ea_connection_created (SoupSession *session, GObject *conn, gpointer user_data)
456 g_signal_connect (conn, "notify::state",
457 G_CALLBACK (ea_connection_state_changed), session);
458 g_signal_handlers_disconnect_by_func (session, ea_connection_created, user_data);
462 ea_request_started (SoupSession *session, SoupMessage *msg, SoupSocket *socket, gpointer user_data)
464 soup_session_cancel_message (session, msg, SOUP_STATUS_CANCELLED);
468 do_early_abort_test (void)
470 SoupSession *session;
472 GMainContext *context;
475 debug_printf (1, "\nAbort with pending connection\n");
477 session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, NULL);
478 msg = soup_message_new_from_uri ("GET", base_uri);
480 context = g_main_context_default ();
481 loop = g_main_loop_new (context, TRUE);
482 soup_session_queue_message (session, msg, ea_msg_completed_one, loop);
483 g_main_context_iteration (context, FALSE);
485 soup_session_abort (session);
486 while (g_main_context_pending (context))
487 g_main_context_iteration (context, FALSE);
488 g_main_loop_unref (loop);
489 soup_test_session_abort_unref (session);
491 session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, NULL);
492 msg = soup_message_new_from_uri ("GET", base_uri);
494 g_signal_connect (session, "connection-created",
495 G_CALLBACK (ea_connection_created), NULL);
496 soup_session_send_message (session, msg);
497 debug_printf (2, " Message 2 completed\n");
499 if (msg->status_code != SOUP_STATUS_CANCELLED) {
500 debug_printf (1, " Unexpected response: %d %s\n",
501 msg->status_code, msg->reason_phrase);
504 g_object_unref (msg);
506 while (g_main_context_pending (context))
507 g_main_context_iteration (context, FALSE);
509 soup_test_session_abort_unref (session);
511 session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, NULL);
512 msg = soup_message_new_from_uri ("GET", base_uri);
514 g_signal_connect (session, "request-started",
515 G_CALLBACK (ea_request_started), NULL);
516 soup_session_send_message (session, msg);
517 debug_printf (2, " Message 3 completed\n");
519 if (msg->status_code != SOUP_STATUS_CANCELLED) {
520 debug_printf (1, " Unexpected response: %d %s\n",
521 msg->status_code, msg->reason_phrase);
524 g_object_unref (msg);
526 while (g_main_context_pending (context))
527 g_main_context_iteration (context, FALSE);
529 soup_test_session_abort_unref (session);
533 do_one_accept_language_test (const char *language, const char *expected_header)
535 SoupSession *session;
539 debug_printf (1, " LANGUAGE=%s\n", language);
540 g_setenv ("LANGUAGE", language, TRUE);
541 session = soup_test_session_new (SOUP_TYPE_SESSION_SYNC,
542 SOUP_SESSION_ACCEPT_LANGUAGE_AUTO, TRUE,
544 msg = soup_message_new_from_uri ("GET", base_uri);
545 soup_session_send_message (session, msg);
546 soup_test_session_abort_unref (session);
548 if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
549 debug_printf (1, " Message failed? %d %s\n",
550 msg->status_code, msg->reason_phrase);
553 val = soup_message_headers_get_list (msg->request_headers,
556 debug_printf (1, " No Accept-Language set!\n");
558 } else if (strcmp (val, expected_header) != 0) {
559 debug_printf (1, " Wrong Accept-Language: expected '%s', got '%s'\n",
560 expected_header, val);
564 g_object_unref (msg);
568 do_accept_language_test (void)
570 const char *orig_language;
572 debug_printf (1, "\nAutomatic Accept-Language processing\n");
574 orig_language = g_getenv ("LANGUAGE");
575 do_one_accept_language_test ("C", "en");
576 do_one_accept_language_test ("fr_FR", "fr-fr, fr;q=0.9");
577 do_one_accept_language_test ("fr_FR:de:en_US", "fr-fr, fr;q=0.9, de;q=0.8, en-us;q=0.7, en;q=0.6");
580 g_setenv ("LANGUAGE", orig_language, TRUE);
582 g_unsetenv ("LANGUAGE");
586 cancel_message_timeout (gpointer msg)
588 SoupSession *session = g_object_get_data (G_OBJECT (msg), "session");
590 soup_session_cancel_message (session, msg, SOUP_STATUS_CANCELLED);
591 g_object_unref (msg);
592 g_object_unref (session);
597 cancel_message_thread (gpointer msg)
599 SoupSession *session = g_object_get_data (G_OBJECT (msg), "session");
601 g_usleep (100000); /* .1s */
602 soup_session_cancel_message (session, msg, SOUP_STATUS_CANCELLED);
603 g_object_unref (msg);
604 g_object_unref (session);
609 do_cancel_while_reading_test_for_session (SoupSession *session)
612 GThread *thread = NULL;
615 uri = soup_uri_new_with_base (base_uri, "/slow");
616 msg = soup_message_new_from_uri ("GET", uri);
619 g_object_set_data (G_OBJECT (msg), "session", session);
621 g_object_ref (session);
622 if (SOUP_IS_SESSION_ASYNC (session))
623 g_timeout_add (100, cancel_message_timeout, msg);
625 thread = g_thread_new ("cancel_message_thread", cancel_message_thread, msg);
627 soup_session_send_message (session, msg);
629 if (msg->status_code != SOUP_STATUS_CANCELLED) {
630 debug_printf (1, " FAILED: %d %s (expected Cancelled)\n",
631 msg->status_code, msg->reason_phrase);
634 g_object_unref (msg);
637 g_thread_join (thread);
641 do_cancel_while_reading_test (void)
643 SoupSession *session;
645 debug_printf (1, "\nCancelling message while reading response\n");
647 debug_printf (1, " Async session\n");
648 session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, NULL);
649 do_cancel_while_reading_test_for_session (session);
650 soup_test_session_abort_unref (session);
652 debug_printf (1, " Sync session\n");
653 session = soup_test_session_new (SOUP_TYPE_SESSION_SYNC, NULL);
654 do_cancel_while_reading_test_for_session (session);
655 soup_test_session_abort_unref (session);
659 do_aliases_test_for_session (SoupSession *session,
660 const char *redirect_protocol)
664 const char *redirected_protocol;
666 uri = soup_uri_new_with_base (base_uri, "/alias-redirect");
667 msg = soup_message_new_from_uri ("GET", uri);
668 if (redirect_protocol)
669 soup_message_headers_append (msg->request_headers, "X-Redirect-Protocol", redirect_protocol);
671 soup_session_send_message (session, msg);
673 redirected_protocol = soup_message_headers_get_one (msg->response_headers, "X-Redirected-Protocol");
675 if (g_strcmp0 (redirect_protocol, redirected_protocol)) {
676 debug_printf (1, " redirect went to %s, should have gone to %s!\n",
677 redirected_protocol ? redirected_protocol : "(none)",
678 redirect_protocol ? redirect_protocol : "(none)");
680 } else if (redirect_protocol && !SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
681 debug_printf (1, " msg failed? (%d %s)\n",
682 msg->status_code, msg->reason_phrase);
684 } else if (!redirect_protocol && SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
685 debug_printf (1, " msg succeeded? (%d %s)\n",
686 msg->status_code, msg->reason_phrase);
690 g_object_unref (msg);
694 do_aliases_test (void)
696 SoupSession *session;
697 char *aliases[] = { "foo", NULL };
699 debug_printf (1, "\nhttp-aliases / https-aliases\n");
701 debug_printf (1, " Default behavior\n");
702 session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, NULL);
703 do_aliases_test_for_session (session, "http");
704 soup_test_session_abort_unref (session);
706 debug_printf (1, " foo-means-https\n");
707 session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC,
708 SOUP_SESSION_HTTPS_ALIASES, aliases,
710 do_aliases_test_for_session (session, "https");
711 soup_test_session_abort_unref (session);
713 debug_printf (1, " foo-means-nothing\n");
714 session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC,
715 SOUP_SESSION_HTTP_ALIASES, NULL,
717 do_aliases_test_for_session (session, NULL);
718 soup_test_session_abort_unref (session);
722 do_dot_dot_test (void)
724 SoupSession *session;
728 debug_printf (1, "\n'..' smuggling test\n");
730 session = soup_test_session_new (SOUP_TYPE_SESSION_SYNC, NULL);
732 uri = soup_uri_new_with_base (base_uri, "/..%2ftest");
733 msg = soup_message_new_from_uri ("GET", uri);
736 soup_session_send_message (session, msg);
738 if (msg->status_code != SOUP_STATUS_BAD_REQUEST) {
739 debug_printf (1, " FAILED: %d %s (expected Bad Request)\n",
740 msg->status_code, msg->reason_phrase);
743 g_object_unref (msg);
745 soup_test_session_abort_unref (session);
751 SoupServer *ipv6_server;
753 SoupAddress *ipv6_addr;
754 SoupSession *session;
757 debug_printf (1, "\nIPv6 server test\n");
759 ipv6_addr = soup_address_new ("::1", SOUP_ADDRESS_ANY_PORT);
760 soup_address_resolve_sync (ipv6_addr, NULL);
761 ipv6_server = soup_server_new (SOUP_SERVER_INTERFACE, ipv6_addr,
763 g_object_unref (ipv6_addr);
764 soup_server_add_handler (ipv6_server, NULL, server_callback, NULL, NULL);
765 soup_server_run_async (ipv6_server);
767 ipv6_uri = soup_uri_new ("http://[::1]/");
768 soup_uri_set_port (ipv6_uri, soup_server_get_port (ipv6_server));
770 session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, NULL);
772 debug_printf (1, " HTTP/1.1\n");
773 msg = soup_message_new_from_uri ("GET", ipv6_uri);
774 soup_session_send_message (session, msg);
775 if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
776 debug_printf (1, " request failed: %d %s\n",
777 msg->status_code, msg->reason_phrase);
780 g_object_unref (msg);
782 debug_printf (1, " HTTP/1.0\n");
783 msg = soup_message_new_from_uri ("GET", ipv6_uri);
784 soup_message_set_http_version (msg, SOUP_HTTP_1_0);
785 soup_session_send_message (session, msg);
786 if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
787 debug_printf (1, " request failed: %d %s\n",
788 msg->status_code, msg->reason_phrase);
791 g_object_unref (msg);
793 soup_uri_free (ipv6_uri);
794 soup_test_session_abort_unref (session);
795 soup_test_server_quit_unref (ipv6_server);
799 do_idle_on_dispose_test (void)
801 SoupSession *session;
803 GMainContext *async_context;
805 debug_printf (1, "\nTesting SoupSessionAsync dispose behavior\n");
807 async_context = g_main_context_new ();
808 session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC,
809 SOUP_SESSION_ASYNC_CONTEXT, async_context,
812 msg = soup_message_new_from_uri ("GET", base_uri);
813 soup_session_send_message (session, msg);
814 g_object_unref (msg);
816 while (g_main_context_iteration (async_context, FALSE))
819 g_object_run_dispose (G_OBJECT (session));
821 if (g_main_context_iteration (async_context, FALSE)) {
822 debug_printf (1, " idle was queued!\n");
826 g_object_unref (session);
827 g_main_context_unref (async_context);
831 do_pause_abort_test (void)
833 SoupSession *session;
837 debug_printf (1, "\nTesting paused messages don't get leaked on abort\n");
839 session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, NULL);
841 msg = soup_message_new_from_uri ("GET", base_uri);
842 soup_session_queue_message (session, msg, NULL, NULL);
843 soup_session_pause_message (session, msg);
845 g_object_add_weak_pointer (G_OBJECT (msg), &ptr);
846 soup_test_session_abort_unref (session);
849 debug_printf (1, " msg was leaked\n");
855 main (int argc, char **argv)
857 SoupAuthDomain *auth_domain;
859 test_init (argc, argv, NULL);
861 server = soup_test_server_new (TRUE);
862 soup_server_add_handler (server, NULL, server_callback, "http", NULL);
863 base_uri = soup_uri_new ("http://127.0.0.1/");
864 soup_uri_set_port (base_uri, soup_server_get_port (server));
866 auth_domain = soup_auth_domain_basic_new (
867 SOUP_AUTH_DOMAIN_REALM, "misc-test",
868 SOUP_AUTH_DOMAIN_ADD_PATH, "/auth",
869 SOUP_AUTH_DOMAIN_BASIC_AUTH_CALLBACK, auth_callback,
871 soup_server_add_auth_domain (server, auth_domain);
872 g_object_unref (auth_domain);
874 ssl_server = soup_test_server_new_ssl (TRUE);
875 soup_server_add_handler (ssl_server, NULL, server_callback, "https", NULL);
876 ssl_base_uri = soup_uri_new ("https://127.0.0.1/");
877 soup_uri_set_port (ssl_base_uri, soup_server_get_port (ssl_server));
880 do_callback_unref_test ();
881 do_msg_reuse_test ();
883 do_early_abort_test ();
884 do_accept_language_test ();
885 do_cancel_while_reading_test ();
889 do_idle_on_dispose_test ();
890 do_pause_abort_test ();
892 soup_uri_free (base_uri);
893 soup_uri_free (ssl_base_uri);
894 soup_test_server_quit_unref (server);
895 soup_test_server_quit_unref (ssl_server);