aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2005-03-04 23:52:06 +0000
committerDaniel Stenberg <daniel@haxx.se>2005-03-04 23:52:06 +0000
commitaa47ac4c066fa125ec1bfef941698f49a548aede (patch)
tree5b31e27d08c105d06d84e7ec5cc8448edcaf8913 /lib
parentb01151e81cfcd9f21f54e616e1872d570bc634e2 (diff)
Added test case 235 that makes a resumed upload of a file that isn't present
on the remote side. This then converts the operation to an ordinary STOR upload. This was requested/pointed out by Ignacio Vazquez-Abrams. It also proved (and I fixed) a bug in the newly rewritten ftp code (and present in the 7.13.1 release) when trying to resume an upload and the servers returns an error to the SIZE command. libcurl then loops and sends SIZE commands infinitely.
Diffstat (limited to 'lib')
-rw-r--r--lib/ftp.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/lib/ftp.c b/lib/ftp.c
index fc73edc86..de5e95db9 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -1339,14 +1339,16 @@ static CURLcode ftp_state_post_cwd(struct connectdata *conn)
/* This is called after the TYPE and possible quote commands have been sent */
-static CURLcode ftp_state_ul_setup(struct connectdata *conn)
+static CURLcode ftp_state_ul_setup(struct connectdata *conn,
+ bool sizechecked)
{
CURLcode result = CURLE_OK;
struct FTP *ftp = conn->proto.ftp;
struct SessionHandle *data = conn->data;
curl_off_t passed=0;
- if(conn->resume_from) {
+ if((conn->resume_from && !sizechecked) ||
+ ((conn->resume_from > 0) && sizechecked)) {
/* 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! The SIZE command is not in
@@ -1480,7 +1482,7 @@ static CURLcode ftp_state_quote(struct connectdata *conn,
state(conn, FTP_RETR_SIZE);
break;
case FTP_STOR_PREQUOTE:
- result = ftp_state_ul_setup(conn);
+ result = ftp_state_ul_setup(conn, FALSE);
break;
case FTP_POSTQUOTE:
break;
@@ -1936,7 +1938,7 @@ static CURLcode ftp_state_size_resp(struct connectdata *conn,
result = ftp_state_post_retr_size(conn, filesize);
else if(instate == FTP_STOR_SIZE) {
conn->resume_from = filesize;
- result = ftp_state_ul_setup(conn);
+ result = ftp_state_ul_setup(conn, TRUE);
}
return result;