- 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.
This commit is contained in:
Daniel Stenberg 2004-10-01 06:36:11 +00:00
Родитель be1cece69b
Коммит 8e87223195
10 изменённых файлов: 103 добавлений и 15 удалений

11
CHANGES
Просмотреть файл

@ -6,6 +6,17 @@
Changelog 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) Daniel (30 September 2004)
- Larry Campbell added CURLINFO_OS_ERRNO to curl_easy_getinfo() that allows an - 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 app to retrieve the errno variable after a (connect) failure. It will make

Просмотреть файл

@ -5,7 +5,7 @@ To get fixed in 7.12.2 (planned release: mid October 2004)
40 - fixed 40 - fixed
41 - Fedor Karpelevitch's formpost path basename patch 41 - fixed
42 - Bertrand Demiddelaer's CURLOPT_VERBOSE may read free()ed data patch 42 - Bertrand Demiddelaer's CURLOPT_VERBOSE may read free()ed data patch

Просмотреть файл

@ -1115,6 +1115,7 @@ AC_CHECK_HEADERS(
utime.h \ utime.h \
sys/utime.h \ sys/utime.h \
sys/poll.h \ sys/poll.h \
libgen.h \
setjmp.h, setjmp.h,
dnl to do if not found dnl to do if not found
[], [],
@ -1197,6 +1198,7 @@ AC_CHECK_FUNCS( strtoll \
dlopen \ dlopen \
utime \ utime \
sigsetjmp \ sigsetjmp \
basename \
poll, poll,
dnl if found dnl if found
[], [],

Просмотреть файл

@ -113,6 +113,9 @@ Content-Disposition: form-data; name="FILECONTENT"
#include <stdarg.h> #include <stdarg.h>
#include <time.h> #include <time.h>
#include <sys/stat.h> #include <sys/stat.h>
#ifdef HAVE_LIBGEN_H
#include <libgen.h>
#endif
#include "formdata.h" #include "formdata.h"
#include "strequal.h" #include "strequal.h"
#include "memory.h" #include "memory.h"
@ -903,6 +906,67 @@ void curl_formfree(struct curl_httppost *form)
} while((form=next)); /* continue */ } 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 * Curl_getFormData() converts a linked list of "meta data" into a complete
* (possibly huge) multipart formdata. The input list is in 'post', while the * (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(post->more) {
/* if multiple-file */ /* if multiple-file */
char *filebasename=
(!file->showfilename)?strippath(file->contents):NULL;
result = AddFormDataf(&form, &size, result = AddFormDataf(&form, &size,
"\r\n--%s\r\nContent-Disposition: " "\r\n--%s\r\nContent-Disposition: "
"attachment; filename=\"%s\"", "attachment; filename=\"%s\"",
fileboundary, fileboundary,
(file->showfilename?file->showfilename: (file->showfilename?file->showfilename:
file->contents)); filebasename));
if (filebasename)
free(filebasename);
if (result) if (result)
break; break;
} }
else if((post->flags & HTTPPOST_FILENAME) || else if((post->flags & HTTPPOST_FILENAME) ||
(post->flags & HTTPPOST_BUFFER)) { (post->flags & HTTPPOST_BUFFER)) {
char *filebasename=
(!post->showfilename)?strippath(post->contents):NULL;
result = AddFormDataf(&form, &size, result = AddFormDataf(&form, &size,
"; filename=\"%s\"", "; filename=\"%s\"",
(post->showfilename?post->showfilename: (post->showfilename?post->showfilename:
post->contents)); filebasename));
if (filebasename)
free(filebasename);
if (result) if (result)
break; break;
} }

Просмотреть файл

@ -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 Host: 127.0.0.1:%HTTPPORT
Pragma: no-cache Pragma: no-cache
Accept: */* Accept: */*
Content-Length: 227 Content-Length: 223
Expect: 100-continue Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------b0b3d6d23991 Content-Type: multipart/form-data; boundary=----------------------------b0b3d6d23991
------------------------------b0b3d6d23991 ------------------------------b0b3d6d23991
Content-Disposition: form-data; name="name"; filename="log/fie ld 166" Content-Disposition: form-data; name="name"; filename="fie ld 166"
Content-Type: application/octet-stream Content-Type: application/octet-stream
data inside the file data inside the 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 Host: 127.0.0.1:%HTTPSPORT
Pragma: no-cache Pragma: no-cache
Accept: */* Accept: */*
Content-Length: 1390 Content-Length: 1386
Expect: 100-continue Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------c3b2ef7f0bb8 Content-Type: multipart/form-data; boundary=----------------------------c3b2ef7f0bb8
@ -51,7 +51,7 @@ Content-Disposition: form-data; name="tool"
curl curl
------------------------------c3b2ef7f0bb8 ------------------------------c3b2ef7f0bb8
Content-Disposition: form-data; name="file"; filename="log/test304.txt" Content-Disposition: form-data; name="file"; filename="test304.txt"
Content-Type: text/plain Content-Type: text/plain
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Просмотреть файл

@ -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 Host: 127.0.0.1:%HTTPPORT
Pragma: no-cache Pragma: no-cache
Accept: */* Accept: */*
Content-Length: 598 Content-Length: 594
Expect: 100-continue Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------24e78000bd32 Content-Type: multipart/form-data; boundary=----------------------------24e78000bd32
@ -63,7 +63,7 @@ bar
foo foo
------------------------------24e78000bd32 ------------------------------24e78000bd32
Content-Disposition: form-data; name="file2"; filename="log/test39.txt" Content-Disposition: form-data; name="file2"; filename="test39.txt"
Content-Type: text/plain Content-Type: text/plain
foo bar foo bar

Просмотреть файл

@ -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 Host: 127.0.0.1:%HTTPPORT
Pragma: no-cache Pragma: no-cache
Accept: */* Accept: */*
Content-Length: 412 Content-Length: 408
Content-Type: multipart/form-data; boundary=----------------------------7c633d5c27ce Content-Type: multipart/form-data; boundary=----------------------------7c633d5c27ce
------------------------------7c633d5c27ce ------------------------------7c633d5c27ce
@ -52,7 +52,7 @@ Content-Disposition: form-data; name="tool"
curl curl
------------------------------7c633d5c27ce ------------------------------7c633d5c27ce
Content-Disposition: form-data; name="file"; filename="log/test44.txt" Content-Disposition: form-data; name="file"; filename="test44.txt"
Content-Type: text/plain Content-Type: text/plain
foo- foo-

Просмотреть файл

@ -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 Host: 127.0.0.1:%HTTPPORT
Pragma: no-cache Pragma: no-cache
Accept: */* Accept: */*
Content-Length: 412 Content-Length: 408
Expect: 100-continue Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763 Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763
@ -58,7 +58,7 @@ Content-Disposition: form-data; name="tool"
curl curl
------------------------------9ef8d6205763 ------------------------------9ef8d6205763
Content-Disposition: form-data; name="file"; filename="log/test71.txt" Content-Disposition: form-data; name="file"; filename="test71.txt"
Content-Type: text/plain Content-Type: text/plain
foo- foo-

Просмотреть файл

@ -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 Host: 127.0.0.1:%HTTPPORT
Pragma: no-cache Pragma: no-cache
Accept: */* Accept: */*
Content-Length: 411 Content-Length: 407
Expect: 100-continue Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763 Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763
@ -53,7 +53,7 @@ Content-Disposition: form-data; name="tool"
curl curl
------------------------------9ef8d6205763 ------------------------------9ef8d6205763
Content-Disposition: form-data; name="file"; filename="log/test9.txt" Content-Disposition: form-data; name="file"; filename="test9.txt"
Content-Type: text/plain Content-Type: text/plain
foo- foo-