mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 23:58:49 -05:00
form API: add new test 650.
Now that the form API is deprecated and not used anymore in curl tool, a lot of its features left untested. Test 650 attempts to check all these features not tested elsewhere.
This commit is contained in:
parent
3dab9f6c71
commit
3620e569b3
@ -78,7 +78,7 @@ test608 test609 test610 test611 test612 test613 test614 test615 test616 \
|
||||
test617 test618 test619 test620 test621 test622 test623 test624 test625 \
|
||||
test626 test627 test628 test629 test630 test631 test632 test633 test634 \
|
||||
test635 test636 test637 test638 test639 test640 test641 test642 \
|
||||
test643 test644 test645 test646 test647 test648 test649 \
|
||||
test643 test644 test645 test646 test647 test648 test649 test650 \
|
||||
\
|
||||
test700 test701 test702 test703 test704 test705 test706 test707 test708 \
|
||||
test709 test710 test711 test712 test713 test714 test715 \
|
||||
|
122
tests/data/test650
Normal file
122
tests/data/test650
Normal file
@ -0,0 +1,122 @@
|
||||
<testcase>
|
||||
<info>
|
||||
<keywords>
|
||||
HTTP
|
||||
HTTP POST
|
||||
FORM
|
||||
</keywords>
|
||||
</info>
|
||||
|
||||
#
|
||||
# Server-side
|
||||
<reply>
|
||||
<data>
|
||||
HTTP/1.1 200 OK
|
||||
Date: Thu, 09 Nov 2010 14:49:00 GMT
|
||||
Server: test-server/fake swsclose
|
||||
Connection: close
|
||||
Content-Type: text/html
|
||||
|
||||
hello
|
||||
</data>
|
||||
</reply>
|
||||
|
||||
# Client-side
|
||||
<client>
|
||||
<server>
|
||||
http
|
||||
</server>
|
||||
# tool is what to use instead of 'curl'
|
||||
<tool>
|
||||
lib650
|
||||
</tool>
|
||||
|
||||
<name>
|
||||
HTTP formpost using form API
|
||||
</name>
|
||||
<stdin>
|
||||
Some data from stdin
|
||||
</stdin>
|
||||
<command>
|
||||
http://%HOSTIP:%HTTPPORT/650 log/test650.filedata
|
||||
</command>
|
||||
<file name="log/test650.filedata">
|
||||
This is data from a file.
|
||||
</file>
|
||||
</client>
|
||||
|
||||
#
|
||||
# Verify data after the test has been "shot"
|
||||
<verify>
|
||||
<strippart>
|
||||
s/^--------------------------[a-z0-9]*/------------------------------/
|
||||
s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
|
||||
</strippart>
|
||||
# Note that the stripping above removes 12 bytes from every occurrence of the
|
||||
# boundary string and since 5 of them are in the body contents, we see
|
||||
# (5*12) == 60 bytes less
|
||||
<protocol>
|
||||
POST /650 HTTP/1.1
|
||||
Host: 127.0.0.1:8990
|
||||
Accept: */*
|
||||
Transfer-Encoding: chunked
|
||||
Content-Type: multipart/form-data; boundary=----------------------------
|
||||
Expect: 100-continue
|
||||
|
||||
5f0
|
||||
------------------------------
|
||||
Content-Disposition: form-data; name="fieldname"
|
||||
|
||||
this is what we post to the silly web server
|
||||
------------------------------
|
||||
Content-Disposition: form-data; name="fieldnam"
|
||||
|
||||
uhis is what we post to the silly web serve
|
||||
------------------------------
|
||||
Content-Disposition: form-data; name="multifile"
|
||||
Content-Type: multipart/mixed; boundary=----------------------------
|
||||
|
||||
------------------------------
|
||||
Content-Disposition: attachment; filename="test650.filedata"
|
||||
Content-Type: application/octet-stream
|
||||
|
||||
This is data from a file.
|
||||
|
||||
------------------------------
|
||||
Content-Disposition: attachment; filename="test650.filedata"
|
||||
Content-Type: text/whatever
|
||||
|
||||
This is data from a file.
|
||||
|
||||
------------------------------
|
||||
Content-Disposition: attachment; filename="test650.filedata"
|
||||
Content-Type: text/whatever
|
||||
|
||||
This is data from a file.
|
||||
|
||||
--------------------------------
|
||||
|
||||
------------------------------
|
||||
Content-Disposition: form-data; name="filecontents"
|
||||
X-customheader-1: Header 1 data
|
||||
X-customheader-2: Header 2 data
|
||||
|
||||
This is data from a file.
|
||||
|
||||
------------------------------
|
||||
Content-Disposition: form-data; name="formlength"
|
||||
|
||||
1341
|
||||
------------------------------
|
||||
Content-Disposition: form-data; name="standardinput"
|
||||
Content-Type: application/octet-stream
|
||||
|
||||
Some data from stdin
|
||||
|
||||
--------------------------------
|
||||
|
||||
0
|
||||
|
||||
</protocol>
|
||||
</verify>
|
||||
</testcase>
|
@ -20,7 +20,7 @@ noinst_PROGRAMS = chkhostname libauthretry libntlmconnect \
|
||||
lib559 lib560 lib562 lib564 lib565 lib566 lib567 lib568 lib569 lib570 \
|
||||
lib571 lib572 lib573 lib574 lib575 lib576 lib578 lib579 lib582 \
|
||||
lib583 lib585 lib586 lib587 lib589 lib590 lib591 lib597 lib598 lib599 \
|
||||
lib643 lib644 lib645 \
|
||||
lib643 lib644 lib645 lib650 \
|
||||
lib1500 lib1501 lib1502 lib1503 lib1504 lib1505 lib1506 lib1507 lib1508 \
|
||||
lib1509 lib1510 lib1511 lib1512 lib1513 lib1514 lib1515 lib1517 \
|
||||
lib1520 lib1521 \
|
||||
@ -312,6 +312,9 @@ lib644_CPPFLAGS = $(AM_CPPFLAGS) -DLIB644
|
||||
lib645_SOURCES = lib643.c $(SUPPORTFILES)
|
||||
lib645_CPPFLAGS = $(AM_CPPFLAGS) -DLIB645
|
||||
|
||||
lib650_SOURCES = lib650.c $(SUPPORTFILES)
|
||||
lib650_CPPFLAGS = $(AM_CPPFLAGS)
|
||||
|
||||
lib1500_SOURCES = lib1500.c $(SUPPORTFILES) $(TESTUTIL)
|
||||
lib1500_LDADD = $(TESTUTIL_LIBS)
|
||||
lib1500_CPPFLAGS = $(AM_CPPFLAGS)
|
||||
|
189
tests/libtest/lib650.c
Normal file
189
tests/libtest/lib650.c
Normal file
@ -0,0 +1,189 @@
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
* are also available at https://curl.haxx.se/docs/copyright.html.
|
||||
*
|
||||
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||
* copies of the Software, and permit persons to whom the Software is
|
||||
* furnished to do so, under the terms of the COPYING file.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include "test.h"
|
||||
|
||||
#include "memdebug.h"
|
||||
|
||||
static char data[] =
|
||||
#ifdef CURL_DOES_CONVERSIONS
|
||||
/* ASCII representation with escape sequences for non-ASCII platforms */
|
||||
"\x74\x68\x69\x73\x20\x69\x73\x20\x77\x68\x61\x74\x20\x77\x65\x20\x70"
|
||||
"\x6f\x73\x74\x20\x74\x6f\x20\x74\x68\x65\x20\x73\x69\x6c\x6c\x79\x20"
|
||||
"\x77\x65\x62\x20\x73\x65\x72\x76\x65\x72";
|
||||
#else
|
||||
"this is what we post to the silly web server";
|
||||
#endif
|
||||
|
||||
static char name[] = "fieldname";
|
||||
|
||||
|
||||
/* This test attempts to use all form API features that are not
|
||||
* used elsewhere.
|
||||
*/
|
||||
|
||||
/* curl_formget callback to count characters. */
|
||||
static size_t count_chars(void *userp, const char *buf, size_t len)
|
||||
{
|
||||
size_t *pcounter = (size_t *) userp;
|
||||
|
||||
(void) buf;
|
||||
*pcounter += len;
|
||||
return len;
|
||||
}
|
||||
|
||||
|
||||
int test(char *URL)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res = CURLE_OK;
|
||||
CURLFORMcode formrc;
|
||||
struct curl_slist *headers = NULL;
|
||||
struct curl_httppost *formpost = NULL;
|
||||
struct curl_httppost *lastptr = NULL;
|
||||
struct curl_forms formarray[3];
|
||||
size_t formlength = 0;
|
||||
char flbuf[32];
|
||||
|
||||
if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
|
||||
fprintf(stderr, "curl_global_init() failed\n");
|
||||
return TEST_ERR_MAJOR_BAD;
|
||||
}
|
||||
|
||||
/* Check proper name and data copying. */
|
||||
formrc = curl_formadd(&formpost, &lastptr,
|
||||
CURLFORM_COPYNAME, &name,
|
||||
CURLFORM_COPYCONTENTS, &data,
|
||||
CURLFORM_END);
|
||||
|
||||
if(formrc)
|
||||
printf("curl_formadd(1) = %d\n", (int) formrc);
|
||||
|
||||
/* Use a form array for the non-copy test. */
|
||||
formarray[0].option = CURLFORM_PTRCONTENTS;
|
||||
formarray[0].value = data;
|
||||
formarray[1].option = CURLFORM_CONTENTSLENGTH;
|
||||
formarray[1].value = (char *) strlen(data) - 1;
|
||||
formarray[2].option = CURLFORM_END;
|
||||
formarray[2].value = NULL;
|
||||
formrc = curl_formadd(&formpost,
|
||||
&lastptr,
|
||||
CURLFORM_PTRNAME, name,
|
||||
CURLFORM_NAMELENGTH, strlen(name) - 1,
|
||||
CURLFORM_ARRAY, formarray,
|
||||
CURLFORM_FILENAME, "remotefile.txt",
|
||||
CURLFORM_END);
|
||||
|
||||
if(formrc)
|
||||
printf("curl_formadd(2) = %d\n", (int) formrc);
|
||||
|
||||
/* Now change in-memory data to affect CURLOPT_PTRCONTENTS value.
|
||||
Copied values (first field) must not be affected.
|
||||
CURLOPT_PTRNAME actually copies the name thus we do not test this here. */
|
||||
data[0]++;
|
||||
|
||||
/* Check multi-files and content type propagation. */
|
||||
formrc = curl_formadd(&formpost,
|
||||
&lastptr,
|
||||
CURLFORM_COPYNAME, "multifile",
|
||||
CURLFORM_FILE, libtest_arg2, /* Set in first.c. */
|
||||
CURLFORM_FILE, libtest_arg2,
|
||||
CURLFORM_CONTENTTYPE, "text/whatever",
|
||||
CURLFORM_FILE, libtest_arg2,
|
||||
CURLFORM_END);
|
||||
|
||||
if(formrc)
|
||||
printf("curl_formadd(3) = %d\n", (int) formrc);
|
||||
|
||||
/* Check data from file content and headers. */
|
||||
headers = curl_slist_append(headers, "X-customheader-1: Header 1 data");
|
||||
headers = curl_slist_append(headers, "X-customheader-2: Header 2 data");
|
||||
formrc = curl_formadd(&formpost,
|
||||
&lastptr,
|
||||
CURLFORM_COPYNAME, "filecontents",
|
||||
CURLFORM_FILECONTENT, libtest_arg2,
|
||||
CURLFORM_CONTENTHEADER, headers,
|
||||
CURLFORM_END);
|
||||
|
||||
if(formrc)
|
||||
printf("curl_formadd(3) = %d\n", (int) formrc);
|
||||
|
||||
/* Measure the current form length.
|
||||
* This is done before including stdin data because we want to reuse it
|
||||
* and stdin cannot be rewound.
|
||||
*/
|
||||
curl_formget(formpost, (void *) &formlength, count_chars);
|
||||
|
||||
/* Include length in data for external check. */
|
||||
curl_msnprintf(flbuf, sizeof flbuf, "%lu", (unsigned long) formlength);
|
||||
formrc = curl_formadd(&formpost,
|
||||
&lastptr,
|
||||
CURLFORM_COPYNAME, "formlength",
|
||||
CURLFORM_COPYCONTENTS, &flbuf,
|
||||
CURLFORM_END);
|
||||
|
||||
/* Check stdin (may be problematic on some platforms). */
|
||||
formrc = curl_formadd(&formpost,
|
||||
&lastptr,
|
||||
CURLFORM_COPYNAME, "standardinput",
|
||||
CURLFORM_FILE, "-",
|
||||
CURLFORM_END);
|
||||
|
||||
if(formrc)
|
||||
printf("curl_formadd(4) = %d\n", (int) formrc);
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(!curl) {
|
||||
fprintf(stderr, "curl_easy_init() failed\n");
|
||||
curl_slist_free_all(headers);
|
||||
curl_formfree(formpost);
|
||||
curl_global_cleanup();
|
||||
return TEST_ERR_MAJOR_BAD;
|
||||
}
|
||||
|
||||
/* First set the URL that is about to receive our POST. */
|
||||
test_setopt(curl, CURLOPT_URL, URL);
|
||||
|
||||
/* send a multi-part formpost */
|
||||
test_setopt(curl, CURLOPT_HTTPPOST, formpost);
|
||||
|
||||
/* get verbose debug output please */
|
||||
test_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
|
||||
/* include headers in the output */
|
||||
test_setopt(curl, CURLOPT_HEADER, 1L);
|
||||
|
||||
/* Perform the request, res will get the return code */
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
test_cleanup:
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
|
||||
/* now cleanup the formpost chain */
|
||||
curl_formfree(formpost);
|
||||
curl_slist_free_all(headers);
|
||||
|
||||
curl_global_cleanup();
|
||||
|
||||
return res;
|
||||
}
|
Loading…
Reference in New Issue
Block a user