aboutsummaryrefslogtreecommitdiff
path: root/lib/multi.c
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2013-12-22 23:36:11 +0100
committerDaniel Stenberg <daniel@haxx.se>2013-12-22 23:44:14 +0100
commit2715d7f948c8eb7cd3cba38f3dff6d4148e7cfaf (patch)
treeba58e244a9542dff5a281355608bc66501319957 /lib/multi.c
parent3db1f3dd817d8826d2a2d735c851710c87efd06f (diff)
FILE: don't wait due to CURLOPT_MAX_RECV_SPEED_LARGE
The FILE:// code doesn't support this option - and it doesn't make sense to support it as long as it works as it does since then it'd only block even longer. But: setting CURLOPT_MAX_RECV_SPEED_LARGE would make the transfer first get done and then libcurl would wait until the average speed would get low enough. This happened because the transfer happens completely in the DO state for FILE:// but then it would still unconditionally continue in to the PERFORM state where the speed check is made. Starting now, the code will skip from DO_DONE to DONE immediately if no socket is set to be recv()ed or send()ed to. Bug: http://curl.haxx.se/bug/view.cgi?id=1312 Reported-by: Mohammad AlSaleh
Diffstat (limited to 'lib/multi.c')
-rw-r--r--lib/multi.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/lib/multi.c b/lib/multi.c
index ec45ecb17..191c9b88a 100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -1381,7 +1381,14 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
Curl_move_handle_from_send_to_recv_pipe(data, data->easy_conn);
/* Check if we can move pending requests to send pipe */
Curl_multi_process_pending_handles(multi);
- multistate(data, CURLM_STATE_WAITPERFORM);
+
+ /* Only perform the transfer if there's a good socket to work with.
+ Having both BAD is a signal to skip immediately to DONE */
+ if((data->easy_conn->sockfd != CURL_SOCKET_BAD) ||
+ (data->easy_conn->writesockfd != CURL_SOCKET_BAD))
+ multistate(data, CURLM_STATE_WAITPERFORM);
+ else
+ multistate(data, CURLM_STATE_DONE);
result = CURLM_CALL_MULTI_PERFORM;
break;