mirror of
https://github.com/moparisthebest/curl
synced 2024-11-10 11:35:07 -05:00
Define CURL_MULTIEASY when building this, to use my new curl_easy_perform()
that uses the multi interface to run the request. It is a great testbed for the multi interface and I believe we shall do it this way for real in the future when we have a successor to curl_multi_fdset().
This commit is contained in:
parent
c5b448038f
commit
91f483c591
84
lib/easy.c
84
lib/easy.c
@ -355,6 +355,89 @@ CURLcode curl_easy_setopt(CURL *curl, CURLoption tag, ...)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CURL_MULTIEASY
|
||||||
|
/***************************************************************************
|
||||||
|
* This function is still only for testing purposes. It makes a great way
|
||||||
|
* to run the full test suite on the multi interface instead of the easy one.
|
||||||
|
***************************************************************************
|
||||||
|
*
|
||||||
|
* The *new* curl_easy_perform() is the external interface that performs a
|
||||||
|
* transfer previously setup.
|
||||||
|
*
|
||||||
|
* Wrapper-function that: creates a multi handle, adds the easy handle to it,
|
||||||
|
* runs curl_multi_perform() until the transfer is done, then detaches the
|
||||||
|
* easy handle, destroys the multi handle and returns the easy handle's return
|
||||||
|
* code. This will make everything internally use and assume multi interface.
|
||||||
|
*/
|
||||||
|
CURLcode curl_easy_perform(CURL *easy)
|
||||||
|
{
|
||||||
|
CURLM *multi;
|
||||||
|
CURLMcode mcode;
|
||||||
|
CURLcode code = CURLE_OK;
|
||||||
|
int still_running;
|
||||||
|
struct timeval timeout;
|
||||||
|
int rc;
|
||||||
|
CURLMsg *msg;
|
||||||
|
fd_set fdread;
|
||||||
|
fd_set fdwrite;
|
||||||
|
fd_set fdexcep;
|
||||||
|
int maxfd;
|
||||||
|
|
||||||
|
if(!easy)
|
||||||
|
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||||
|
|
||||||
|
multi = curl_multi_init();
|
||||||
|
if(!multi)
|
||||||
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
mcode = curl_multi_add_handle(multi, easy);
|
||||||
|
if(mcode) {
|
||||||
|
curl_multi_cleanup(multi);
|
||||||
|
return CURLE_FAILED_INIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* we start some action by calling perform right away */
|
||||||
|
|
||||||
|
do {
|
||||||
|
while(CURLM_CALL_MULTI_PERFORM ==
|
||||||
|
curl_multi_perform(multi, &still_running));
|
||||||
|
|
||||||
|
if(!still_running)
|
||||||
|
break;
|
||||||
|
|
||||||
|
FD_ZERO(&fdread);
|
||||||
|
FD_ZERO(&fdwrite);
|
||||||
|
FD_ZERO(&fdexcep);
|
||||||
|
|
||||||
|
/* timeout once per second */
|
||||||
|
timeout.tv_sec = 1;
|
||||||
|
timeout.tv_usec = 0;
|
||||||
|
|
||||||
|
/* get file descriptors from the transfers */
|
||||||
|
curl_multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd);
|
||||||
|
|
||||||
|
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
||||||
|
|
||||||
|
if(rc == -1)
|
||||||
|
/* select error */
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* timeout or data to send/receive => loop! */
|
||||||
|
} while(still_running);
|
||||||
|
|
||||||
|
msg = curl_multi_info_read(multi, &rc);
|
||||||
|
if(msg)
|
||||||
|
code = msg->data.result;
|
||||||
|
|
||||||
|
mcode = curl_multi_remove_handle(multi, easy);
|
||||||
|
/* what to do if it fails? */
|
||||||
|
|
||||||
|
mcode = curl_multi_cleanup(multi);
|
||||||
|
/* what to do if it fails? */
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
#else
|
||||||
/*
|
/*
|
||||||
* curl_easy_perform() is the external interface that performs a transfer
|
* curl_easy_perform() is the external interface that performs a transfer
|
||||||
* previously setup.
|
* previously setup.
|
||||||
@ -389,6 +472,7 @@ CURLcode curl_easy_perform(CURL *curl)
|
|||||||
|
|
||||||
return Curl_perform(data);
|
return Curl_perform(data);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* curl_easy_cleanup() is the external interface to cleaning/freeing the given
|
* curl_easy_cleanup() is the external interface to cleaning/freeing the given
|
||||||
|
Loading…
Reference in New Issue
Block a user