Georg Lippitsch brought CURLOPT_SEEKFUNCTION and CURLOPT_SEEKDATA to allow
libcurl to seek in a given input stream. This is particularly important when doing upload resumes when there's already a huge part of the file present remotely. Before, and still if this callback isn't used, libcurl will read and through away the entire file up to the point to where the resuming begins (which of course can be a slow opereration depending on file size, I/O bandwidth and more). This new function will also be preferred to get used instead of the CURLOPT_IOCTLFUNCTION for seeking back in a stream when doing multi-stage HTTP auth with POST/PUT.
This commit is contained in:
18
lib/url.c
18
lib/url.c
@@ -685,6 +685,10 @@ CURLcode Curl_open(struct SessionHandle **curl)
|
||||
/* use fread as default function to read input */
|
||||
data->set.fread_func = (curl_read_callback)fread;
|
||||
|
||||
/* don't use a seek function by default */
|
||||
data->set.seek_func = ZERO_NULL;
|
||||
data->set.seek_client = ZERO_NULL;
|
||||
|
||||
/* conversion callbacks for non-ASCII hosts */
|
||||
data->set.convfromnetwork = ZERO_NULL;
|
||||
data->set.convtonetwork = ZERO_NULL;
|
||||
@@ -1627,6 +1631,18 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
|
||||
/* When set to NULL, reset to our internal default function */
|
||||
data->set.fread_func = (curl_read_callback)fread;
|
||||
break;
|
||||
case CURLOPT_SEEKFUNCTION:
|
||||
/*
|
||||
* Seek callback. Might be NULL.
|
||||
*/
|
||||
data->set.seek_func = va_arg(param, curl_seek_callback);
|
||||
break;
|
||||
case CURLOPT_SEEKDATA:
|
||||
/*
|
||||
* Seek control callback. Might be NULL.
|
||||
*/
|
||||
data->set.seek_client = va_arg(param, void *);
|
||||
break;
|
||||
case CURLOPT_CONV_FROM_NETWORK_FUNCTION:
|
||||
/*
|
||||
* "Convert from network encoding" callback
|
||||
@@ -4038,6 +4054,8 @@ static CURLcode CreateConnection(struct SessionHandle *data,
|
||||
* the persistent connection stuff */
|
||||
conn->fread_func = data->set.fread_func;
|
||||
conn->fread_in = data->set.in;
|
||||
conn->seek_func = data->set.seek_func;
|
||||
conn->seek_client = data->set.seek_client;
|
||||
|
||||
if((conn->protocol&PROT_HTTP) &&
|
||||
data->set.upload &&
|
||||
|
||||
Reference in New Issue
Block a user