read_callback: move to SessionHandle from connectdata
With many easy handles using the same connection for multiplexing, it is important we store and keep the transfer-oriented stuff in the SessionHandle so that callbacks and callback data work fine even when many easy handles share the same physical connection.
This commit is contained in:
Родитель
6a688976f0
Коммит
b0143a2a33
|
@ -315,8 +315,6 @@ static CURLcode file_upload(struct connectdata *conn)
|
|||
* Since FILE: doesn't do the full init, we need to provide some extra
|
||||
* assignments here.
|
||||
*/
|
||||
conn->fread_func = data->set.fread_func;
|
||||
conn->fread_in = data->set.in;
|
||||
conn->data->req.upload_fromhere = buf;
|
||||
|
||||
if(!dir)
|
||||
|
|
|
@ -1670,8 +1670,8 @@ static CURLcode ftp_state_ul_setup(struct connectdata *conn,
|
|||
BUFSIZE : curlx_sotouz(data->state.resume_from - passed);
|
||||
|
||||
size_t actuallyread =
|
||||
conn->fread_func(data->state.buffer, 1, readthisamountnow,
|
||||
conn->fread_in);
|
||||
data->set.fread_func(data->state.buffer, 1, readthisamountnow,
|
||||
data->set.in);
|
||||
|
||||
passed += actuallyread;
|
||||
if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
|
||||
|
|
28
lib/http.c
28
lib/http.c
|
@ -1016,8 +1016,8 @@ static size_t readmoredata(char *buffer,
|
|||
/* move backup data into focus and continue on that */
|
||||
http->postdata = http->backup.postdata;
|
||||
http->postsize = http->backup.postsize;
|
||||
conn->fread_func = http->backup.fread_func;
|
||||
conn->fread_in = http->backup.fread_in;
|
||||
conn->data->set.fread_func = http->backup.fread_func;
|
||||
conn->data->set.in = http->backup.fread_in;
|
||||
|
||||
http->sending++; /* move one step up */
|
||||
|
||||
|
@ -1172,14 +1172,14 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer *in,
|
|||
ptr = in->buffer + amount;
|
||||
|
||||
/* backup the currently set pointers */
|
||||
http->backup.fread_func = conn->fread_func;
|
||||
http->backup.fread_in = conn->fread_in;
|
||||
http->backup.fread_func = conn->data->set.fread_func;
|
||||
http->backup.fread_in = conn->data->set.in;
|
||||
http->backup.postdata = http->postdata;
|
||||
http->backup.postsize = http->postsize;
|
||||
|
||||
/* set the new pointers for the request-sending */
|
||||
conn->fread_func = (curl_read_callback)readmoredata;
|
||||
conn->fread_in = (void *)conn;
|
||||
conn->data->set.fread_func = (curl_read_callback)readmoredata;
|
||||
conn->data->set.in = (void *)conn;
|
||||
http->postdata = ptr;
|
||||
http->postsize = (curl_off_t)size;
|
||||
|
||||
|
@ -1475,8 +1475,8 @@ CURLcode Curl_http_done(struct connectdata *conn,
|
|||
#endif
|
||||
|
||||
/* set the proper values (possibly modified on POST) */
|
||||
conn->fread_func = data->set.fread_func; /* restore */
|
||||
conn->fread_in = data->set.in; /* restore */
|
||||
data->set.fread_func = data->set.fread_func; /* restore */
|
||||
data->set.in = data->set.in; /* restore */
|
||||
conn->seek_func = data->set.seek_func; /* restore */
|
||||
conn->seek_client = data->set.seek_client; /* restore */
|
||||
|
||||
|
@ -2447,14 +2447,14 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||
|
||||
/* Get the currently set callback function pointer and store that in the
|
||||
form struct since we might want the actual user-provided callback later
|
||||
on. The conn->fread_func pointer itself will be changed for the
|
||||
on. The data->set.fread_func pointer itself will be changed for the
|
||||
multipart case to the function that returns a multipart formatted
|
||||
stream. */
|
||||
http->form.fread_func = conn->fread_func;
|
||||
http->form.fread_func = data->set.fread_func;
|
||||
|
||||
/* Set the read function to read from the generated form data */
|
||||
conn->fread_func = (curl_read_callback)Curl_FormReader;
|
||||
conn->fread_in = &http->form;
|
||||
data->set.fread_func = (curl_read_callback)Curl_FormReader;
|
||||
data->set.in = &http->form;
|
||||
|
||||
http->sending = HTTPSEND_BODY;
|
||||
|
||||
|
@ -2672,8 +2672,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||
|
||||
http->sending = HTTPSEND_BODY;
|
||||
|
||||
conn->fread_func = (curl_read_callback)readmoredata;
|
||||
conn->fread_in = (void *)conn;
|
||||
data->set.fread_func = (curl_read_callback)readmoredata;
|
||||
data->set.in = (void *)conn;
|
||||
|
||||
/* set the upload size to the progress meter */
|
||||
Curl_pgrsSetUploadSize(data, http->postsize);
|
||||
|
|
|
@ -1513,7 +1513,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
|
|||
__LINE__));
|
||||
|
||||
/* read/write data if it is ready to do so */
|
||||
result = Curl_readwrite(data->easy_conn, &done);
|
||||
result = Curl_readwrite(data->easy_conn, data, &done);
|
||||
|
||||
k = &data->req;
|
||||
|
||||
|
|
|
@ -1737,8 +1737,8 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
|
|||
BUFSIZE : curlx_sotouz(data->state.resume_from - passed);
|
||||
|
||||
size_t actuallyread =
|
||||
conn->fread_func(data->state.buffer, 1, readthisamountnow,
|
||||
conn->fread_in);
|
||||
data->set.fread_func(data->state.buffer, 1, readthisamountnow,
|
||||
data->set.in);
|
||||
|
||||
passed += actuallyread;
|
||||
if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
|
||||
|
|
|
@ -1423,7 +1423,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
|
|||
for(;;) {
|
||||
if(data->set.is_fread_set) {
|
||||
/* read from user-supplied method */
|
||||
result = (int) conn->fread_func(buf, 1, BUFSIZE - 1, conn->fread_in);
|
||||
result = (int) conn->fread_func(buf, 1, BUFSIZE - 1, data->set.in);
|
||||
if(result == CURL_READFUNC_ABORT) {
|
||||
keepon = FALSE;
|
||||
result = CURLE_READ_ERROR;
|
||||
|
@ -1562,13 +1562,13 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
|
|||
pfd[0].fd = sockfd;
|
||||
pfd[0].events = POLLIN;
|
||||
|
||||
if(conn->fread_func != (curl_read_callback)fread) {
|
||||
if(data->set.fread_func != (curl_read_callback)fread) {
|
||||
poll_cnt = 1;
|
||||
interval_ms = 100; /* poll user-supplied read function */
|
||||
}
|
||||
else {
|
||||
/* really using fread, so infile is a FILE* */
|
||||
pfd[1].fd = fileno((FILE *)conn->fread_in);
|
||||
pfd[1].fd = fileno((FILE *)data->set.in);
|
||||
pfd[1].events = POLLIN;
|
||||
poll_cnt = 2;
|
||||
interval_ms = 1 * 1000;
|
||||
|
@ -1627,7 +1627,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
|
|||
}
|
||||
else {
|
||||
/* read from user-supplied method */
|
||||
nread = (int)conn->fread_func(buf, 1, BUFSIZE - 1, conn->fread_in);
|
||||
nread = (int)data->set.fread_func(buf, 1, BUFSIZE - 1, data->set.in);
|
||||
if(nread == CURL_READFUNC_ABORT) {
|
||||
keepon = FALSE;
|
||||
break;
|
||||
|
|
|
@ -115,8 +115,8 @@ CURLcode Curl_fillreadbuffer(struct connectdata *conn, int bytes, int *nreadp)
|
|||
|
||||
/* this function returns a size_t, so we typecast to int to prevent warnings
|
||||
with picky compilers */
|
||||
nread = (int)conn->fread_func(data->req.upload_fromhere, 1,
|
||||
buffersize, conn->fread_in);
|
||||
nread = (int)data->set.fread_func(data->req.upload_fromhere, 1,
|
||||
buffersize, data->set.in);
|
||||
|
||||
if(nread == CURL_READFUNC_ABORT) {
|
||||
failf(data, "operation aborted by callback");
|
||||
|
@ -1013,9 +1013,9 @@ static CURLcode readwrite_upload(struct SessionHandle *data,
|
|||
* be read and written to/from the connection.
|
||||
*/
|
||||
CURLcode Curl_readwrite(struct connectdata *conn,
|
||||
struct SessionHandle *data,
|
||||
bool *done)
|
||||
{
|
||||
struct SessionHandle *data = conn->data;
|
||||
struct SingleRequest *k = &data->req;
|
||||
CURLcode result;
|
||||
int didwhat=0;
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
|
@ -40,7 +40,8 @@ CURLcode Curl_follow(struct SessionHandle *data, char *newurl,
|
|||
followtype type);
|
||||
|
||||
|
||||
CURLcode Curl_readwrite(struct connectdata *conn, bool *done);
|
||||
CURLcode Curl_readwrite(struct connectdata *conn,
|
||||
struct SessionHandle *data, bool *done);
|
||||
int Curl_single_getsock(const struct connectdata *conn,
|
||||
curl_socket_t *socks,
|
||||
int numsocks);
|
||||
|
|
|
@ -5844,8 +5844,6 @@ static CURLcode create_conn(struct SessionHandle *data,
|
|||
* Inherit the proper values from the urldata struct AFTER we have arranged
|
||||
* 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;
|
||||
|
||||
|
|
|
@ -988,10 +988,6 @@ struct connectdata {
|
|||
|
||||
/*************** Request - specific items ************/
|
||||
|
||||
/* previously this was in the urldata struct */
|
||||
curl_read_callback fread_func; /* function that reads the input */
|
||||
void *fread_in; /* pointer to pass to the fread() above */
|
||||
|
||||
#if defined(USE_NTLM)
|
||||
struct ntlmdata ntlm; /* NTLM differs from other authentication schemes
|
||||
because it authenticates connections, not
|
||||
|
@ -1426,8 +1422,8 @@ struct UserDefined {
|
|||
long proxyport; /* If non-zero, use this port number by default. If the
|
||||
proxy string features a ":[port]" that one will override
|
||||
this. */
|
||||
void *out; /* the fetched file goes here */
|
||||
void *in; /* the uploaded file is read from here */
|
||||
void *out; /* CURLOPT_WRITEDATA */
|
||||
void *in; /* CURLOPT_READDATA */
|
||||
void *writeheader; /* write the header to this if non-NULL */
|
||||
void *rtp_out; /* write RTP to this if non-NULL */
|
||||
long use_port; /* which port to use (when not using default) */
|
||||
|
|
Загрузка…
Ссылка в новой задаче