Commit 3fd65fb7 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

Remade resume stuff to keep data in the connectdata struct instead of the

main handle struct to work with persistant connections
parent ebcafe73
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -183,11 +183,11 @@ CURLcode Curl_file(struct connectdata *conn)
      return res;

    now = Curl_tvnow();
    if(Curl_pgrsUpdate(data))
    if(Curl_pgrsUpdate(conn))
      res = CURLE_ABORTED_BY_CALLBACK;
  }
  now = Curl_tvnow();
  if(Curl_pgrsUpdate(data))
  if(Curl_pgrsUpdate(conn))
    res = CURLE_ABORTED_BY_CALLBACK;

  close(fd);
+25 −24
Original line number Diff line number Diff line
@@ -1272,7 +1272,7 @@ again:;
        CURLE_FTP_COULDNT_SET_BINARY;
    }

    if(data->resume_from) {
    if(conn->resume_from) {
      /* we're about to continue the uploading of a file */
      /* 1. get already existing file's size. We use the SIZE
         command for this which may not exist in the server!
@@ -1286,7 +1286,7 @@ again:;
      /* 4. lower the infilesize counter */
      /* => transfer as usual */

      if(data->resume_from < 0 ) {
      if(conn->resume_from < 0 ) {
        /* we could've got a specified offset from the command line,
           but now we know we didn't */

@@ -1302,10 +1302,10 @@ again:;
        }

        /* get the size from the ascii string: */
        data->resume_from = atoi(buf+4);
        conn->resume_from = atoi(buf+4);
      }

      if(data->resume_from) {
      if(conn->resume_from) {
        /* do we still game? */
        int passed=0;
        /* enable append instead */
@@ -1315,7 +1315,7 @@ again:;
           input. If we knew it was a proper file we could've just
           fseek()ed but we only have a stream here */
        do {
          int readthisamountnow = (data->resume_from - passed);
          int readthisamountnow = (conn->resume_from - passed);
          int actuallyread;

          if(readthisamountnow > BUFSIZE)
@@ -1331,11 +1331,11 @@ again:;
            return CURLE_FTP_COULDNT_USE_REST;
          }
        }
        while(passed != data->resume_from);
        while(passed != conn->resume_from);

        /* now, decrease the size of the read */
        if(data->infilesize>0) {
          data->infilesize -= data->resume_from;
          data->infilesize -= conn->resume_from;

          if(data->infilesize <= 0) {
            failf(data, "File already completely uploaded\n");
@@ -1387,13 +1387,13 @@ again:;
    bool dirlist=FALSE;
    long downloadsize=-1;

    if(data->bits.set_range && data->range) {
    if(conn->bits.use_range && conn->range) {
      long from, to;
      int totalsize=-1;
      char *ptr;
      char *ptr2;

      from=strtol(data->range, &ptr, 0);
      from=strtol(conn->range, &ptr, 0);
      while(ptr && *ptr && (isspace((int)*ptr) || (*ptr=='-')))
        ptr++;
      to=strtol(ptr, &ptr2, 0);
@@ -1403,22 +1403,23 @@ again:;
      }
      if((-1 == to) && (from>=0)) {
        /* X - */
        data->resume_from = from;
        conn->resume_from = from;
        infof(data, "FTP RANGE %d to end of file\n", from);
      }
      else if(from < 0) {
        /* -Y */
        totalsize = -from;
        conn->maxdownload = -from;
        data->resume_from = from;
        conn->resume_from = from;
        infof(data, "FTP RANGE the last %d bytes\n", totalsize);
      }
      else {
        /* X-Y */
        totalsize = to-from;
        conn->maxdownload = totalsize+1; /* include the last mentioned byte */
        data->resume_from = from;
        infof(data, "FTP RANGE from %d getting %d bytes\n", from, conn->maxdownload);
        conn->resume_from = from;
        infof(data, "FTP RANGE from %d getting %d bytes\n", from,
              conn->maxdownload);
      }
      infof(data, "range-download from %d to %d, totally %d bytes\n",
            from, to, totalsize);
@@ -1466,7 +1467,7 @@ again:;
          CURLE_FTP_COULDNT_SET_BINARY;
      }

      if(data->resume_from) {
      if(conn->resume_from) {

        /* Daniel: (August 4, 1999)
         *
@@ -1491,26 +1492,26 @@ again:;
          int foundsize=atoi(buf+4);
          /* We got a file size report, so we check that there actually is a
             part of the file left to get, or else we go home.  */
          if(data->resume_from< 0) {
          if(conn->resume_from< 0) {
            /* We're supposed to download the last abs(from) bytes */
            if(foundsize < -data->resume_from) {
            if(foundsize < -conn->resume_from) {
              failf(data, "Offset (%d) was beyond file size (%d)",
                    data->resume_from, foundsize);
                    conn->resume_from, foundsize);
              return CURLE_FTP_BAD_DOWNLOAD_RESUME;
            }
            /* convert to size to download */
            downloadsize = -data->resume_from;
            downloadsize = -conn->resume_from;
            /* download from where? */
            data->resume_from = foundsize - downloadsize;
            conn->resume_from = foundsize - downloadsize;
          }
          else {
            if(foundsize < data->resume_from) {
            if(foundsize < conn->resume_from) {
              failf(data, "Offset (%d) was beyond file size (%d)",
                    data->resume_from, foundsize);
                    conn->resume_from, foundsize);
              return CURLE_FTP_BAD_DOWNLOAD_RESUME;
            }
            /* Now store the number of bytes we are expected to download */
            downloadsize = foundsize-data->resume_from;
            downloadsize = foundsize-conn->resume_from;
          }
        }

@@ -1521,9 +1522,9 @@ again:;
	
        /* Set resume file transfer offset */
        infof(data, "Instructs server to resume from offset %d\n",
              data->resume_from);
              conn->resume_from);

        ftpsendf(conn->firstsocket, conn, "REST %d", data->resume_from);
        ftpsendf(conn->firstsocket, conn, "REST %d", conn->resume_from);

        nread = Curl_GetFTPResponse(conn->firstsocket, buf, conn, &ftpcode);
        if(nread < 0)
+14 −14
Original line number Diff line number Diff line
@@ -497,7 +497,7 @@ CURLcode Curl_http(struct connectdata *conn)
  if((data->bits.http_post ||
      data->bits.http_formpost ||
      data->bits.http_put) &&
     data->resume_from) {
     conn->resume_from) {
    /**********************************************************************
     * Resuming upload in HTTP means that we PUT or POST and that we have
     * got a resume_from value set. The resume value has already created
@@ -506,15 +506,15 @@ CURLcode Curl_http(struct connectdata *conn)
     * file size before we continue this venture in the dark lands of HTTP.
     *********************************************************************/
   
    if(data->resume_from < 0 ) {
    if(conn->resume_from < 0 ) {
      /*
       * This is meant to get the size of the present remote-file by itself.
       * We don't support this now. Bail out!
       */
       data->resume_from = 0;
       conn->resume_from = 0;
    }

    if(data->resume_from) {
    if(conn->resume_from) {
      /* do we still game? */
      int passed=0;

@@ -522,7 +522,7 @@ CURLcode Curl_http(struct connectdata *conn)
         input. If we knew it was a proper file we could've just
         fseek()ed but we only have a stream here */
      do {
        int readthisamountnow = (data->resume_from - passed);
        int readthisamountnow = (conn->resume_from - passed);
        int actuallyread;

        if(readthisamountnow > BUFSIZE)
@@ -537,11 +537,11 @@ CURLcode Curl_http(struct connectdata *conn)
                passed);
          return CURLE_READ_ERROR;
        }
      } while(passed != data->resume_from); /* loop until done */
      } while(passed != conn->resume_from); /* loop until done */

      /* now, decrease the size of the read */
      if(data->infilesize>0) {
        data->infilesize -= data->resume_from;
        data->infilesize -= conn->resume_from;

        if(data->infilesize <= 0) {
          failf(data, "File already completely uploaded\n");
@@ -551,7 +551,7 @@ CURLcode Curl_http(struct connectdata *conn)
      /* we've passed, proceed as normal */
    }
  }
  if(data->bits.set_range) {
  if(conn->bits.use_range) {
    /*
     * A range is selected. We use different headers whether we're downloading
     * or uploading and we always let customized headers override our internal
@@ -559,23 +559,23 @@ CURLcode Curl_http(struct connectdata *conn)
     */
    if((data->httpreq == HTTPREQ_GET) &&
       !checkheaders(data, "Range:")) {
      conn->allocptr.rangeline = aprintf("Range: bytes=%s\r\n", data->range);
      conn->allocptr.rangeline = aprintf("Range: bytes=%s\r\n", conn->range);
    }
    else if((data->httpreq != HTTPREQ_GET) &&
            !checkheaders(data, "Content-Range:")) {

      if(data->resume_from) {
      if(conn->resume_from) {
        /* This is because "resume" was selected */
        long total_expected_size= data->resume_from + data->infilesize;
        long total_expected_size= conn->resume_from + data->infilesize;
        conn->allocptr.rangeline = aprintf("Content-Range: bytes %s%ld/%ld\r\n",
                                      data->range, total_expected_size-1,
                                      conn->range, total_expected_size-1,
                                      total_expected_size);
      }
      else {
        /* Range was selected and then we just pass the incoming range and 
           append total size */
        conn->allocptr.rangeline = aprintf("Content-Range: bytes %s/%d\r\n",
                                      data->range, data->infilesize);
                                      conn->range, data->infilesize);
      }
    }
  }
@@ -610,7 +610,7 @@ CURLcode Curl_http(struct connectdata *conn)
                 conn->allocptr.proxyuserpwd)?conn->allocptr.proxyuserpwd:"",
                (conn->bits.user_passwd && conn->allocptr.userpwd)?
                conn->allocptr.userpwd:"",
                (data->bits.set_range && conn->allocptr.rangeline)?
                (conn->bits.use_range && conn->allocptr.rangeline)?
                conn->allocptr.rangeline:"",
                (data->useragent && *data->useragent && conn->allocptr.uagent)?
                conn->allocptr.uagent:"",
+9 −5
Original line number Diff line number Diff line
@@ -91,11 +91,12 @@ static char *max5data(double bytes, char *max5)

*/

void Curl_pgrsDone(struct UrlData *data)
void Curl_pgrsDone(struct connectdata *conn)
{
  struct UrlData *data = conn->data;
  if(!(data->progress.flags & PGRS_HIDE)) {
    data->progress.lastshow=0;
    Curl_pgrsUpdate(data); /* the final (forced) update */
    Curl_pgrsUpdate(conn); /* the final (forced) update */
    fprintf(data->err, "\n");
  }
}
@@ -172,7 +173,7 @@ void Curl_pgrsSetUploadSize(struct UrlData *data, double size)

 */

int Curl_pgrsUpdate(struct UrlData *data)
int Curl_pgrsUpdate(struct connectdata *conn)
{
  struct timeval now;
  int result;
@@ -185,6 +186,8 @@ int Curl_pgrsUpdate(struct UrlData *data)
  double total_transfer;
  double total_expected_transfer;

  struct UrlData *data = conn->data;

  int nowindex = data->progress.speeder_c% CURR_TIME;
  int checkindex;
  int count;
@@ -198,15 +201,16 @@ int Curl_pgrsUpdate(struct UrlData *data)
  
  double total_estimate;


  if(data->progress.flags & PGRS_HIDE)
    ; /* We do enter this function even if we don't wanna see anything, since
         this is were lots of the calculations are being made that will be used
         even when not displayed! */
  else if(!(data->progress.flags & PGRS_HEADERS_OUT)) {
    if (!data->progress.callback) {
      if(data->resume_from)
      if(conn->resume_from)
        fprintf(data->err, "** Resuming transfer from byte position %d\n",
                data->resume_from);
                conn->resume_from);
      fprintf(data->err,
              "  %% Total    %% Received %% Xferd  Average Speed          Time             Curr.\n"
              "                                 Dload  Upload Total    Current  Left    Speed\n");
+2 −2
Original line number Diff line number Diff line
@@ -36,13 +36,13 @@ typedef enum {
  TIMER_LAST /* must be last */
} timerid;
  
void Curl_pgrsDone(struct UrlData *data);
void Curl_pgrsDone(struct connectdata *);
void Curl_pgrsStartNow(struct UrlData *data);
void Curl_pgrsSetDownloadSize(struct UrlData *data, double size);
void Curl_pgrsSetUploadSize(struct UrlData *data, double size);
void Curl_pgrsSetDownloadCounter(struct UrlData *data, double size);
void Curl_pgrsSetUploadCounter(struct UrlData *data, double size);
int Curl_pgrsUpdate(struct UrlData *data);
int Curl_pgrsUpdate(struct connectdata *);
void Curl_pgrsTime(struct UrlData *data, timerid timer);


Loading