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

Made it possible to do "upload resume" over HTTP

parent 68d7b6f8
Loading
Loading
Loading
Loading
+58 −0
Original line number Diff line number Diff line
@@ -471,6 +471,64 @@ CURLcode Curl_http(struct connectdata *conn)
  if(!checkheaders(data, "Accept:"))
    http->p_accept = "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\r\n";

  if((data->bits.http_post ||
      data->bits.http_formpost ||
      data->bits.http_put) &&
     data->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
     * a Range: header that will be passed along. We need to "fast forward"
     * the file the given number of bytes and decrease the assume upload
     * file size before we continue this venture in the dark lands of HTTP.
     *********************************************************************/
   
    if(data->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;
    }

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

      /* Now, let's read off the proper amount of bytes from the
         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 actuallyread;

        if(readthisamountnow > BUFSIZE)
          readthisamountnow = BUFSIZE;

        actuallyread =
          data->fread(data->buffer, 1, readthisamountnow, data->in);

        passed += actuallyread;
        if(actuallyread != readthisamountnow) {
          failf(data, "Could only read %d bytes from the input\n",
                passed);
          return CURLE_READ_ERROR;
        }
      } while(passed != data->resume_from); /* loop until done */

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

        if(data->infilesize <= 0) {
          failf(data, "File already completely uploaded\n");
          return CURLE_PARTIAL_FILE;
        }
      }
      /* we've passed, proceed as normal */
    }
  }

  do {
    send_buffer *req_buffer;
    struct curl_slist *headers=data->headers;