From 9e88343a1722f49cc4045a25d6587262f84d1077 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Tue, 11 Sep 2007 22:23:57 +0000 Subject: Daniel S (12 September 2007) - Bug report #1792649 (http://curl.haxx.se/bug/view.cgi?id=1792649) pointed out a problem with doing an empty upload over FTP on a re-used connection. I added test case 541 to reproduce it and to verify the fix. - I noticed while writing test 541 that the FTP code wrongly did a CWD on the second transfer as it didn't store and remember the "" path from the previous transfer so it would instead CWD to the entry path as stored. This worked, but did a superfluous command. Thus, test case 541 now also verifies this fix. --- tests/data/Makefile.am | 2 +- tests/data/test541 | 51 ++++++++++++++++++++ tests/libtest/Makefile.am | 4 +- tests/libtest/lib541.c | 117 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 172 insertions(+), 2 deletions(-) create mode 100644 tests/data/test541 create mode 100644 tests/libtest/lib541.c (limited to 'tests') diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index 87e7c581f..9d818b85a 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -44,4 +44,4 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \ test409 test613 test614 test700 test701 test702 test704 test705 test703 \ test706 test707 test350 test351 test352 test353 test289 test540 test354 \ test231 test1000 test1001 test1002 test1003 test1004 test1005 test1006 \ - test615 test1007 + test615 test1007 test541 diff --git a/tests/data/test541 b/tests/data/test541 new file mode 100644 index 000000000..ce4c91116 --- /dev/null +++ b/tests/data/test541 @@ -0,0 +1,51 @@ + +# Server-side + + + +# Client-side + + +ftp + +# tool is what to use instead of 'curl' + +lib541 + + + +FTP upload and upload same file again without rewind + + +ftp://%HOSTIP:%FTPPORT/541 log/upload541 + + +Contents +of +a file +to verify +ftp +upload + + +works? + + + +# Verify data after the test has been "shot" + + + + +USER anonymous +PASS ftp@example.com +PWD +EPSV +TYPE I +STOR 541 +EPSV +STOR 541 +QUIT + + + diff --git a/tests/libtest/Makefile.am b/tests/libtest/Makefile.am index c511a6e16..dc55afce7 100644 --- a/tests/libtest/Makefile.am +++ b/tests/libtest/Makefile.am @@ -47,7 +47,7 @@ SUPPORTFILES = first.c test.h noinst_PROGRAMS = lib500 lib501 lib502 lib503 lib504 lib505 lib506 \ lib507 lib508 lib509 lib510 lib511 lib512 lib513 lib514 lib515 lib516 \ lib517 lib518 lib519 lib520 lib521 lib523 lib524 lib525 lib526 lib527 \ - lib529 lib530 lib532 lib533 lib536 lib537 lib540 + lib529 lib530 lib532 lib533 lib536 lib537 lib540 lib541 # Dependencies (may need to be overriden) LDADD = $(LIBDIR)/libcurl.la @@ -126,3 +126,5 @@ lib536_SOURCES = lib536.c $(SUPPORTFILES) $(TESTUTIL) lib537_SOURCES = lib537.c $(SUPPORTFILES) lib540_SOURCES = lib540.c $(SUPPORTFILES) + +lib541_SOURCES = lib541.c $(SUPPORTFILES) diff --git a/tests/libtest/lib541.c b/tests/libtest/lib541.c new file mode 100644 index 000000000..3ab1e2595 --- /dev/null +++ b/tests/libtest/lib541.c @@ -0,0 +1,117 @@ +/***************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * $Id$ + */ + +#include "setup.h" /* struct_stat etc. */ +#include "test.h" + +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif + +#ifdef HAVE_UNISTD_H +#include +#endif + +/* + * Two FTP uploads, the second with no content sent. + */ + +int test(char *URL) +{ + CURL *curl; + CURLcode res = CURLE_OK; + FILE *hd_src ; + int hd ; + struct_stat file_info; + int error; + + if (!arg2) { + fprintf(stderr, "Usage: \n"); + return -1; + } + + /* get the file size of the local file */ + hd = stat(arg2, &file_info); + if(hd == -1) { + /* can't open file, bail out */ + error = ERRNO; + fprintf(stderr, "stat() failed with error: %d %s\n", + error, strerror(error)); + fprintf(stderr, "WARNING: cannot open file %s\n", arg2); + return -1; + } + + if(! file_info.st_size) { + fprintf(stderr, "WARNING: file %s has no size!\n", arg2); + return -4; + } + + /* get a FILE * of the same file, could also be made with + fdopen() from the previous descriptor, but hey this is just + an example! */ + hd_src = fopen(arg2, "rb"); + if(NULL == hd_src) { + error = ERRNO; + fprintf(stderr, "fopen() failed with error: %d %s\n", + error, strerror(error)); + fprintf(stderr, "Error opening file: %s\n", arg2); + return -2; /* if this happens things are major weird */ + } + + if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { + fprintf(stderr, "curl_global_init() failed\n"); + fclose(hd_src); + return TEST_ERR_MAJOR_BAD; + } + + /* get a curl handle */ + if ((curl = curl_easy_init()) == NULL) { + fprintf(stderr, "curl_easy_init() failed\n"); + curl_global_cleanup(); + fclose(hd_src); + return TEST_ERR_MAJOR_BAD; + } + + /* enable uploading */ + curl_easy_setopt(curl, CURLOPT_UPLOAD, TRUE) ; + + /* enable verbose */ + curl_easy_setopt(curl, CURLOPT_VERBOSE, TRUE) ; + + /* specify target */ + curl_easy_setopt(curl,CURLOPT_URL, URL); + + /* now specify which file to upload */ + curl_easy_setopt(curl, CURLOPT_INFILE, hd_src); + + /* Now run off and do what you've been told! */ + res = curl_easy_perform(curl); + + /* and now upload the exact same again, but without rewinding so it already + is at end of file */ + res = curl_easy_perform(curl); + + /* close the local file */ + fclose(hd_src); + + curl_easy_cleanup(curl); + curl_global_cleanup(); + + return res; +} -- cgit v1.2.3