- 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:
Родитель
be1cece69b
Коммит
8e87223195
11
CHANGES
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-
|
||||||
|
|
Загрузка…
Ссылка в новой задаче