mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 23:58:49 -05:00
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:
parent
6a688976f0
commit
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
|
* Since FILE: doesn't do the full init, we need to provide some extra
|
||||||
* assignments here.
|
* assignments here.
|
||||||
*/
|
*/
|
||||||
conn->fread_func = data->set.fread_func;
|
|
||||||
conn->fread_in = data->set.in;
|
|
||||||
conn->data->req.upload_fromhere = buf;
|
conn->data->req.upload_fromhere = buf;
|
||||||
|
|
||||||
if(!dir)
|
if(!dir)
|
||||||
|
@ -1670,8 +1670,8 @@ static CURLcode ftp_state_ul_setup(struct connectdata *conn,
|
|||||||
BUFSIZE : curlx_sotouz(data->state.resume_from - passed);
|
BUFSIZE : curlx_sotouz(data->state.resume_from - passed);
|
||||||
|
|
||||||
size_t actuallyread =
|
size_t actuallyread =
|
||||||
conn->fread_func(data->state.buffer, 1, readthisamountnow,
|
data->set.fread_func(data->state.buffer, 1, readthisamountnow,
|
||||||
conn->fread_in);
|
data->set.in);
|
||||||
|
|
||||||
passed += actuallyread;
|
passed += actuallyread;
|
||||||
if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
|
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 */
|
/* move backup data into focus and continue on that */
|
||||||
http->postdata = http->backup.postdata;
|
http->postdata = http->backup.postdata;
|
||||||
http->postsize = http->backup.postsize;
|
http->postsize = http->backup.postsize;
|
||||||
conn->fread_func = http->backup.fread_func;
|
conn->data->set.fread_func = http->backup.fread_func;
|
||||||
conn->fread_in = http->backup.fread_in;
|
conn->data->set.in = http->backup.fread_in;
|
||||||
|
|
||||||
http->sending++; /* move one step up */
|
http->sending++; /* move one step up */
|
||||||
|
|
||||||
@ -1172,14 +1172,14 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer *in,
|
|||||||
ptr = in->buffer + amount;
|
ptr = in->buffer + amount;
|
||||||
|
|
||||||
/* backup the currently set pointers */
|
/* backup the currently set pointers */
|
||||||
http->backup.fread_func = conn->fread_func;
|
http->backup.fread_func = conn->data->set.fread_func;
|
||||||
http->backup.fread_in = conn->fread_in;
|
http->backup.fread_in = conn->data->set.in;
|
||||||
http->backup.postdata = http->postdata;
|
http->backup.postdata = http->postdata;
|
||||||
http->backup.postsize = http->postsize;
|
http->backup.postsize = http->postsize;
|
||||||
|
|
||||||
/* set the new pointers for the request-sending */
|
/* set the new pointers for the request-sending */
|
||||||
conn->fread_func = (curl_read_callback)readmoredata;
|
conn->data->set.fread_func = (curl_read_callback)readmoredata;
|
||||||
conn->fread_in = (void *)conn;
|
conn->data->set.in = (void *)conn;
|
||||||
http->postdata = ptr;
|
http->postdata = ptr;
|
||||||
http->postsize = (curl_off_t)size;
|
http->postsize = (curl_off_t)size;
|
||||||
|
|
||||||
@ -1475,8 +1475,8 @@ CURLcode Curl_http_done(struct connectdata *conn,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* set the proper values (possibly modified on POST) */
|
/* set the proper values (possibly modified on POST) */
|
||||||
conn->fread_func = data->set.fread_func; /* restore */
|
data->set.fread_func = data->set.fread_func; /* restore */
|
||||||
conn->fread_in = data->set.in; /* restore */
|
data->set.in = data->set.in; /* restore */
|
||||||
conn->seek_func = data->set.seek_func; /* restore */
|
conn->seek_func = data->set.seek_func; /* restore */
|
||||||
conn->seek_client = data->set.seek_client; /* 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
|
/* Get the currently set callback function pointer and store that in the
|
||||||
form struct since we might want the actual user-provided callback later
|
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
|
multipart case to the function that returns a multipart formatted
|
||||||
stream. */
|
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 */
|
/* Set the read function to read from the generated form data */
|
||||||
conn->fread_func = (curl_read_callback)Curl_FormReader;
|
data->set.fread_func = (curl_read_callback)Curl_FormReader;
|
||||||
conn->fread_in = &http->form;
|
data->set.in = &http->form;
|
||||||
|
|
||||||
http->sending = HTTPSEND_BODY;
|
http->sending = HTTPSEND_BODY;
|
||||||
|
|
||||||
@ -2672,8 +2672,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
|
|
||||||
http->sending = HTTPSEND_BODY;
|
http->sending = HTTPSEND_BODY;
|
||||||
|
|
||||||
conn->fread_func = (curl_read_callback)readmoredata;
|
data->set.fread_func = (curl_read_callback)readmoredata;
|
||||||
conn->fread_in = (void *)conn;
|
data->set.in = (void *)conn;
|
||||||
|
|
||||||
/* set the upload size to the progress meter */
|
/* set the upload size to the progress meter */
|
||||||
Curl_pgrsSetUploadSize(data, http->postsize);
|
Curl_pgrsSetUploadSize(data, http->postsize);
|
||||||
|
@ -1513,7 +1513,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
|
|||||||
__LINE__));
|
__LINE__));
|
||||||
|
|
||||||
/* read/write data if it is ready to do so */
|
/* 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;
|
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);
|
BUFSIZE : curlx_sotouz(data->state.resume_from - passed);
|
||||||
|
|
||||||
size_t actuallyread =
|
size_t actuallyread =
|
||||||
conn->fread_func(data->state.buffer, 1, readthisamountnow,
|
data->set.fread_func(data->state.buffer, 1, readthisamountnow,
|
||||||
conn->fread_in);
|
data->set.in);
|
||||||
|
|
||||||
passed += actuallyread;
|
passed += actuallyread;
|
||||||
if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
|
if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
|
||||||
|
@ -1423,7 +1423,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
|
|||||||
for(;;) {
|
for(;;) {
|
||||||
if(data->set.is_fread_set) {
|
if(data->set.is_fread_set) {
|
||||||
/* read from user-supplied method */
|
/* 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) {
|
if(result == CURL_READFUNC_ABORT) {
|
||||||
keepon = FALSE;
|
keepon = FALSE;
|
||||||
result = CURLE_READ_ERROR;
|
result = CURLE_READ_ERROR;
|
||||||
@ -1562,13 +1562,13 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
|
|||||||
pfd[0].fd = sockfd;
|
pfd[0].fd = sockfd;
|
||||||
pfd[0].events = POLLIN;
|
pfd[0].events = POLLIN;
|
||||||
|
|
||||||
if(conn->fread_func != (curl_read_callback)fread) {
|
if(data->set.fread_func != (curl_read_callback)fread) {
|
||||||
poll_cnt = 1;
|
poll_cnt = 1;
|
||||||
interval_ms = 100; /* poll user-supplied read function */
|
interval_ms = 100; /* poll user-supplied read function */
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* really using fread, so infile is a FILE* */
|
/* 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;
|
pfd[1].events = POLLIN;
|
||||||
poll_cnt = 2;
|
poll_cnt = 2;
|
||||||
interval_ms = 1 * 1000;
|
interval_ms = 1 * 1000;
|
||||||
@ -1627,7 +1627,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* read from user-supplied method */
|
/* 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) {
|
if(nread == CURL_READFUNC_ABORT) {
|
||||||
keepon = FALSE;
|
keepon = FALSE;
|
||||||
break;
|
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
|
/* this function returns a size_t, so we typecast to int to prevent warnings
|
||||||
with picky compilers */
|
with picky compilers */
|
||||||
nread = (int)conn->fread_func(data->req.upload_fromhere, 1,
|
nread = (int)data->set.fread_func(data->req.upload_fromhere, 1,
|
||||||
buffersize, conn->fread_in);
|
buffersize, data->set.in);
|
||||||
|
|
||||||
if(nread == CURL_READFUNC_ABORT) {
|
if(nread == CURL_READFUNC_ABORT) {
|
||||||
failf(data, "operation aborted by callback");
|
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.
|
* be read and written to/from the connection.
|
||||||
*/
|
*/
|
||||||
CURLcode Curl_readwrite(struct connectdata *conn,
|
CURLcode Curl_readwrite(struct connectdata *conn,
|
||||||
|
struct SessionHandle *data,
|
||||||
bool *done)
|
bool *done)
|
||||||
{
|
{
|
||||||
struct SessionHandle *data = conn->data;
|
|
||||||
struct SingleRequest *k = &data->req;
|
struct SingleRequest *k = &data->req;
|
||||||
CURLcode result;
|
CURLcode result;
|
||||||
int didwhat=0;
|
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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* 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);
|
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,
|
int Curl_single_getsock(const struct connectdata *conn,
|
||||||
curl_socket_t *socks,
|
curl_socket_t *socks,
|
||||||
int numsocks);
|
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
|
* Inherit the proper values from the urldata struct AFTER we have arranged
|
||||||
* the persistent connection stuff
|
* 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_func = data->set.seek_func;
|
||||||
conn->seek_client = data->set.seek_client;
|
conn->seek_client = data->set.seek_client;
|
||||||
|
|
||||||
|
@ -988,10 +988,6 @@ struct connectdata {
|
|||||||
|
|
||||||
/*************** Request - specific items ************/
|
/*************** 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)
|
#if defined(USE_NTLM)
|
||||||
struct ntlmdata ntlm; /* NTLM differs from other authentication schemes
|
struct ntlmdata ntlm; /* NTLM differs from other authentication schemes
|
||||||
because it authenticates connections, not
|
because it authenticates connections, not
|
||||||
@ -1426,8 +1422,8 @@ struct UserDefined {
|
|||||||
long proxyport; /* If non-zero, use this port number by default. If the
|
long proxyport; /* If non-zero, use this port number by default. If the
|
||||||
proxy string features a ":[port]" that one will override
|
proxy string features a ":[port]" that one will override
|
||||||
this. */
|
this. */
|
||||||
void *out; /* the fetched file goes here */
|
void *out; /* CURLOPT_WRITEDATA */
|
||||||
void *in; /* the uploaded file is read from here */
|
void *in; /* CURLOPT_READDATA */
|
||||||
void *writeheader; /* write the header to this if non-NULL */
|
void *writeheader; /* write the header to this if non-NULL */
|
||||||
void *rtp_out; /* write RTP 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) */
|
long use_port; /* which port to use (when not using default) */
|
||||||
|
Loading…
Reference in New Issue
Block a user