Commit 99dcb11e authored by Dave Reisner's avatar Dave Reisner Committed by Kamil Dudka
Browse files

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: default avatarDave Reisner <d@falconindy.com>
parent 819dfddc
Loading
Loading
Loading
Loading
+36 −23
Original line number Diff line number Diff line
@@ -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");

            if(!Curl_meets_timecondition(data, k->timeofdoc)) {
              *done = TRUE;
                  data->info.timecond = TRUE;
              return CURLE_OK;
            }
                break;
              } /* switch */
            } /* two valid time strings */
          } /* we have a time condition */

        } /* this is HTTP */
+1 −0
Original line number Diff line number Diff line
@@ -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