diff --git a/lib/multi.c b/lib/multi.c index d2c94590e7..bf1f46764b 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -1657,8 +1657,14 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, } /* if there's still a connection to use, call the progress function */ else if(easy->easy_conn && Curl_pgrsUpdate(easy->easy_conn)) { - easy->result = CURLE_ABORTED_BY_CALLBACK; - multistate(easy, CURLM_STATE_COMPLETED); + /* aborted due to progress callback return code must close the + connection */ + easy->easy_conn->bits.close = TRUE; + + /* if not yet in DONE state, go there, otherwise COMPLETED */ + multistate(easy, (easy->state < CURLM_STATE_DONE)? + CURLM_STATE_DONE: CURLM_STATE_COMPLETED); + result = CURLM_CALL_MULTI_PERFORM; } } } WHILE_FALSE; /* just to break out from! */ diff --git a/lib/url.c b/lib/url.c index c9135a6b35..abb5a9ccc5 100644 --- a/lib/url.c +++ b/lib/url.c @@ -136,6 +136,7 @@ int curl_win32_idn_to_ascii(const char *in, char **out); static long ConnectionKillOne(struct SessionHandle *data); static void conn_free(struct connectdata *conn); static void signalPipeClose(struct curl_llist *pipeline, bool pipe_broke); +static CURLcode do_init(struct connectdata *conn); /* * Protocol table. @@ -4988,6 +4989,9 @@ static CURLcode create_conn(struct SessionHandle *data, ConnectionStore(data, conn); } + /* Setup and init stuff before DO starts, in preparing for the transfer. */ + do_init(conn); + /* * Setup whatever necessary for a resumed transfer */ @@ -5334,9 +5338,6 @@ CURLcode Curl_do(struct connectdata **connp, bool *done) struct connectdata *conn = *connp; struct SessionHandle *data = conn->data; - /* setup and init stuff before DO starts, in preparing for the transfer */ - do_init(conn); - if(conn->handler->do_it) { /* generic protocol-specific function pointer set in curl_connect() */ result = conn->handler->do_it(conn, done);