diff options
author | Daniel Stenberg <daniel@haxx.se> | 2007-09-11 22:23:57 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2007-09-11 22:23:57 +0000 |
commit | 9e88343a1722f49cc4045a25d6587262f84d1077 (patch) | |
tree | 2da233a32635966f656272c402aa5b2a3e7cc23f /tests/libtest | |
parent | 1ce732e9d6342d09f1cafaa7b956da3bd00b6aaf (diff) |
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.
Diffstat (limited to 'tests/libtest')
-rw-r--r-- | tests/libtest/Makefile.am | 4 | ||||
-rw-r--r-- | tests/libtest/lib541.c | 117 |
2 files changed, 120 insertions, 1 deletions
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 <sys/socket.h> +#endif +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_STAT_H +#include <sys/stat.h> +#endif +#ifdef HAVE_FCNTL_H +#include <fcntl.h> +#endif + +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#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: <url> <file-to-upload>\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; +} |