static void got_connection (SoupConnection *conn, guint status, gpointer session) { SoupAddress *tunnel_addr; if (status != SOUP_STATUS_OK) { /* There may have been messages waiting for the * connection count to go down, so queue a run_queue. */ do_idle_run_queue (session); soup_session_connection_failed (session, conn, status); /* session may be destroyed at this point */ return; } tunnel_addr = soup_connection_get_tunnel_addr (conn); if (tunnel_addr) { SoupSessionAsyncTunnelData *data; data = g_slice_new (SoupSessionAsyncTunnelData); data->session = session; data->conn = conn; data->item = soup_session_make_connect_message (session, tunnel_addr); g_signal_emit_by_name (session, "tunneling", conn); g_signal_connect (data->item->msg, "finished", G_CALLBACK (tunnel_connected), data); g_signal_connect (data->item->msg, "restarted", G_CALLBACK (tunnel_connected), data); soup_session_send_queue_item (session, data->item, conn); return; } g_signal_connect (conn, "disconnected", G_CALLBACK (connection_closed), session); /* @conn has been marked reserved by SoupSession, but * we don't actually have any specific message in mind * for it. (In particular, the message we were * originally planning to queue on it may have already * been queued on some other connection that became * available while we were waiting for this one to * connect.) So we release the connection into the * idle pool and then just run the queue and see what * happens. */ soup_connection_set_state (conn, SOUP_CONNECTION_IDLE); do_idle_run_queue (session); }
static void got_connection (SoupConnection *conn, guint status, gpointer user_data) { SoupMessageQueueItem *item = user_data; SoupSession *session = item->session; SoupAddress *tunnel_addr; if (item->state != SOUP_MESSAGE_CONNECTING) { soup_connection_disconnect (conn); do_idle_run_queue (session); soup_message_queue_item_unref (item); g_object_unref (session); return; } if (status != SOUP_STATUS_OK) { soup_session_set_item_status (session, item, status); item->state = SOUP_MESSAGE_FINISHING; soup_connection_disconnect (conn); do_idle_run_queue (session); soup_message_queue_item_unref (item); g_object_unref (session); return; } tunnel_addr = soup_connection_get_tunnel_addr (conn); if (tunnel_addr) { SoupMessageQueueItem *tunnel_item; item->state = SOUP_MESSAGE_TUNNELING; tunnel_item = soup_session_make_connect_message (session, conn); tunnel_item->related = item; soup_session_send_queue_item (session, tunnel_item, tunnel_message_completed); return; } item->state = SOUP_MESSAGE_READY; g_signal_connect (conn, "disconnected", G_CALLBACK (connection_closed), session); run_queue ((SoupSessionAsync *)session); soup_message_queue_item_unref (item); g_object_unref (session); }