]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
- Based on Fedor Karpelevitch's formpost path basename patch, file parts in
authorDaniel Stenberg <daniel@haxx.se>
Fri, 1 Oct 2004 06:36:11 +0000 (06:36 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 1 Oct 2004 06:36:11 +0000 (06:36 +0000)
  formposts no longer include the path part. If you _really_ want them, you
  must provide your preferred full file name with CURLFORM_FILENAME.

  Added detection for libgen.h and basename() to configure. My custom
  basename() replacement function for systems without it, might be a bit too
  naive...

  Updated 6 test cases to make them work with the stripped paths.

CHANGES
TODO-RELEASE
configure.ac
lib/formdata.c
tests/data/test166
tests/data/test304
tests/data/test39
tests/data/test44
tests/data/test71
tests/data/test9

diff --git a/CHANGES b/CHANGES
index 3ca44ef21fef1c0b24c59bdb794274d13568c11f..715e32bd2a0b0a398cd7c31b04f3ce879d28ac5c 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,17 @@
 
                                   Changelog
 
+Daniel (1 October 2004)
+- Based on Fedor Karpelevitch's formpost path basename patch, file parts in
+  formposts no longer include the path part. If you _really_ want them, you
+  must provide your preferred full file name with CURLFORM_FILENAME.
+
+  Added detection for libgen.h and basename() to configure. My custom
+  basename() replacement function for systems without it, might be a bit too
+  naive...
+
+  Updated 6 test cases to make them work with the stripped paths.
+
 Daniel (30 September 2004)
 - Larry Campbell added CURLINFO_OS_ERRNO to curl_easy_getinfo() that allows an
   app to retrieve the errno variable after a (connect) failure. It will make
index af7ec548143159cf082a44968233251d8746f495..11c7d33199d8cc2a47977e843e790e9e065c368d 100644 (file)
@@ -5,7 +5,7 @@ To get fixed in 7.12.2 (planned release: mid October 2004)
 
 40 - fixed
 
-41 - Fedor Karpelevitch's formpost path basename patch
+41 - fixed
 
 42 - Bertrand Demiddelaer's CURLOPT_VERBOSE may read free()ed data patch
 
index ef7fc52f105c437e856de0109735efc2f93127e5..c94cbcfa7d11e6ee546dc2430e262c77ac93dc55 100644 (file)
@@ -1115,6 +1115,7 @@ AC_CHECK_HEADERS(
         utime.h \
         sys/utime.h \
         sys/poll.h \
+        libgen.h \
         setjmp.h,
 dnl to do if not found
 [],
@@ -1197,6 +1198,7 @@ AC_CHECK_FUNCS( strtoll \
                 dlopen \
                 utime \
                 sigsetjmp \
+                basename \
                 poll,
 dnl if found
 [],
index 9c7fc8be27992f24e64139b4a4f91f6ed372db99..798303d3ab8b47822a4d3e2297c513a745ffee75 100644 (file)
@@ -113,6 +113,9 @@ Content-Disposition: form-data; name="FILECONTENT"
 #include <stdarg.h>
 #include <time.h>
 #include <sys/stat.h>
+#ifdef HAVE_LIBGEN_H
+#include <libgen.h>
+#endif
 #include "formdata.h"
 #include "strequal.h"
 #include "memory.h"
@@ -903,6 +906,67 @@ void curl_formfree(struct curl_httppost *form)
   } while((form=next)); /* continue */
 }
 
+#ifndef HAVE_BASENAME
+/*
+  (Quote from The Open Group Base Specifications Issue 6 IEEE Std 1003.1, 2004
+  Edition)
+
+  The basename() function shall take the pathname pointed to by path and
+  return a pointer to the final component of the pathname, deleting any
+  trailing '/' characters.
+
+  If the string pointed to by path consists entirely of the '/' character,
+  basename() shall return a pointer to the string "/". If the string pointed
+  to by path is exactly "//", it is implementation-defined whether '/' or "//"
+  is returned.
+
+  If path is a null pointer or points to an empty string, basename() shall
+  return a pointer to the string ".".
+
+  The basename() function may modify the string pointed to by path, and may
+  return a pointer to static storage that may then be overwritten by a
+  subsequent call to basename().
+
+  The basename() function need not be reentrant. A function that is not
+  required to be reentrant is not required to be thread-safe.
+
+*/
+char *basename(char *path)
+{
+  /* Ignore all the details above for now and make a quick and simple
+     implementaion here */
+  char *s1;
+  char *s2;
+
+  s1=strrchr(path, '/');
+  s2=strrchr(path, '\\');
+
+  if(s1 && s2) {
+    path = (s1 > s2? s1 : s2)+1;
+  }
+  else {
+    path = (s1 ? s1 : s2)+1;
+  }
+
+  return path;
+}
+#endif
+
+static char *strippath(char *fullfile)
+{
+  char *filename;
+  char *base;
+  filename = strdup(fullfile); /* duplicate since basename() may ruin the
+                                  buffer it works on */
+  if(!filename)
+    return NULL;
+  base = strdup(basename(filename));
+
+  free(filename); /* free temporary buffer */
+
+  return base; /* returns an allocated string! */
+}
+
 /*
  * Curl_getFormData() converts a linked list of "meta data" into a complete
  * (possibly huge) multipart formdata. The input list is in 'post', while the
@@ -998,22 +1062,33 @@ CURLcode Curl_getFormData(struct FormData **finalform,
 
       if(post->more) {
         /* if multiple-file */
+        char *filebasename=
+          (!file->showfilename)?strippath(file->contents):NULL;
+
         result = AddFormDataf(&form, &size,
                               "\r\n--%s\r\nContent-Disposition: "
                               "attachment; filename=\"%s\"",
                               fileboundary,
                               (file->showfilename?file->showfilename:
-                               file->contents));
+                               filebasename));
+        if (filebasename)
+          free(filebasename);
         if (result)
           break;
       }
       else if((post->flags & HTTPPOST_FILENAME) ||
               (post->flags & HTTPPOST_BUFFER)) {
 
+        char *filebasename=
+          (!post->showfilename)?strippath(post->contents):NULL;
+
         result = AddFormDataf(&form, &size,
                               "; filename=\"%s\"",
                               (post->showfilename?post->showfilename:
-                               post->contents));
+                               filebasename));
+        if (filebasename)
+          free(filebasename);
+
         if (result)
           break;
       }
index 07a0675ef9282f770bd3ba41049195af554c2b3d..9a9704b0e3c2cfde22e39f46055526e440b2e02f 100644 (file)
@@ -37,12 +37,12 @@ User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6
 Host: 127.0.0.1:%HTTPPORT\r
 Pragma: no-cache\r
 Accept: */*\r
-Content-Length: 227\r
+Content-Length: 223\r
 Expect: 100-continue\r
 Content-Type: multipart/form-data; boundary=----------------------------b0b3d6d23991\r
 \r
 ------------------------------b0b3d6d23991\r
-Content-Disposition: form-data; name="name"; filename="log/fie ld 166"\r
+Content-Disposition: form-data; name="name"; filename="fie ld 166"\r
 Content-Type: application/octet-stream\r
 \r
 data inside the file
index 75751c2c051467eca224d72f79b0bfa32ed40202..8aaff245f9842179585ff53f3a79c01af7c83ca1 100644 (file)
@@ -38,7 +38,7 @@ User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 z
 Host: 127.0.0.1:%HTTPSPORT\r
 Pragma: no-cache\r
 Accept: */*\r
-Content-Length: 1390\r
+Content-Length: 1386\r
 Expect: 100-continue\r
 Content-Type: multipart/form-data; boundary=----------------------------c3b2ef7f0bb8\r
 \r
@@ -51,7 +51,7 @@ Content-Disposition: form-data; name="tool"
 \r
 curl\r
 ------------------------------c3b2ef7f0bb8\r
-Content-Disposition: form-data; name="file"; filename="log/test304.txt"\r
+Content-Disposition: form-data; name="file"; filename="test304.txt"\r
 Content-Type: text/plain\r
 \r
 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
index 96b4661a24dc81b02c54d8b5ccd6fd7f46ecf5ff..15f9e9358e661aad4d0f13f9ba3f11e4dfb3512b 100644 (file)
@@ -41,7 +41,7 @@ User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 z
 Host: 127.0.0.1:%HTTPPORT\r
 Pragma: no-cache\r
 Accept: */*\r
-Content-Length: 598\r
+Content-Length: 594\r
 Expect: 100-continue\r
 Content-Type: multipart/form-data; boundary=----------------------------24e78000bd32\r
 \r
@@ -63,7 +63,7 @@ bar
 foo
 \r
 ------------------------------24e78000bd32\r
-Content-Disposition: form-data; name="file2"; filename="log/test39.txt"\r
+Content-Disposition: form-data; name="file2"; filename="test39.txt"\r
 Content-Type: text/plain\r
 \r
 foo bar
index dfd50250d0a2d5c4e7005b81ba98655efcfb33ab..e858786da926dfe48f7661347971485ee3270f8e 100644 (file)
@@ -40,7 +40,7 @@ User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 z
 Host: 127.0.0.1:%HTTPPORT\r
 Pragma: no-cache\r
 Accept: */*\r
-Content-Length: 412\r
+Content-Length: 408\r
 Content-Type: multipart/form-data; boundary=----------------------------7c633d5c27ce\r
 \r
 ------------------------------7c633d5c27ce\r
@@ -52,7 +52,7 @@ Content-Disposition: form-data; name="tool"
 \r
 curl\r
 ------------------------------7c633d5c27ce\r
-Content-Disposition: form-data; name="file"; filename="log/test44.txt"\r
+Content-Disposition: form-data; name="file"; filename="test44.txt"\r
 Content-Type: text/plain\r
 \r
 foo-
index 5619d5e884abc49ea6da36f64e6b4d0585c8b1f2..e18917b956ced52ee2860a947ec6368095b76119 100644 (file)
@@ -45,7 +45,7 @@ User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 z
 Host: 127.0.0.1:%HTTPPORT\r
 Pragma: no-cache\r
 Accept: */*\r
-Content-Length: 412\r
+Content-Length: 408\r
 Expect: 100-continue\r
 Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763\r
 \r
@@ -58,7 +58,7 @@ Content-Disposition: form-data; name="tool"
 \r
 curl\r
 ------------------------------9ef8d6205763\r
-Content-Disposition: form-data; name="file"; filename="log/test71.txt"\r
+Content-Disposition: form-data; name="file"; filename="test71.txt"\r
 Content-Type: text/plain\r
 \r
 foo-
index f94b24174dce26cae243428cce556b7d318dc189..370137065bb197bc721c5ecee884982c1171eb83 100644 (file)
@@ -40,7 +40,7 @@ User-Agent: curl/7.10.4 (i686-pc-linux-gnu) libcurl/7.10.4 OpenSSL/0.9.7a ipv6 z
 Host: 127.0.0.1:%HTTPPORT\r
 Pragma: no-cache\r
 Accept: */*\r
-Content-Length: 411\r
+Content-Length: 407\r
 Expect: 100-continue\r
 Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763\r
 \r
@@ -53,7 +53,7 @@ Content-Disposition: form-data; name="tool"
 \r
 curl\r
 ------------------------------9ef8d6205763\r
-Content-Disposition: form-data; name="file"; filename="log/test9.txt"\r
+Content-Disposition: form-data; name="file"; filename="test9.txt"\r
 Content-Type: text/plain\r
 \r
 foo-