urldata: simplify bytecounters

- no need to have them protocol specific

- no need to set pointers to them with the Curl_setup_transfer() call

- make Curl_setup_transfer() operate on a transfer pointer, not
  connection

- switch some counters from long to the more proper curl_off_t type

Closes #3627
This commit is contained in:
Daniel Stenberg 2019-02-28 11:36:26 +01:00
parent 8cf6c170cf
commit 65eb65fde6
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
22 changed files with 111 additions and 176 deletions

View File

@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 2012 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 2010, Howard Chu, <hyc@highlandsun.com> * Copyright (C) 2010, Howard Chu, <hyc@highlandsun.com>
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
@ -239,17 +239,18 @@ static CURLcode rtmp_connect(struct connectdata *conn, bool *done)
static CURLcode rtmp_do(struct connectdata *conn, bool *done) static CURLcode rtmp_do(struct connectdata *conn, bool *done)
{ {
struct Curl_easy *data = conn->data;
RTMP *r = conn->proto.generic; RTMP *r = conn->proto.generic;
if(!RTMP_ConnectStream(r, 0)) if(!RTMP_ConnectStream(r, 0))
return CURLE_FAILED_INIT; return CURLE_FAILED_INIT;
if(conn->data->set.upload) { if(conn->data->set.upload) {
Curl_pgrsSetUploadSize(conn->data, conn->data->state.infilesize); Curl_pgrsSetUploadSize(data, data->state.infilesize);
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL); Curl_setup_transfer(data, -1, -1, FALSE, FIRSTSOCKET);
} }
else else
Curl_setup_transfer(conn, FIRSTSOCKET, -1, FALSE, NULL, -1, NULL); Curl_setup_transfer(data, FIRSTSOCKET, -1, FALSE, -1);
*done = TRUE; *done = TRUE;
return CURLE_OK; return CURLE_OK;
} }

View File

@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2019, 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
@ -137,7 +137,6 @@ static CURLcode dict_do(struct connectdata *conn, bool *done)
curl_socket_t sockfd = conn->sock[FIRSTSOCKET]; curl_socket_t sockfd = conn->sock[FIRSTSOCKET];
char *path = data->state.up.path; char *path = data->state.up.path;
curl_off_t *bytecount = &data->req.bytecount;
*done = TRUE; /* unconditionally */ *done = TRUE; /* unconditionally */
@ -200,8 +199,7 @@ static CURLcode dict_do(struct connectdata *conn, bool *done)
failf(data, "Failed sending DICT request"); failf(data, "Failed sending DICT request");
return result; return result;
} }
Curl_setup_transfer(conn, FIRSTSOCKET, -1, FALSE, bytecount, Curl_setup_transfer(data, FIRSTSOCKET, -1, FALSE, -1); /* no upload */
-1, NULL); /* no upload */
} }
else if(strncasecompare(path, DICT_DEFINE, sizeof(DICT_DEFINE)-1) || else if(strncasecompare(path, DICT_DEFINE, sizeof(DICT_DEFINE)-1) ||
strncasecompare(path, DICT_DEFINE2, sizeof(DICT_DEFINE2)-1) || strncasecompare(path, DICT_DEFINE2, sizeof(DICT_DEFINE2)-1) ||
@ -247,8 +245,7 @@ static CURLcode dict_do(struct connectdata *conn, bool *done)
failf(data, "Failed sending DICT request"); failf(data, "Failed sending DICT request");
return result; return result;
} }
Curl_setup_transfer(conn, FIRSTSOCKET, -1, FALSE, bytecount, Curl_setup_transfer(data, FIRSTSOCKET, -1, FALSE, -1);
-1, NULL); /* no upload */
} }
else { else {
@ -270,7 +267,7 @@ static CURLcode dict_do(struct connectdata *conn, bool *done)
return result; return result;
} }
Curl_setup_transfer(conn, FIRSTSOCKET, -1, FALSE, bytecount, -1, NULL); Curl_setup_transfer(data, FIRSTSOCKET, -1, FALSE, -1);
} }
} }

View File

@ -448,7 +448,6 @@ static CURLcode ReceivedServerConnect(struct connectdata *conn, bool *received)
static CURLcode InitiateTransfer(struct connectdata *conn) static CURLcode InitiateTransfer(struct connectdata *conn)
{ {
struct Curl_easy *data = conn->data; struct Curl_easy *data = conn->data;
struct FTP *ftp = data->req.protop;
CURLcode result = CURLE_OK; CURLcode result = CURLE_OK;
if(conn->bits.ftp_use_data_ssl) { if(conn->bits.ftp_use_data_ssl) {
@ -461,24 +460,19 @@ static CURLcode InitiateTransfer(struct connectdata *conn)
} }
if(conn->proto.ftpc.state_saved == FTP_STOR) { if(conn->proto.ftpc.state_saved == FTP_STOR) {
*(ftp->bytecountp) = 0;
/* When we know we're uploading a specified file, we can get the file /* When we know we're uploading a specified file, we can get the file
size prior to the actual upload. */ size prior to the actual upload. */
Curl_pgrsSetUploadSize(data, data->state.infilesize); Curl_pgrsSetUploadSize(data, data->state.infilesize);
/* set the SO_SNDBUF for the secondary socket for those who need it */ /* set the SO_SNDBUF for the secondary socket for those who need it */
Curl_sndbufset(conn->sock[SECONDARYSOCKET]); Curl_sndbufset(conn->sock[SECONDARYSOCKET]);
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, /* no download */ Curl_setup_transfer(data, -1, -1, FALSE, SECONDARYSOCKET);
SECONDARYSOCKET, ftp->bytecountp);
} }
else { else {
/* FTP download: */ /* FTP download: */
Curl_setup_transfer(conn, SECONDARYSOCKET, Curl_setup_transfer(data, SECONDARYSOCKET,
conn->proto.ftpc.retr_size_saved, FALSE, conn->proto.ftpc.retr_size_saved, FALSE, -1);
ftp->bytecountp, -1, NULL); /* no upload here */
} }
conn->proto.ftpc.pp.pending_resp = TRUE; /* expect server response */ conn->proto.ftpc.pp.pending_resp = TRUE; /* expect server response */
@ -1658,7 +1652,7 @@ static CURLcode ftp_state_ul_setup(struct connectdata *conn,
infof(data, "File already completely uploaded\n"); infof(data, "File already completely uploaded\n");
/* no data to transfer */ /* no data to transfer */
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL); Curl_setup_transfer(data, -1, -1, FALSE, -1);
/* Set ->transfer so that we won't get any error in /* Set ->transfer so that we won't get any error in
* ftp_done() because we didn't transfer anything! */ * ftp_done() because we didn't transfer anything! */
@ -2230,7 +2224,7 @@ static CURLcode ftp_state_retr(struct connectdata *conn,
if(ftp->downloadsize == 0) { if(ftp->downloadsize == 0) {
/* no data to transfer */ /* no data to transfer */
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL); Curl_setup_transfer(data, -1, -1, FALSE, -1);
infof(data, "File already completely downloaded\n"); infof(data, "File already completely downloaded\n");
/* Set ->transfer so that we won't get any error in ftp_done() /* Set ->transfer so that we won't get any error in ftp_done()
@ -3308,33 +3302,33 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status,
; ;
else if(data->set.upload) { else if(data->set.upload) {
if((-1 != data->state.infilesize) && if((-1 != data->state.infilesize) &&
(data->state.infilesize != *ftp->bytecountp) && (data->state.infilesize != data->req.writebytecount) &&
!data->set.crlf && !data->set.crlf &&
(ftp->transfer == FTPTRANSFER_BODY)) { (ftp->transfer == FTPTRANSFER_BODY)) {
failf(data, "Uploaded unaligned file size (%" CURL_FORMAT_CURL_OFF_T failf(data, "Uploaded unaligned file size (%" CURL_FORMAT_CURL_OFF_T
" out of %" CURL_FORMAT_CURL_OFF_T " bytes)", " out of %" CURL_FORMAT_CURL_OFF_T " bytes)",
*ftp->bytecountp, data->state.infilesize); data->req.bytecount, data->state.infilesize);
result = CURLE_PARTIAL_FILE; result = CURLE_PARTIAL_FILE;
} }
} }
else { else {
if((-1 != data->req.size) && if((-1 != data->req.size) &&
(data->req.size != *ftp->bytecountp) && (data->req.size != data->req.bytecount) &&
#ifdef CURL_DO_LINEEND_CONV #ifdef CURL_DO_LINEEND_CONV
/* Most FTP servers don't adjust their file SIZE response for CRLFs, so /* Most FTP servers don't adjust their file SIZE response for CRLFs, so
* we'll check to see if the discrepancy can be explained by the number * we'll check to see if the discrepancy can be explained by the number
* of CRLFs we've changed to LFs. * of CRLFs we've changed to LFs.
*/ */
((data->req.size + data->state.crlf_conversions) != ((data->req.size + data->state.crlf_conversions) !=
*ftp->bytecountp) && data->req.bytecount) &&
#endif /* CURL_DO_LINEEND_CONV */ #endif /* CURL_DO_LINEEND_CONV */
(data->req.maxdownload != *ftp->bytecountp)) { (data->req.maxdownload != data->req.bytecount)) {
failf(data, "Received only partial file: %" CURL_FORMAT_CURL_OFF_T failf(data, "Received only partial file: %" CURL_FORMAT_CURL_OFF_T
" bytes", *ftp->bytecountp); " bytes", data->req.bytecount);
result = CURLE_PARTIAL_FILE; result = CURLE_PARTIAL_FILE;
} }
else if(!ftpc->dont_check && else if(!ftpc->dont_check &&
!*ftp->bytecountp && !data->req.bytecount &&
(data->req.size>0)) { (data->req.size>0)) {
failf(data, "No data was received!"); failf(data, "No data was received!");
result = CURLE_FTP_COULDNT_RETR_FILE; result = CURLE_FTP_COULDNT_RETR_FILE;
@ -3629,7 +3623,7 @@ static CURLcode ftp_do_more(struct connectdata *conn, int *completep)
if(!result && (ftp->transfer != FTPTRANSFER_BODY)) if(!result && (ftp->transfer != FTPTRANSFER_BODY))
/* no data to transfer. FIX: it feels like a kludge to have this here /* no data to transfer. FIX: it feels like a kludge to have this here
too! */ too! */
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL); Curl_setup_transfer(data, -1, -1, FALSE, -1);
if(!ftpc->wait_data_conn) { if(!ftpc->wait_data_conn) {
/* no waiting for the data connection so this is now complete */ /* no waiting for the data connection so this is now complete */
@ -4308,7 +4302,7 @@ static CURLcode ftp_dophase_done(struct connectdata *conn,
if(ftp->transfer != FTPTRANSFER_BODY) if(ftp->transfer != FTPTRANSFER_BODY)
/* no data to transfer */ /* no data to transfer */
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL); Curl_setup_transfer(conn->data, -1, -1, FALSE, -1);
else if(!connected) else if(!connected)
/* since we didn't connect now, we want do_more to get called */ /* since we didn't connect now, we want do_more to get called */
conn->bits.do_more = TRUE; conn->bits.do_more = TRUE;
@ -4427,7 +4421,6 @@ static CURLcode ftp_setup_connection(struct connectdata *conn)
} }
/* get some initial data into the ftp struct */ /* get some initial data into the ftp struct */
ftp->bytecountp = &conn->data->req.bytecount;
ftp->transfer = FTPTRANSFER_BODY; ftp->transfer = FTPTRANSFER_BODY;
ftp->downloadsize = 0; ftp->downloadsize = 0;

View File

@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2019, 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
@ -102,7 +102,6 @@ typedef enum {
perhaps the Curl_easy is changed between the times the connection is perhaps the Curl_easy is changed between the times the connection is
used. */ used. */
struct FTP { struct FTP {
curl_off_t *bytecountp;
char *user; /* user name string */ char *user; /* user name string */
char *passwd; /* password string */ char *passwd; /* password string */
char *path; /* points to the urlpieces struct field */ char *path; /* points to the urlpieces struct field */

View File

@ -163,10 +163,10 @@ static CURLcode getinfo_long(struct Curl_easy *data, CURLINFO info,
*param_longp = (long)data->info.filetime; *param_longp = (long)data->info.filetime;
break; break;
case CURLINFO_HEADER_SIZE: case CURLINFO_HEADER_SIZE:
*param_longp = data->info.header_size; *param_longp = (long)data->info.header_size;
break; break;
case CURLINFO_REQUEST_SIZE: case CURLINFO_REQUEST_SIZE:
*param_longp = data->info.request_size; *param_longp = (long)data->info.request_size;
break; break;
case CURLINFO_SSL_VERIFYRESULT: case CURLINFO_SSL_VERIFYRESULT:
*param_longp = data->set.ssl.certverifyresult; *param_longp = data->set.ssl.certverifyresult;

View File

@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2019, 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
@ -78,8 +78,6 @@ static CURLcode gopher_do(struct connectdata *conn, bool *done)
CURLcode result = CURLE_OK; CURLcode result = CURLE_OK;
struct Curl_easy *data = conn->data; struct Curl_easy *data = conn->data;
curl_socket_t sockfd = conn->sock[FIRSTSOCKET]; curl_socket_t sockfd = conn->sock[FIRSTSOCKET];
curl_off_t *bytecount = &data->req.bytecount;
char *gopherpath; char *gopherpath;
char *path = data->state.up.path; char *path = data->state.up.path;
char *query = data->state.up.query; char *query = data->state.up.query;
@ -167,8 +165,7 @@ static CURLcode gopher_do(struct connectdata *conn, bool *done)
if(result) if(result)
return result; return result;
Curl_setup_transfer(conn, FIRSTSOCKET, -1, FALSE, bytecount, Curl_setup_transfer(data, FIRSTSOCKET, -1, FALSE, -1);
-1, NULL); /* no upload */
return CURLE_OK; return CURLE_OK;
} }
#endif /*CURL_DISABLE_GOPHER*/ #endif /*CURL_DISABLE_GOPHER*/

View File

@ -416,7 +416,7 @@ static CURLcode http_perhapsrewind(struct connectdata *conn)
break; break;
} }
bytessent = http->writebytecount; bytessent = data->req.writebytecount;
if(conn->bits.authneg) { if(conn->bits.authneg) {
/* This is a state where we are known to be negotiating and we don't send /* This is a state where we are known to be negotiating and we don't send
@ -1120,12 +1120,11 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer **inp,
/* add the number of sent bytes to this /* add the number of sent bytes to this
counter */ counter */
long *bytes_written, curl_off_t *bytes_written,
/* how much of the buffer contains body data */ /* how much of the buffer contains body data */
size_t included_body_bytes, size_t included_body_bytes,
int socketindex) int socketindex)
{ {
ssize_t amount; ssize_t amount;
CURLcode result; CURLcode result;
@ -1221,7 +1220,8 @@ CURLcode Curl_add_buffer_send(Curl_send_buffer **inp,
if(http) { if(http) {
/* if we sent a piece of the body here, up the byte counter for it /* if we sent a piece of the body here, up the byte counter for it
accordingly */ accordingly */
http->writebytecount += bodylen; data->req.writebytecount += bodylen;
Curl_pgrsSetUploadCounter(data, data->req.writebytecount);
if((size_t)amount != size) { if((size_t)amount != size) {
/* The whole request could not be sent in one system call. We must /* The whole request could not be sent in one system call. We must
@ -1583,16 +1583,6 @@ CURLcode Curl_http_done(struct connectdata *conn,
Curl_mime_cleanpart(&http->form); Curl_mime_cleanpart(&http->form);
switch(data->set.httpreq) {
case HTTPREQ_PUT:
case HTTPREQ_POST_FORM:
case HTTPREQ_POST_MIME:
data->req.bytecount = http->readbytecount + http->writebytecount;
break;
default:
break;
}
if(status) if(status)
return status; return status;
@ -1600,7 +1590,7 @@ CURLcode Curl_http_done(struct connectdata *conn,
entire operation is complete */ entire operation is complete */
!conn->bits.retry && !conn->bits.retry &&
!data->set.connect_only && !data->set.connect_only &&
(http->readbytecount + (data->req.bytecount +
data->req.headerbytecount - data->req.headerbytecount -
data->req.deductheadercount) <= 0) { data->req.deductheadercount) <= 0) {
/* If this connection isn't simply closed to be retried, AND nothing was /* If this connection isn't simply closed to be retried, AND nothing was
@ -2009,7 +1999,6 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
data->state.first_remote_port = conn->remote_port; data->state.first_remote_port = conn->remote_port;
} }
http->writebytecount = http->readbytecount = 0;
if((conn->handler->protocol&(PROTO_FAMILY_HTTP|CURLPROTO_FTP)) && if((conn->handler->protocol&(PROTO_FAMILY_HTTP|CURLPROTO_FTP)) &&
data->set.upload) { data->set.upload) {
@ -2706,9 +2695,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
failf(data, "Failed sending PUT request"); failf(data, "Failed sending PUT request");
else else
/* prepare for transfer */ /* prepare for transfer */
Curl_setup_transfer(conn, FIRSTSOCKET, -1, TRUE, Curl_setup_transfer(data, FIRSTSOCKET, -1, TRUE,
&http->readbytecount, postsize?FIRSTSOCKET:-1, postsize?FIRSTSOCKET:-1);
postsize?&http->writebytecount:NULL);
if(result) if(result)
return result; return result;
break; break;
@ -2728,8 +2716,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
failf(data, "Failed sending POST request"); failf(data, "Failed sending POST request");
else else
/* setup variables for the upcoming transfer */ /* setup variables for the upcoming transfer */
Curl_setup_transfer(conn, FIRSTSOCKET, -1, TRUE, &http->readbytecount, Curl_setup_transfer(data, FIRSTSOCKET, -1, TRUE, -1);
-1, NULL);
break; break;
} }
@ -2797,9 +2784,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
failf(data, "Failed sending POST request"); failf(data, "Failed sending POST request");
else else
/* prepare for transfer */ /* prepare for transfer */
Curl_setup_transfer(conn, FIRSTSOCKET, -1, TRUE, Curl_setup_transfer(data, FIRSTSOCKET, -1, TRUE,
&http->readbytecount, postsize?FIRSTSOCKET:-1, postsize?FIRSTSOCKET:-1);
postsize?&http->writebytecount:NULL);
if(result) if(result)
return result; return result;
@ -2953,9 +2939,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
if(result) if(result)
failf(data, "Failed sending HTTP POST request"); failf(data, "Failed sending HTTP POST request");
else else
Curl_setup_transfer(conn, FIRSTSOCKET, -1, TRUE, Curl_setup_transfer(data, FIRSTSOCKET, -1, TRUE,
&http->readbytecount, http->postdata?FIRSTSOCKET:-1, http->postdata?FIRSTSOCKET:-1);
http->postdata?&http->writebytecount:NULL);
break; break;
default: default:
@ -2971,33 +2956,30 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
failf(data, "Failed sending HTTP request"); failf(data, "Failed sending HTTP request");
else else
/* HTTP GET/HEAD download: */ /* HTTP GET/HEAD download: */
Curl_setup_transfer(conn, FIRSTSOCKET, -1, TRUE, &http->readbytecount, Curl_setup_transfer(data, FIRSTSOCKET, -1, TRUE,
http->postdata?FIRSTSOCKET:-1, http->postdata?FIRSTSOCKET:-1);
http->postdata?&http->writebytecount:NULL);
} }
if(result) if(result)
return result; return result;
if(http->writebytecount) { if(data->req.writebytecount) {
/* if a request-body has been sent off, we make sure this progress is noted /* if a request-body has been sent off, we make sure this progress is noted
properly */ properly */
Curl_pgrsSetUploadCounter(data, http->writebytecount); Curl_pgrsSetUploadCounter(data, data->req.writebytecount);
if(Curl_pgrsUpdate(conn)) if(Curl_pgrsUpdate(conn))
result = CURLE_ABORTED_BY_CALLBACK; result = CURLE_ABORTED_BY_CALLBACK;
if(http->writebytecount >= postsize) { if(data->req.writebytecount >= postsize) {
/* already sent the entire request body, mark the "upload" as /* already sent the entire request body, mark the "upload" as
complete */ complete */
infof(data, "upload completely sent off: %" CURL_FORMAT_CURL_OFF_T infof(data, "upload completely sent off: %" CURL_FORMAT_CURL_OFF_T
" out of %" CURL_FORMAT_CURL_OFF_T " bytes\n", " out of %" CURL_FORMAT_CURL_OFF_T " bytes\n",
http->writebytecount, postsize); data->req.writebytecount, postsize);
data->req.upload_done = TRUE; data->req.upload_done = TRUE;
data->req.keepon &= ~KEEP_SEND; /* we're done writing */ data->req.keepon &= ~KEEP_SEND; /* we're done writing */
data->req.exp100 = EXP100_SEND_DATA; /* already sent */ data->req.exp100 = EXP100_SEND_DATA; /* already sent */
Curl_expire_done(data, EXPIRE_100_TIMEOUT); Curl_expire_done(data, EXPIRE_100_TIMEOUT);
} }
else
data->req.writebytecount = http->writebytecount;
} }
if((conn->httpversion == 20) && data->req.upload_chunky) if((conn->httpversion == 20) && data->req.upload_chunky)

View File

@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2019, 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
@ -65,7 +65,7 @@ CURLcode Curl_add_buffer(Curl_send_buffer **inp, const void *inptr,
size_t size) WARN_UNUSED_RESULT; size_t size) WARN_UNUSED_RESULT;
CURLcode Curl_add_buffer_send(Curl_send_buffer **inp, CURLcode Curl_add_buffer_send(Curl_send_buffer **inp,
struct connectdata *conn, struct connectdata *conn,
long *bytes_written, curl_off_t *bytes_written,
size_t included_body_bytes, size_t included_body_bytes,
int socketindex); int socketindex);
@ -139,8 +139,6 @@ struct HTTP {
const char *p_pragma; /* Pragma: string */ const char *p_pragma; /* Pragma: string */
const char *p_accept; /* Accept: string */ const char *p_accept; /* Accept: string */
curl_off_t readbytecount;
curl_off_t writebytecount;
/* For FORM posting */ /* For FORM posting */
curl_mimepart form; curl_mimepart form;

View File

@ -1177,11 +1177,11 @@ static CURLcode imap_state_fetch_resp(struct connectdata *conn, int imapcode,
if(data->req.bytecount == size) if(data->req.bytecount == size)
/* The entire data is already transferred! */ /* The entire data is already transferred! */
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL); Curl_setup_transfer(data, -1, -1, FALSE, -1);
else { else {
/* IMAP download */ /* IMAP download */
data->req.maxdownload = size; data->req.maxdownload = size;
Curl_setup_transfer(conn, FIRSTSOCKET, size, FALSE, NULL, -1, NULL); Curl_setup_transfer(data, FIRSTSOCKET, size, FALSE, -1);
} }
} }
else { else {
@ -1231,7 +1231,7 @@ static CURLcode imap_state_append_resp(struct connectdata *conn, int imapcode,
Curl_pgrsSetUploadSize(data, data->state.infilesize); Curl_pgrsSetUploadSize(data, data->state.infilesize);
/* IMAP upload */ /* IMAP upload */
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL); Curl_setup_transfer(data, -1, -1, FALSE, FIRSTSOCKET);
/* End of DO phase */ /* End of DO phase */
state(conn, IMAP_STOP); state(conn, IMAP_STOP);
@ -1660,7 +1660,7 @@ static CURLcode imap_dophase_done(struct connectdata *conn, bool connected)
if(imap->transfer != FTPTRANSFER_BODY) if(imap->transfer != FTPTRANSFER_BODY)
/* no data to transfer */ /* no data to transfer */
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL); Curl_setup_transfer(conn->data, -1, -1, FALSE, -1);
return CURLE_OK; return CURLE_OK;
} }

View File

@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2019, 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
@ -744,7 +744,7 @@ quit:
#endif #endif
/* no data to transfer */ /* no data to transfer */
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL); Curl_setup_transfer(data, -1, -1, FALSE, -1);
connclose(conn, "LDAP connection always disable re-use"); connclose(conn, "LDAP connection always disable re-use");
return result; return result;

View File

@ -6,7 +6,7 @@
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 2010, Howard Chu, <hyc@openldap.org> * Copyright (C) 2010, Howard Chu, <hyc@openldap.org>
* Copyright (C) 2011 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 2011 - 2019, 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
@ -414,7 +414,7 @@ static CURLcode ldap_do(struct connectdata *conn, bool *done)
return CURLE_OUT_OF_MEMORY; return CURLE_OUT_OF_MEMORY;
lr->msgid = msgid; lr->msgid = msgid;
data->req.protop = lr; data->req.protop = lr;
Curl_setup_transfer(conn, FIRSTSOCKET, -1, FALSE, NULL, -1, NULL); Curl_setup_transfer(data, FIRSTSOCKET, -1, FALSE, -1);
*done = TRUE; *done = TRUE;
return CURLE_OK; return CURLE_OK;
} }

View File

@ -912,7 +912,7 @@ static CURLcode pop3_state_command_resp(struct connectdata *conn,
if(pop3->transfer == FTPTRANSFER_BODY) { if(pop3->transfer == FTPTRANSFER_BODY) {
/* POP3 download */ /* POP3 download */
Curl_setup_transfer(conn, FIRSTSOCKET, -1, FALSE, NULL, -1, NULL); Curl_setup_transfer(data, FIRSTSOCKET, -1, FALSE, -1);
if(pp->cache) { if(pp->cache) {
/* The header "cache" contains a bunch of data that is actually body /* The header "cache" contains a bunch of data that is actually body

View File

@ -249,7 +249,6 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
CURLcode result = CURLE_OK; CURLcode result = CURLE_OK;
Curl_RtspReq rtspreq = data->set.rtspreq; Curl_RtspReq rtspreq = data->set.rtspreq;
struct RTSP *rtsp = data->req.protop; struct RTSP *rtsp = data->req.protop;
struct HTTP *http;
Curl_send_buffer *req_buffer; Curl_send_buffer *req_buffer;
curl_off_t postsize = 0; /* for ANNOUNCE and SET_PARAMETER */ curl_off_t postsize = 0; /* for ANNOUNCE and SET_PARAMETER */
curl_off_t putsize = 0; /* for ANNOUNCE and SET_PARAMETER */ curl_off_t putsize = 0; /* for ANNOUNCE and SET_PARAMETER */
@ -268,10 +267,6 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
*done = TRUE; *done = TRUE;
http = &(rtsp->http_wrapper);
/* Assert that no one has changed the RTSP struct in an evil way */
DEBUGASSERT((void *)http == (void *)rtsp);
rtsp->CSeq_sent = data->state.rtsp_next_client_CSeq; rtsp->CSeq_sent = data->state.rtsp_next_client_CSeq;
rtsp->CSeq_recv = 0; rtsp->CSeq_recv = 0;
@ -328,8 +323,7 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
} }
if(rtspreq == RTSPREQ_RECEIVE) { if(rtspreq == RTSPREQ_RECEIVE) {
Curl_setup_transfer(conn, FIRSTSOCKET, -1, TRUE, Curl_setup_transfer(data, FIRSTSOCKET, -1, TRUE, -1);
&http->readbytecount, -1, NULL);
return result; return result;
} }
@ -597,17 +591,15 @@ static CURLcode rtsp_do(struct connectdata *conn, bool *done)
return result; return result;
} }
Curl_setup_transfer(conn, FIRSTSOCKET, -1, TRUE, &http->readbytecount, Curl_setup_transfer(data, FIRSTSOCKET, -1, TRUE, putsize?FIRSTSOCKET:-1);
putsize?FIRSTSOCKET:-1,
putsize?&http->writebytecount:NULL);
/* Increment the CSeq on success */ /* Increment the CSeq on success */
data->state.rtsp_next_client_CSeq++; data->state.rtsp_next_client_CSeq++;
if(http->writebytecount) { if(data->req.writebytecount) {
/* if a request-body has been sent off, we make sure this progress is /* if a request-body has been sent off, we make sure this progress is
noted properly */ noted properly */
Curl_pgrsSetUploadCounter(data, http->writebytecount); Curl_pgrsSetUploadCounter(data, data->req.writebytecount);
if(Curl_pgrsUpdate(conn)) if(Curl_pgrsUpdate(conn))
result = CURLE_ABORTED_BY_CALLBACK; result = CURLE_ABORTED_BY_CALLBACK;
} }

View File

@ -959,7 +959,7 @@ static CURLcode smtp_state_data_resp(struct connectdata *conn, int smtpcode,
Curl_pgrsSetUploadSize(data, data->state.infilesize); Curl_pgrsSetUploadSize(data, data->state.infilesize);
/* SMTP upload */ /* SMTP upload */
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL); Curl_setup_transfer(data, -1, -1, FALSE, FIRSTSOCKET);
/* End of DO phase */ /* End of DO phase */
state(conn, SMTP_STOP); state(conn, SMTP_STOP);
@ -1388,7 +1388,7 @@ static CURLcode smtp_dophase_done(struct connectdata *conn, bool connected)
if(smtp->transfer != FTPTRANSFER_BODY) if(smtp->transfer != FTPTRANSFER_BODY)
/* no data to transfer */ /* no data to transfer */
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL); Curl_setup_transfer(conn->data, -1, -1, FALSE, -1);
return CURLE_OK; return CURLE_OK;
} }

View File

@ -1200,7 +1200,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
Curl_pgrsSetUploadSize(data, data->state.infilesize); Curl_pgrsSetUploadSize(data, data->state.infilesize);
} }
/* upload data */ /* upload data */
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL); Curl_setup_transfer(data, -1, -1, FALSE, FIRSTSOCKET);
/* not set by Curl_setup_transfer to preserve keepon bits */ /* not set by Curl_setup_transfer to preserve keepon bits */
conn->sockfd = conn->writesockfd; conn->sockfd = conn->writesockfd;
@ -1462,7 +1462,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
sshc->sftp_dir = NULL; sshc->sftp_dir = NULL;
/* no data to transfer */ /* no data to transfer */
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL); Curl_setup_transfer(data, -1, -1, FALSE, -1);
state(conn, SSH_STOP); state(conn, SSH_STOP);
break; break;
@ -1603,13 +1603,12 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
/* Setup the actual download */ /* Setup the actual download */
if(data->req.size == 0) { if(data->req.size == 0) {
/* no data to transfer */ /* no data to transfer */
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL); Curl_setup_transfer(data, -1, -1, FALSE, -1);
infof(data, "File already completely downloaded\n"); infof(data, "File already completely downloaded\n");
state(conn, SSH_STOP); state(conn, SSH_STOP);
break; break;
} }
Curl_setup_transfer(conn, FIRSTSOCKET, data->req.size, Curl_setup_transfer(data, FIRSTSOCKET, data->req.size, FALSE, -1);
FALSE, NULL, -1, NULL);
/* not set by Curl_setup_transfer to preserve keepon bits */ /* not set by Curl_setup_transfer to preserve keepon bits */
conn->writesockfd = conn->sockfd; conn->writesockfd = conn->sockfd;
@ -1731,8 +1730,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
} }
/* upload data */ /* upload data */
Curl_setup_transfer(conn, -1, data->req.size, FALSE, NULL, Curl_setup_transfer(data, -1, data->req.size, FALSE, FIRSTSOCKET);
FIRSTSOCKET, NULL);
/* not set by Curl_setup_transfer to preserve keepon bits */ /* not set by Curl_setup_transfer to preserve keepon bits */
conn->sockfd = conn->writesockfd; conn->sockfd = conn->writesockfd;
@ -1775,8 +1773,7 @@ static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
/* download data */ /* download data */
bytecount = ssh_scp_request_get_size(sshc->scp_session); bytecount = ssh_scp_request_get_size(sshc->scp_session);
data->req.maxdownload = (curl_off_t) bytecount; data->req.maxdownload = (curl_off_t) bytecount;
Curl_setup_transfer(conn, FIRSTSOCKET, bytecount, FALSE, NULL, -1, Curl_setup_transfer(data, FIRSTSOCKET, bytecount, FALSE, -1);
NULL);
/* not set by Curl_setup_transfer to preserve keepon bits */ /* not set by Curl_setup_transfer to preserve keepon bits */
conn->writesockfd = conn->sockfd; conn->writesockfd = conn->sockfd;

View File

@ -1808,7 +1808,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
Curl_pgrsSetUploadSize(data, data->state.infilesize); Curl_pgrsSetUploadSize(data, data->state.infilesize);
} }
/* upload data */ /* upload data */
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, FIRSTSOCKET, NULL); Curl_setup_transfer(data, -1, -1, FALSE, FIRSTSOCKET);
/* not set by Curl_setup_transfer to preserve keepon bits */ /* not set by Curl_setup_transfer to preserve keepon bits */
conn->sockfd = conn->writesockfd; conn->sockfd = conn->writesockfd;
@ -2105,7 +2105,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
Curl_safefree(sshc->readdir_longentry); Curl_safefree(sshc->readdir_longentry);
/* no data to transfer */ /* no data to transfer */
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL); Curl_setup_transfer(data, -1, -1, FALSE, -1);
state(conn, SSH_STOP); state(conn, SSH_STOP);
break; break;
@ -2245,13 +2245,12 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
/* Setup the actual download */ /* Setup the actual download */
if(data->req.size == 0) { if(data->req.size == 0) {
/* no data to transfer */ /* no data to transfer */
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL); Curl_setup_transfer(data, -1, -1, FALSE, -1);
infof(data, "File already completely downloaded\n"); infof(data, "File already completely downloaded\n");
state(conn, SSH_STOP); state(conn, SSH_STOP);
break; break;
} }
Curl_setup_transfer(conn, FIRSTSOCKET, data->req.size, Curl_setup_transfer(data, FIRSTSOCKET, data->req.size, FALSE, -1);
FALSE, NULL, -1, NULL);
/* not set by Curl_setup_transfer to preserve keepon bits */ /* not set by Curl_setup_transfer to preserve keepon bits */
conn->writesockfd = conn->sockfd; conn->writesockfd = conn->sockfd;
@ -2395,8 +2394,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
} }
/* upload data */ /* upload data */
Curl_setup_transfer(conn, -1, data->req.size, FALSE, NULL, Curl_setup_transfer(data, -1, data->req.size, FALSE, FIRSTSOCKET);
FIRSTSOCKET, NULL);
/* not set by Curl_setup_transfer to preserve keepon bits */ /* not set by Curl_setup_transfer to preserve keepon bits */
conn->sockfd = conn->writesockfd; conn->sockfd = conn->writesockfd;
@ -2467,7 +2465,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
/* download data */ /* download data */
bytecount = (curl_off_t)sb.st_size; bytecount = (curl_off_t)sb.st_size;
data->req.maxdownload = (curl_off_t)sb.st_size; data->req.maxdownload = (curl_off_t)sb.st_size;
Curl_setup_transfer(conn, FIRSTSOCKET, bytecount, FALSE, NULL, -1, NULL); Curl_setup_transfer(data, FIRSTSOCKET, bytecount, FALSE, -1);
/* not set by Curl_setup_transfer to preserve keepon bits */ /* not set by Curl_setup_transfer to preserve keepon bits */
conn->writesockfd = conn->sockfd; conn->writesockfd = conn->sockfd;

View File

@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2019, 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
@ -1692,7 +1692,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)
} }
#endif #endif
/* mark this as "no further transfer wanted" */ /* mark this as "no further transfer wanted" */
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL); Curl_setup_transfer(data, -1, -1, FALSE, -1);
return result; return result;
} }

View File

@ -1247,7 +1247,7 @@ static CURLcode tftp_multi_statemach(struct connectdata *conn, bool *done)
*done = (state->state == TFTP_STATE_FIN) ? TRUE : FALSE; *done = (state->state == TFTP_STATE_FIN) ? TRUE : FALSE;
if(*done) if(*done)
/* Tell curl we're done */ /* Tell curl we're done */
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL); Curl_setup_transfer(data, -1, -1, FALSE, -1);
} }
else { else {
/* no timeouts to handle, check our socket */ /* no timeouts to handle, check our socket */
@ -1270,7 +1270,7 @@ static CURLcode tftp_multi_statemach(struct connectdata *conn, bool *done)
*done = (state->state == TFTP_STATE_FIN) ? TRUE : FALSE; *done = (state->state == TFTP_STATE_FIN) ? TRUE : FALSE;
if(*done) if(*done)
/* Tell curl we're done */ /* Tell curl we're done */
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL); Curl_setup_transfer(data, -1, -1, FALSE, -1);
} }
/* if rc == 0, then select() timed out */ /* if rc == 0, then select() timed out */
} }

View File

@ -1198,6 +1198,7 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
(size_t)bytes_written); (size_t)bytes_written);
k->writebytecount += bytes_written; k->writebytecount += bytes_written;
Curl_pgrsSetUploadCounter(data, k->writebytecount);
if((!k->upload_chunky || k->forbidchunk) && if((!k->upload_chunky || k->forbidchunk) &&
(k->writebytecount == data->state.infilesize)) { (k->writebytecount == data->state.infilesize)) {
@ -1231,7 +1232,6 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
} }
} }
Curl_pgrsSetUploadCounter(data, k->writebytecount);
} WHILE_FALSE; /* just to break out from! */ } WHILE_FALSE; /* just to break out from! */
@ -1309,11 +1309,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
k->now = Curl_now(); k->now = Curl_now();
if(didwhat) { if(didwhat) {
/* Update read/write counters */ ;
if(k->bytecountp)
*k->bytecountp = k->bytecount; /* read count */
if(k->writebytecountp)
*k->writebytecountp = k->writebytecount; /* write count */
} }
else { else {
/* no read no write, this is a timeout? */ /* no read no write, this is a timeout? */
@ -1857,8 +1853,7 @@ CURLcode Curl_retry_request(struct connectdata *conn,
if(conn->handler->protocol&PROTO_FAMILY_HTTP) { if(conn->handler->protocol&PROTO_FAMILY_HTTP) {
struct HTTP *http = data->req.protop; if(data->req.writebytecount) {
if(http->writebytecount) {
CURLcode result = Curl_readrewind(conn); CURLcode result = Curl_readrewind(conn);
if(result) { if(result) {
Curl_safefree(*url); Curl_safefree(*url);
@ -1876,24 +1871,17 @@ CURLcode Curl_retry_request(struct connectdata *conn,
*/ */
void void
Curl_setup_transfer( Curl_setup_transfer(
struct connectdata *conn, /* connection data */ struct Curl_easy *data, /* transfer */
int sockindex, /* socket index to read from or -1 */ int sockindex, /* socket index to read from or -1 */
curl_off_t size, /* -1 if unknown at this point */ curl_off_t size, /* -1 if unknown at this point */
bool getheader, /* TRUE if header parsing is wanted */ bool getheader, /* TRUE if header parsing is wanted */
curl_off_t *bytecountp, /* return number of bytes read or NULL */ int writesockindex /* socket index to write to, it may very well be
int writesockindex, /* socket index to write to, it may very well be
the same we read from. -1 disables */ the same we read from. -1 disables */
curl_off_t *writecountp /* return number of bytes written or NULL */
) )
{ {
struct Curl_easy *data; struct SingleRequest *k = &data->req;
struct SingleRequest *k; struct connectdata *conn = data->conn;
DEBUGASSERT(conn != NULL); DEBUGASSERT(conn != NULL);
data = conn->data;
k = &data->req;
DEBUGASSERT((sockindex <= 1) && (sockindex >= -1)); DEBUGASSERT((sockindex <= 1) && (sockindex >= -1));
if(conn->bits.multiplex || conn->httpversion == 20) { if(conn->bits.multiplex || conn->httpversion == 20) {
@ -1912,8 +1900,6 @@ Curl_setup_transfer(
k->getheader = getheader; k->getheader = getheader;
k->size = size; k->size = size;
k->bytecountp = bytecountp;
k->writebytecountp = writecountp;
/* The code sequence below is placed in this function just because all /* The code sequence below is placed in this function just because all
necessary input is not always known in do_complete() as this function may necessary input is not always known in do_complete() as this function may

View File

@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2019, 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
@ -59,15 +59,13 @@ CURLcode Curl_get_upload_buffer(struct Curl_easy *data);
/* This sets up a forthcoming transfer */ /* This sets up a forthcoming transfer */
void void
Curl_setup_transfer (struct connectdata *data, Curl_setup_transfer (struct Curl_easy *data,
int sockindex, /* socket index to read from or -1 */ int sockindex, /* socket index to read from or -1 */
curl_off_t size, /* -1 if unknown at this point */ curl_off_t size, /* -1 if unknown at this point */
bool getheader, /* TRUE if header parsing is wanted */ bool getheader, /* TRUE if header parsing is wanted */
curl_off_t *bytecountp, /* return number of bytes read */ int writesockindex /* socket index to write to. May be
int writesockindex, /* socket index to write to, it may the same we read from. -1
very well be the same we read from. disables */
-1 disables */
curl_off_t *writecountp /* return number of bytes written */
); );
#endif /* HEADER_CURL_TRANSFER_H */ #endif /* HEADER_CURL_TRANSFER_H */

View File

@ -3796,9 +3796,8 @@ static CURLcode create_conn(struct Curl_easy *data,
(void)conn->handler->done(conn, result, FALSE); (void)conn->handler->done(conn, result, FALSE);
goto out; goto out;
} }
Curl_attach_connnection(data, conn);
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, /* no download */ Curl_setup_transfer(data, -1, -1, FALSE, -1);
-1, NULL); /* no upload */
} }
/* since we skip do_init() */ /* since we skip do_init() */
@ -4178,7 +4177,8 @@ CURLcode Curl_connect(struct Curl_easy *data,
connectdata struct, free those here */ connectdata struct, free those here */
Curl_disconnect(data, conn, TRUE); Curl_disconnect(data, conn, TRUE);
} }
else else if(!data->conn)
/* FILE: transfers already have the connection attached */
Curl_attach_connnection(data, conn); Curl_attach_connnection(data, conn);
return result; return result;

View File

@ -538,21 +538,18 @@ struct dohdata {
*/ */
struct SingleRequest { struct SingleRequest {
curl_off_t size; /* -1 if unknown at this point */ curl_off_t size; /* -1 if unknown at this point */
curl_off_t *bytecountp; /* return number of bytes read or NULL */
curl_off_t maxdownload; /* in bytes, the maximum amount of data to fetch, curl_off_t maxdownload; /* in bytes, the maximum amount of data to fetch,
-1 means unlimited */ -1 means unlimited */
curl_off_t *writebytecountp; /* return number of bytes written or NULL */
curl_off_t bytecount; /* total number of bytes read */ curl_off_t bytecount; /* total number of bytes read */
curl_off_t writebytecount; /* number of bytes written */ curl_off_t writebytecount; /* number of bytes written */
long headerbytecount; /* only count received headers */ curl_off_t headerbytecount; /* only count received headers */
long deductheadercount; /* this amount of bytes doesn't count when we check curl_off_t deductheadercount; /* this amount of bytes doesn't count when we
if anything has been transferred at the end of a check if anything has been transferred at
connection. We use this counter to make only a the end of a connection. We use this
100 reply (without a following second response counter to make only a 100 reply (without a
code) result in a CURLE_GOT_NOTHING error code */ following second response code) result in a
CURLE_GOT_NOTHING error code */
struct curltime start; /* transfer started at this time */ struct curltime start; /* transfer started at this time */
struct curltime now; /* current time */ struct curltime now; /* current time */
@ -1046,8 +1043,8 @@ struct PureInfo {
int httpversion; /* the http version number X.Y = X*10+Y */ int httpversion; /* the http version number X.Y = X*10+Y */
time_t filetime; /* If requested, this is might get set. Set to -1 if the time_t filetime; /* If requested, this is might get set. Set to -1 if the
time was unretrievable. */ time was unretrievable. */
long header_size; /* size of read header(s) in bytes */ curl_off_t header_size; /* size of read header(s) in bytes */
long request_size; /* the amount of bytes sent in the request(s) */ curl_off_t request_size; /* the amount of bytes sent in the request(s) */
unsigned long proxyauthavail; /* what proxy auth types were announced */ unsigned long proxyauthavail; /* what proxy auth types were announced */
unsigned long httpauthavail; /* what host auth types were announced */ unsigned long httpauthavail; /* what host auth types were announced */
long numconnects; /* how many new connection did libcurl created */ long numconnects; /* how many new connection did libcurl created */