g_object_freeze_notify (G_OBJECT (conn));
priv->unused_timeout = 0;
-
- if (priv->state == SOUP_CONNECTION_IN_USE) {
- /* We don't use soup_connection_set_state here since
- * it may call clear_current_request()...
- */
- priv->state = SOUP_CONNECTION_IDLE;
- g_object_notify (G_OBJECT (conn), "state");
- }
start_idle_timer (conn);
if (priv->cur_req) {
SoupMessage *cur_req = priv->cur_req;
if (!soup_message_is_keepalive (cur_req))
soup_connection_disconnect (conn);
- else
- soup_message_io_stop (cur_req);
}
g_object_thaw_notify (G_OBJECT (conn));
g_slice_free (SoupConnectionAsyncConnectData, data);
}
-/**
- * soup_connection_connect_async:
- * @conn: the connection
- * @callback: callback to call when the connection succeeds or fails
- * @user_data: data for @callback
- *
- * Asynchronously connects @conn.
- **/
void
soup_connection_connect_async (SoupConnection *conn,
+ GCancellable *cancellable,
SoupConnectionCallback callback,
gpointer user_data)
{
SOUP_SOCKET_TIMEOUT, priv->io_timeout,
"clean-dispose", TRUE,
NULL);
- soup_socket_connect_async (priv->socket, NULL,
+ soup_socket_connect_async (priv->socket, cancellable,
socket_connect_result, data);
}
-/**
- * soup_connection_connect_sync:
- * @conn: the connection
- *
- * Synchronously connects @conn.
- *
- * Return value: the soup status
- **/
guint
-soup_connection_connect_sync (SoupConnection *conn)
+soup_connection_connect_sync (SoupConnection *conn, GCancellable *cancellable)
{
SoupConnectionPrivate *priv;
guint status;
"clean-dispose", TRUE,
NULL);
- status = soup_socket_connect_sync (priv->socket, NULL);
+ status = soup_socket_connect_sync (priv->socket, cancellable);
if (!SOUP_STATUS_IS_SUCCESSFUL (status))
goto fail;
G_CALLBACK (socket_disconnected), conn);
if (priv->ssl_creds && !priv->tunnel_addr) {
- if (!soup_socket_start_ssl (priv->socket, NULL)) {
+ if (!soup_socket_start_ssl (priv->socket, cancellable)) {
status = SOUP_STATUS_SSL_FAILED;
goto fail;
}
soup_connection_disconnect (SoupConnection *conn)
{
SoupConnectionPrivate *priv;
+ SoupConnectionState old_state;
g_return_if_fail (SOUP_IS_CONNECTION (conn));
priv = SOUP_CONNECTION_GET_PRIVATE (conn);
- soup_connection_set_state (conn, SOUP_CONNECTION_DISCONNECTED);
- if (!priv->socket)
- return;
+ old_state = priv->state;
+ if (old_state != SOUP_CONNECTION_DISCONNECTED)
+ soup_connection_set_state (conn, SOUP_CONNECTION_DISCONNECTED);
- g_signal_handlers_disconnect_by_func (priv->socket,
- socket_disconnected, conn);
- soup_socket_disconnect (priv->socket);
- g_object_unref (priv->socket);
- priv->socket = NULL;
+ if (priv->socket) {
+ g_signal_handlers_disconnect_by_func (priv->socket,
+ socket_disconnected, conn);
+ soup_socket_disconnect (priv->socket);
+ g_object_unref (priv->socket);
+ priv->socket = NULL;
+ }
- /* NB: this might cause conn to be destroyed. */
- g_signal_emit (conn, signals[DISCONNECTED], 0);
+ if (old_state != SOUP_CONNECTION_DISCONNECTED)
+ g_signal_emit (conn, signals[DISCONNECTED], 0);
}
SoupSocket *
return SOUP_CONNECTION_GET_PRIVATE (conn)->proxy_uri;
}
+gboolean
+soup_connection_is_via_proxy (SoupConnection *conn)
+{
+ g_return_val_if_fail (SOUP_IS_CONNECTION (conn), FALSE);
+
+ return SOUP_CONNECTION_GET_PRIVATE (conn)->proxy_uri != NULL;
+}
+
SoupConnectionState
soup_connection_get_state (SoupConnection *conn)
{
if (req != priv->cur_req)
set_current_request (conn, req);
- soup_message_send_request (req, priv->socket, conn,
- priv->proxy_uri != NULL);
+ soup_message_send_request (req, conn);
}
#ifndef SOUP_CONNECTION_H
#define SOUP_CONNECTION_H 1
-#include <time.h>
+#include <gio/gio.h>
#include "soup-types.h"
#include "soup-misc.h"
...) G_GNUC_NULL_TERMINATED;
void soup_connection_connect_async (SoupConnection *conn,
+ GCancellable *cancellable,
SoupConnectionCallback callback,
gpointer user_data);
-guint soup_connection_connect_sync (SoupConnection *conn);
+guint soup_connection_connect_sync (SoupConnection *conn,
+ GCancellable *cancellable);
SoupAddress *soup_connection_get_tunnel_addr(SoupConnection *conn);
gboolean soup_connection_start_ssl (SoupConnection *conn);
SoupSocket *soup_connection_get_socket (SoupConnection *conn);
SoupURI *soup_connection_get_proxy_uri (SoupConnection *conn);
+gboolean soup_connection_is_via_proxy (SoupConnection *conn);
SoupConnectionState soup_connection_get_state (SoupConnection *conn);
void soup_connection_set_state (SoupConnection *conn,
#include "soup-message-private.h"
#include "soup-auth.h"
+#include "soup-connection.h"
#include "soup-headers.h"
#include "soup-uri.h"
SoupEncoding *encoding, gpointer user_data)
{
SoupMessagePrivate *priv = SOUP_MESSAGE_GET_PRIVATE (req);
- gboolean proxy = GPOINTER_TO_UINT (user_data);
+ SoupConnection *conn = user_data;
SoupURI *uri = soup_message_get_uri (req);
char *uri_host;
char *uri_string;
/* CONNECT URI is hostname:port for tunnel destination */
uri_string = g_strdup_printf ("%s:%d", uri_host, uri->port);
} else {
+ gboolean proxy = soup_connection_is_via_proxy (conn);
+
/* Proxy expects full URI to destination. Otherwise
* just the path.
*/
}
void
-soup_message_send_request (SoupMessage *req, SoupSocket *sock,
- SoupConnection *conn, gboolean is_via_proxy)
+soup_message_send_request (SoupMessage *msg,
+ SoupConnection *conn)
{
- soup_message_cleanup_response (req);
- soup_message_io_client (req, sock, conn,
+ soup_message_cleanup_response (msg);
+ soup_message_io_client (msg, conn,
get_request_headers,
parse_response_headers,
- GUINT_TO_POINTER (is_via_proxy));
+ conn);
}