}
static void
-disconnect_internal (SoupSocket *sock)
+disconnect_internal (SoupSocket *sock, gboolean close)
{
SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
if (priv->gsock) {
- g_socket_close (priv->gsock, NULL);
+ if (close)
+ g_socket_close (priv->gsock, NULL);
g_object_unref (priv->gsock);
priv->gsock = NULL;
}
if (priv->conn) {
if (priv->clean_dispose)
g_warning ("Disposing socket %p while still connected", object);
- disconnect_internal (SOUP_SOCKET (object));
+ disconnect_internal (SOUP_SOCKET (object), TRUE);
}
if (priv->local_addr)
{
SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
- g_object_unref (priv->connect_cancel);
- priv->connect_cancel = NULL;
+ if (priv->connect_cancel) {
+ GCancellable *cancellable = priv->connect_cancel;
+
+ g_object_unref (priv->connect_cancel);
+ priv->connect_cancel = NULL;
+ if (g_cancellable_is_cancelled (cancellable))
+ return SOUP_STATUS_CANCELLED;
+ }
if (error) {
if (error->domain == G_RESOLVER_ERROR) {
cant_listen:
if (priv->conn)
- disconnect_internal (sock);
+ disconnect_internal (sock, TRUE);
g_object_unref (addr);
return FALSE;
if (G_IS_TLS_CONNECTION (priv->conn))
return TRUE;
+ if (g_cancellable_is_cancelled (cancellable))
+ return FALSE;
+
priv->ssl = TRUE;
if (!priv->is_server) {
if (priv->async_context && !priv->use_thread_context)
g_main_context_pop_thread_default (priv->async_context);
- if (g_tls_connection_handshake_finish (G_TLS_CONNECTION (priv->conn),
+ if (g_tls_connection_handshake_finish (G_TLS_CONNECTION (source),
result, &error))
status = SOUP_STATUS_OK;
else if (!priv->ssl_fallback &&
priv = SOUP_SOCKET_GET_PRIVATE (sock);
if (priv->connect_cancel) {
+ disconnect_internal (sock, FALSE);
g_cancellable_cancel (priv->connect_cancel);
return;
} else if (g_mutex_trylock (&priv->iolock)) {
if (priv->conn)
- disconnect_internal (sock);
+ disconnect_internal (sock, TRUE);
else
already_disconnected = TRUE;
g_mutex_unlock (&priv->iolock);