--- lib/multi.c.orig	2014-02-04 11:26:11.160052078 -0400
+++ lib/multi.c	2014-02-04 11:32:11.425026700 -0400
@@ -1029,8 +1029,17 @@
       break;
 
     case CURLM_STATE_CONNECT:
+      /* Don't set the STARTSINGLE t_startsingle time if we are just
+         re-starting the request (for the second phase of Digest
+         authentication, for example).  All of the handle's timeouts are based
+         off the original t_startsingle, and if we change it, the
+         already-scheduled timer events will fire before enough seconds have
+         elapsed (as measured from t_startsingle), and the timeouts won't
+         happen!  */
+      if(data->progress.t_startsingle.tv_sec == 0
+         && data->progress.t_startsingle.tv_usec == 0)
+        Curl_pgrsTime(data, TIMER_STARTSINGLE);
       /* Connect. We want to get a connection identifier filled in. */
-      Curl_pgrsTime(data, TIMER_STARTSINGLE);
       data->result = Curl_connect(data, &data->easy_conn,
                                   &async, &protocol_connect);
       if(CURLE_NO_CONNECTION_AVAILABLE == data->result) {

