From 99dcb11ed8bd78d3af47c6ce3cc6b1fa4c51fdf8 Mon Sep 17 00:00:00 2001 From: Dave Reisner Date: Sat, 29 Jan 2011 22:12:33 -0500 Subject: transfer: add Curl_meets_timecondition() This will be used by file_do() and Curl_readwrite() as a unified method of checking to see if a remote document meets the supplied CURLOPT_TIMEVAL and CURLOPT_TIMECONDITION. Signed-off-by: Dave Reisner --- lib/transfer.c | 59 +++++++++++++++++++++++++++++++++++----------------------- lib/transfer.h | 1 + 2 files changed, 37 insertions(+), 23 deletions(-) diff --git a/lib/transfer.c b/lib/transfer.c index e84b8b14c..f316000a1 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -355,6 +355,37 @@ static void read_rewind(struct connectdata *conn, #endif } +/* + * Check to see if CURLOPT_TIMECONDITION was met by comparing the time of the + * remote document with the time provided by CURLOPT_TIMEVAL + */ +bool Curl_meets_timecondition(struct SessionHandle *data, long timeofdoc) +{ + if((timeofdoc == 0) || (data->set.timevalue == 0)) + return TRUE; + + switch(data->set.timecondition) { + case CURL_TIMECOND_IFMODSINCE: + default: + if(timeofdoc <= data->set.timevalue) { + infof(data, + "The requested document is not new enough\n"); + data->info.timecond = TRUE; + return FALSE; + } + break; + case CURL_TIMECOND_IFUNMODSINCE: + if(timeofdoc >= data->set.timevalue) { + infof(data, + "The requested document is not old enough\n"); + data->info.timecond = TRUE; + return FALSE; + } + break; + } + + return TRUE; +} /* * Go ahead and do a read if we have a readable socket or if @@ -518,29 +549,11 @@ static CURLcode readwrite_data(struct SessionHandle *data, requested. This seems to be what chapter 13.3.4 of RFC 2616 defines to be the correct action for a HTTP/1.1 client */ - if((k->timeofdoc > 0) && (data->set.timevalue > 0)) { - switch(data->set.timecondition) { - case CURL_TIMECOND_IFMODSINCE: - default: - if(k->timeofdoc < data->set.timevalue) { - infof(data, - "The requested document is not new enough\n"); - *done = TRUE; - data->info.timecond = TRUE; - return CURLE_OK; - } - break; - case CURL_TIMECOND_IFUNMODSINCE: - if(k->timeofdoc > data->set.timevalue) { - infof(data, - "The requested document is not old enough\n"); - *done = TRUE; - data->info.timecond = TRUE; - return CURLE_OK; - } - break; - } /* switch */ - } /* two valid time strings */ + + if(!Curl_meets_timecondition(data, k->timeofdoc)) { + *done = TRUE; + return CURLE_OK; + } } /* we have a time condition */ } /* this is HTTP */ diff --git a/lib/transfer.h b/lib/transfer.h index 790e1e3ef..c966cafb0 100644 --- a/lib/transfer.h +++ b/lib/transfer.h @@ -47,6 +47,7 @@ CURLcode Curl_readrewind(struct connectdata *conn); CURLcode Curl_fillreadbuffer(struct connectdata *conn, int bytes, int *nreadp); CURLcode Curl_reconnect_request(struct connectdata **connp); CURLcode Curl_retry_request(struct connectdata *conn, char **url); +bool Curl_meets_timecondition(struct SessionHandle *data, long timeofdoc); /* This sets up a forthcoming transfer */ void -- cgit v1.2.3