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:
		| @@ -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) */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Daniel Stenberg
					Daniel Stenberg