}
g_object_unref (msg);
- stream = soup_test_request_send (SOUP_REQUEST (req), NULL, &error);
+ stream = soup_test_request_send (SOUP_REQUEST (req), NULL, 0, &error);
if (!stream) {
debug_printf (1, " could not send request: %s\n",
error->message);
data = g_byte_array_new ();
- stream = soup_test_request_send (SOUP_REQUEST (reqh), NULL, &error);
+ stream = soup_test_request_send (SOUP_REQUEST (reqh), NULL, 0, &error);
if (error) {
debug_printf (1, " Error sending request: %s\n",
error->message);
req = soup_session_request_uri (session, timeout_uri, NULL);
soup_uri_free (timeout_uri);
- stream = soup_test_request_send (req, NULL, &error);
+ stream = soup_test_request_send (req, NULL, 0, &error);
if (!stream) {
debug_printf (1, " Unexpected error on send: %s\n",
error->message);
debug_printf (1, " Second request\n");
req = soup_session_request_uri (session, base_uri, NULL);
- stream = soup_test_request_send (req, NULL, &error);
+ stream = soup_test_request_send (req, NULL, 0, &error);
if (!stream) {
debug_printf (1, " Unexpected error on send: %s\n",
error->message);
soup_test_session_abort_unref (session);
}
-static gboolean
-cancel_request_timeout (gpointer cancellable)
-{
- g_cancellable_cancel (cancellable);
- return FALSE;
-}
-
-static gpointer
-cancel_request_thread (gpointer cancellable)
-{
- g_usleep (100000); /* .1s */
- g_cancellable_cancel (cancellable);
- g_object_unref (cancellable);
- return NULL;
-}
-
static void
-do_cancel_while_reading_req_test_for_session (SoupSession *session)
+do_cancel_while_reading_req_test_for_session (SoupSession *session,
+ guint flags)
{
SoupRequest *req;
SoupURI *uri;
soup_uri_free (uri);
cancellable = g_cancellable_new ();
-
- if (SOUP_IS_SESSION_ASYNC (soup_request_get_session (req))) {
- g_timeout_add (100, cancel_request_timeout, cancellable);
- soup_test_request_send (req, cancellable, &error);
- } else {
- GThread *thread;
-
- thread = g_thread_new ("cancel_request_thread", cancel_request_thread, g_object_ref (cancellable));
- soup_test_request_send (req, cancellable, &error);
- g_thread_unref (thread);
- }
-
+ soup_test_request_send (req, cancellable, flags, &error);
if (!error) {
debug_printf (1, " Request succeeded?\n");
errors++;
do_cancel_while_reading_req_test (void)
{
SoupSession *session;
+ guint flags;
+
+ debug_printf (1, "\nCancelling (immediately) message while reading response (request api)\n");
+ flags = SOUP_TEST_REQUEST_CANCEL_CANCELLABLE;
+
+ debug_printf (1, " Async session\n");
+ session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC,
+ SOUP_SESSION_USE_THREAD_CONTEXT, TRUE,
+ NULL);
+ do_cancel_while_reading_req_test_for_session (session, flags);
+ soup_test_session_abort_unref (session);
+
+ debug_printf (1, " Sync session\n");
+ session = soup_test_session_new (SOUP_TYPE_SESSION_SYNC,
+ NULL);
+ do_cancel_while_reading_req_test_for_session (session, flags);
+ soup_test_session_abort_unref (session);
- debug_printf (1, "\nCancelling message while reading response (request api)\n");
+ debug_printf (1, "\nCancelling (after 100ms) message while reading response (request api)\n");
+ flags = SOUP_TEST_REQUEST_CANCEL_CANCELLABLE | SOUP_TEST_REQUEST_CANCEL_SOON;
debug_printf (1, " Async session\n");
session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC,
SOUP_SESSION_USE_THREAD_CONTEXT, TRUE,
NULL);
- do_cancel_while_reading_req_test_for_session (session);
+ do_cancel_while_reading_req_test_for_session (session, flags);
soup_test_session_abort_unref (session);
debug_printf (1, " Sync session\n");
session = soup_test_session_new (SOUP_TYPE_SESSION_SYNC,
NULL);
- do_cancel_while_reading_req_test_for_session (session);
+ do_cancel_while_reading_req_test_for_session (session, flags);
soup_test_session_abort_unref (session);
}
request = soup_session_request (session, url, NULL);
msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (request));
- stream = soup_test_request_send (request, NULL, &error);
+ stream = soup_test_request_send (request, NULL, 0, &error);
if (!stream) {
debug_printf (1, " Unexpected error on Request: %s\n",
error->message);
g_signal_connect (msg, "restarted",
G_CALLBACK (restarted), &treq);
- stream = soup_test_request_send (SOUP_REQUEST (reqh), NULL, &error);
+ stream = soup_test_request_send (SOUP_REQUEST (reqh), NULL, 0, &error);
if (SOUP_STATUS_IS_TRANSPORT_ERROR (final_status)) {
if (stream) {
g_object_unref (msg);
req = soup_session_request_uri (session, uri, NULL);
- stream = soup_test_request_send (req, NULL, &error);
+ stream = soup_test_request_send (req, NULL, 0, &error);
if (stream) {
soup_test_request_close_stream (req, stream, NULL, &error);
g_object_unref (stream);
msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (req));
soup_message_disable_feature (msg, SOUP_TYPE_CONTENT_SNIFFER);
g_object_unref (msg);
- stream = soup_test_request_send (req, NULL, &error);
+ stream = soup_test_request_send (req, NULL, 0, &error);
if (stream) {
soup_test_request_close_stream (req, stream, NULL, &error);
g_object_unref (stream);
gpointer user_data)
{
AsyncAsSyncData *data = user_data;
+ GMainContext *context;
data->result = g_object_ref (result);
+ context = g_main_loop_get_context (data->loop);
+ while (g_main_context_pending (context))
+ g_main_context_iteration (context, FALSE);
g_main_loop_quit (data->loop);
}
+typedef struct {
+ SoupRequest *req;
+ GCancellable *cancellable;
+ SoupTestRequestFlags flags;
+} CancelData;
+
+static CancelData *
+create_cancel_data (SoupRequest *req,
+ GCancellable *cancellable,
+ SoupTestRequestFlags flags)
+{
+ CancelData *cancel_data;
+
+ if (!flags)
+ return NULL;
+
+ cancel_data = g_slice_new0 (CancelData);
+ cancel_data->flags = flags;
+ if (flags & SOUP_TEST_REQUEST_CANCEL_MESSAGE && SOUP_IS_REQUEST_HTTP (req))
+ cancel_data->req = g_object_ref (req);
+ else if (flags & SOUP_TEST_REQUEST_CANCEL_CANCELLABLE)
+ cancel_data->cancellable = g_object_ref (cancellable);
+ return cancel_data;
+}
+
+static void inline
+cancel_message_or_cancellable (CancelData *cancel_data)
+{
+ if (cancel_data->flags & SOUP_TEST_REQUEST_CANCEL_MESSAGE) {
+ SoupRequest *req = cancel_data->req;
+ soup_session_cancel_message (soup_request_get_session (req),
+ soup_request_http_get_message (SOUP_REQUEST_HTTP (req)),
+ SOUP_STATUS_CANCELLED);
+ g_object_unref (req);
+ } else if (cancel_data->flags & SOUP_TEST_REQUEST_CANCEL_CANCELLABLE) {
+ g_cancellable_cancel (cancel_data->cancellable);
+ g_object_unref (cancel_data->cancellable);
+ }
+ g_slice_free (CancelData, cancel_data);
+}
+
+static gboolean
+cancel_request_timeout (gpointer data)
+{
+ cancel_message_or_cancellable ((CancelData *) data);
+ return FALSE;
+}
+
+static gpointer
+cancel_request_thread (gpointer data)
+{
+ g_usleep (100000); /* .1s */
+ cancel_message_or_cancellable ((CancelData *) data);
+ return NULL;
+}
+
GInputStream *
soup_test_request_send (SoupRequest *req,
GCancellable *cancellable,
+ guint flags,
GError **error)
{
AsyncAsSyncData data;
GInputStream *stream;
+ CancelData *cancel_data = create_cancel_data (req, cancellable, flags);
- if (SOUP_IS_SESSION_SYNC (soup_request_get_session (req)))
- return soup_request_send (req, cancellable, error);
+ if (SOUP_IS_SESSION_SYNC (soup_request_get_session (req))) {
+ GThread *thread;
- data.loop = g_main_loop_new (g_main_context_get_thread_default (), FALSE);
+ if (cancel_data)
+ thread = g_thread_new ("cancel_request_thread", cancel_request_thread,
+ cancel_data);
+ stream = soup_request_send (req, cancellable, error);
+ if (cancel_data)
+ g_thread_unref (thread);
+ return stream;
+ }
+ data.loop = g_main_loop_new (g_main_context_get_thread_default (), FALSE);
+ if (cancel_data) {
+ guint interval = flags & SOUP_TEST_REQUEST_CANCEL_SOON ? 100 : 0;
+ g_timeout_add_full (G_PRIORITY_HIGH, interval, cancel_request_timeout, cancel_data, NULL);
+ }
soup_request_send_async (req, cancellable, async_as_sync_callback, &data);
g_main_loop_run (data.loop);
void apache_cleanup (void);
#endif
+typedef enum {
+ SOUP_TEST_REQUEST_NONE = 0,
+ SOUP_TEST_REQUEST_CANCEL_MESSAGE = (1 << 0),
+ SOUP_TEST_REQUEST_CANCEL_CANCELLABLE = (1 << 1),
+ SOUP_TEST_REQUEST_CANCEL_SOON = (1 << 2)
+} SoupTestRequestFlags;
+
SoupSession *soup_test_session_new (GType type, ...);
void soup_test_session_abort_unref (SoupSession *session);
SoupServer *soup_test_server_new_ssl (gboolean in_own_thread);
void soup_test_server_quit_unref (SoupServer *server);
-GInputStream *soup_test_request_send (SoupRequest *req,
- GCancellable *cancellable,
+GInputStream *soup_test_request_send (SoupRequest *req,
+ GCancellable *cancellable,
+ guint flags,
GError **error);
gboolean soup_test_request_close_stream (SoupRequest *req,
GInputStream *stream,
g_signal_connect (msg, "finished",
G_CALLBACK (message_finished), &finished);
- stream = soup_test_request_send (req, NULL, &error);
+ stream = soup_test_request_send (req, NULL, 0, &error);
if (expect_timeout && !error) {
debug_printf (1, " FAILED: request did not time out\n");