From: Daniel Stenberg <daniel@haxx.se>
Date: Fri, 13 Dec 2002 16:15:19 +0000 (+0000)
Subject: conn->bits.tcpconnect now keeps track of if this connection is connected
X-Git-Tag: curl-7_10_3~71
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b528bde470afc6d5a6e3e72f4823428f9ec78a9a;p=curl

conn->bits.tcpconnect now keeps track of if this connection is connected
or not
---

diff --git a/lib/connect.c b/lib/connect.c
index 1a4c193eb..151864fd7 100644
--- a/lib/connect.c
+++ b/lib/connect.c
@@ -380,8 +380,8 @@ CURLcode Curl_is_connected(struct connectdata *conn,
       return CURLE_OPERATION_TIMEOUTED;
     }
   }
-  if(conn->protocol & PROT_FILE) {
-    /* we are connected, awesome! */
+  if(conn->bits.tcpconnect) {
+    /* we are connected already! */
     *connected = TRUE;
     return CURLE_OK;
   }
diff --git a/lib/url.c b/lib/url.c
index 935507674..a639ebaa1 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -1677,6 +1677,12 @@ CURLcode Curl_protocol_connect(struct connectdata *conn,
   struct SessionHandle *data = conn->data;
   CURLcode result=CURLE_OK;
   
+  if(conn->bits.tcpconnect)
+    /* We already are connected, get back. This may happen when the connect
+       worked fine in the first call, like when we connect to a local server
+       or proxy. */
+    return CURLE_OK;
+
   Curl_pgrsTime(data, TIMER_CONNECT); /* connect done */
 
   if(data->set.verbose)
@@ -2299,6 +2305,7 @@ static CURLcode CreateConnection(struct SessionHandle *data,
 
     /* Setup a "faked" transfer that'll do nothing */
     if(CURLE_OK == result) {
+      conn->bits.tcpconnect = TRUE; /* we are "connected */
       result = Curl_Transfer(conn, -1, -1, FALSE, NULL, /* no download */
                              -1, NULL); /* no upload */
     }
@@ -2795,14 +2802,21 @@ static CURLcode CreateConnection(struct SessionHandle *data,
     /* Connect only if not already connected! */
     result = ConnectPlease(conn, hostaddr, &connected);
 
-    if(connected)
+    if(connected) {
       result = Curl_protocol_connect(conn, hostaddr);
+      if(CURLE_OK == result)
+        conn->bits.tcpconnect = TRUE;
+    }
+    else
+      conn->bits.tcpconnect = FALSE;
+
 
     if(CURLE_OK != result)
       return result;
   }
   else {
     Curl_pgrsTime(data, TIMER_CONNECT); /* we're connected already */
+    conn->bits.tcpconnect = TRUE;
     if(data->set.verbose)
       verboseconnect(conn, hostaddr);
   }
diff --git a/lib/urldata.h b/lib/urldata.h
index 0a54b0ee4..334b0e633 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -243,6 +243,9 @@ struct ConnectBits {
   bool forbidchunk;   /* used only to explicitly forbid chunk-upload for
                          specific upload buffers. See readmoredata() in
                          http.c for details. */
+  bool tcpconnect;    /* the tcp stream (or simimlar) is connected, this
+                         is set the first time on the first connect function
+                         call */
 };
 
 /*