diff --git a/docs/curl.1 b/docs/curl.1 index 358ef2d6a..4ca8ee2c2 100644 --- a/docs/curl.1 +++ b/docs/curl.1 @@ -569,6 +569,11 @@ The time, in seconds, it took from the start until the file transfer is just about to begin. This includes all pre-transfer commands and negotiations that are specific to the particular protocol(s) involved. .TP +.B time_starttransfer +The time, in seconds, it took from the start until the first byte is just about +to be transfered. This includes time_pretransfer and also the time the +server needs to calculate the result. +.TP .B size_download The total amount of bytes that were downloaded. .TP diff --git a/docs/curl_easy_getinfo.3 b/docs/curl_easy_getinfo.3 index b6ce3c8c1..73fd461a3 100644 --- a/docs/curl_easy_getinfo.3 +++ b/docs/curl_easy_getinfo.3 @@ -52,6 +52,12 @@ start until the file transfer is just about to begin. This includes all pre-transfer commands and negotiations that are specific to the particular protocol(s) involved. .TP +.B CURLINFO_STARTTRANSFER_TIME +Pass a pointer to a double to receive the time, in seconds, it took from the +start until the first byte is just about to be transfered. This includes +CURLINFO_PRETRANSFER_TIME and also the time the server needs to calculate +the result. +.TP .B CURLINFO_SIZE_UPLOAD Pass a pointer to a double to receive the total amount of bytes that were uploaded. diff --git a/include/curl/curl.h b/include/curl/curl.h index 3a815ad55..48b82d177 100644 --- a/include/curl/curl.h +++ b/include/curl/curl.h @@ -584,8 +584,8 @@ CURLcode curl_global_init(long flags); void curl_global_cleanup(void); /* This is the version number */ -#define LIBCURL_VERSION "7.9.1" -#define LIBCURL_VERSION_NUM 0x070901 +#define LIBCURL_VERSION "7.9.2-pre3" +#define LIBCURL_VERSION_NUM 0x070902 /* linked-list structure for the CURLOPT_QUOTE option (and other) */ struct curl_slist { @@ -635,7 +635,9 @@ typedef enum { CURLINFO_CONTENT_LENGTH_DOWNLOAD = CURLINFO_DOUBLE + 15, CURLINFO_CONTENT_LENGTH_UPLOAD = CURLINFO_DOUBLE + 16, - CURLINFO_LASTONE = 17 + CURLINFO_STARTTRANSFER_TIME = CURLINFO_DOUBLE + 17, + + CURLINFO_LASTONE = 18 } CURLINFO; /* unfortunately, the easy.h include file needs the options and info stuff diff --git a/lib/getinfo.c b/lib/getinfo.c index b502609ea..cdb69ca72 100644 --- a/lib/getinfo.c +++ b/lib/getinfo.c @@ -43,6 +43,7 @@ CURLcode Curl_initinfo(struct SessionHandle *data) pro->t_nslookup = 0; pro->t_connect = 0; pro->t_pretransfer = 0; + pro->t_starttransfer = 0; info->httpcode = 0; info->httpversion=0; @@ -107,6 +108,9 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...) case CURLINFO_PRETRANSFER_TIME: *param_doublep = data->progress.t_pretransfer; break; + case CURLINFO_STARTTRANSFER_TIME: + *param_doublep = data->progress.t_starttransfer; + break; case CURLINFO_SIZE_UPLOAD: *param_doublep = data->progress.uploaded; break; diff --git a/lib/progress.c b/lib/progress.c index 865744654..318a6d872 100644 --- a/lib/progress.c +++ b/lib/progress.c @@ -111,22 +111,24 @@ void Curl_pgrsTime(struct SessionHandle *data, timerid timer) /* mistake filter */ break; case TIMER_STARTSINGLE: - /* This is set at the start of a single fetch, there may be several - fetches within an operation, why we add all other times relative - to this one */ + /* This is set at the start of a single fetch */ data->progress.t_startsingle = Curl_tvnow(); break; case TIMER_NAMELOOKUP: - data->progress.t_nslookup += + data->progress.t_nslookup = (double)Curl_tvdiff(Curl_tvnow(), data->progress.t_startsingle)/1000.0; break; case TIMER_CONNECT: - data->progress.t_connect += + data->progress.t_connect = (double)Curl_tvdiff(Curl_tvnow(), data->progress.t_startsingle)/1000.0; break; case TIMER_PRETRANSFER: - data->progress.t_pretransfer += + data->progress.t_pretransfer = + (double)Curl_tvdiff(Curl_tvnow(), data->progress.t_startsingle)/1000.0; + break; + case TIMER_STARTTRANSFER: + data->progress.t_starttransfer = (double)Curl_tvdiff(Curl_tvnow(), data->progress.t_startsingle)/1000.0; break; case TIMER_POSTRANSFER: @@ -227,7 +229,7 @@ int Curl_pgrsUpdate(struct connectdata *conn) /* The exact time spent so far (from the start) */ timespent = (double)Curl_tvdiff (now, data->progress.start)/1000; - data->progress.timespent = (long)timespent; + data->progress.timespent = timespent; /* The average download speed this far */ data->progress.dlspeed = diff --git a/lib/progress.h b/lib/progress.h index 3d0a6b084..2d4598414 100644 --- a/lib/progress.h +++ b/lib/progress.h @@ -31,6 +31,7 @@ typedef enum { TIMER_NAMELOOKUP, TIMER_CONNECT, TIMER_PRETRANSFER, + TIMER_STARTTRANSFER, TIMER_POSTRANSFER, TIMER_STARTSINGLE, TIMER_LAST /* must be last */ diff --git a/lib/transfer.c b/lib/transfer.c index 163b2cb84..b59c9f2f7 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -305,6 +305,8 @@ Transfer(struct connectdata *c_conn) } break; default: + if ((bytecount == 0) && (writebytecount == 0)) + Curl_pgrsTime(data, TIMER_STARTTRANSFER); if((keepon & KEEP_READ) && FD_ISSET(conn->sockfd, &readfd)) { /* read! */ urg = Curl_read(conn, conn->sockfd, buf, BUFSIZE -1, &nread); diff --git a/lib/urldata.h b/lib/urldata.h index a8f1ebe78..6749113fe 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -374,7 +374,7 @@ struct Progress { int width; /* screen width at download start */ int flags; /* see progress.h */ - long timespent; + double timespent; double dlspeed; double ulspeed; @@ -382,6 +382,7 @@ struct Progress { double t_nslookup; double t_connect; double t_pretransfer; + double t_starttransfer; struct timeval start; struct timeval t_startsingle; diff --git a/src/writeout.c b/src/writeout.c index 2c1b3aa24..a786d2d07 100644 --- a/src/writeout.c +++ b/src/writeout.c @@ -37,6 +37,7 @@ typedef enum { VAR_NAMELOOKUP_TIME, VAR_CONNECT_TIME, VAR_PRETRANSFER_TIME, + VAR_STARTTRANSFER_TIME, VAR_SIZE_DOWNLOAD, VAR_SIZE_UPLOAD, VAR_SPEED_DOWNLOAD, @@ -61,6 +62,7 @@ static struct variable replacements[]={ {"time_namelookup", VAR_NAMELOOKUP_TIME}, {"time_connect", VAR_CONNECT_TIME}, {"time_pretransfer", VAR_PRETRANSFER_TIME}, + {"time_starttransfer", VAR_STARTTRANSFER_TIME}, {"size_header", VAR_HEADER_SIZE}, {"size_request", VAR_REQUEST_SIZE}, {"size_download", VAR_SIZE_DOWNLOAD}, @@ -138,6 +140,11 @@ void ourWriteOut(CURL *curl, char *writeinfo) curl_easy_getinfo(curl, CURLINFO_PRETRANSFER_TIME, &doubleinfo)) fprintf(stream, "%.3f", doubleinfo); break; + case VAR_STARTTRANSFER_TIME: + if(CURLE_OK == + curl_easy_getinfo(curl, CURLINFO_STARTTRANSFER_TIME, &doubleinfo)) + fprintf(stream, "%.3f", doubleinfo); + break; case VAR_SIZE_UPLOAD: if(CURLE_OK == curl_easy_getinfo(curl, CURLINFO_SIZE_UPLOAD, &doubleinfo))