1*6236dae4SAndroid Build Coastguard Worker<testcase> 2*6236dae4SAndroid Build Coastguard Worker# Based on test 1315 3*6236dae4SAndroid Build Coastguard Worker<info> 4*6236dae4SAndroid Build Coastguard Worker<keywords> 5*6236dae4SAndroid Build Coastguard WorkerHTTP 6*6236dae4SAndroid Build Coastguard WorkerHTTP FORMPOST 7*6236dae4SAndroid Build Coastguard WorkerHTTP file upload 8*6236dae4SAndroid Build Coastguard Worker--libcurl 9*6236dae4SAndroid Build Coastguard Worker</keywords> 10*6236dae4SAndroid Build Coastguard Worker</info> 11*6236dae4SAndroid Build Coastguard Worker 12*6236dae4SAndroid Build Coastguard Worker# Server-side 13*6236dae4SAndroid Build Coastguard Worker<reply> 14*6236dae4SAndroid Build Coastguard Worker<data> 15*6236dae4SAndroid Build Coastguard WorkerHTTP/1.1 200 OK 16*6236dae4SAndroid Build Coastguard WorkerDate: Thu, 29 Jul 2008 14:49:00 GMT 17*6236dae4SAndroid Build Coastguard WorkerServer: test-server/fake 18*6236dae4SAndroid Build Coastguard WorkerContent-Length: 0 19*6236dae4SAndroid Build Coastguard WorkerConnection: close 20*6236dae4SAndroid Build Coastguard Worker 21*6236dae4SAndroid Build Coastguard Worker</data> 22*6236dae4SAndroid Build Coastguard Worker</reply> 23*6236dae4SAndroid Build Coastguard Worker 24*6236dae4SAndroid Build Coastguard Worker# Client-side 25*6236dae4SAndroid Build Coastguard Worker<client> 26*6236dae4SAndroid Build Coastguard Worker<features> 27*6236dae4SAndroid Build Coastguard WorkerMime 28*6236dae4SAndroid Build Coastguard Worker</features> 29*6236dae4SAndroid Build Coastguard Worker<server> 30*6236dae4SAndroid Build Coastguard Workerhttp 31*6236dae4SAndroid Build Coastguard Worker</server> 32*6236dae4SAndroid Build Coastguard Worker<name> 33*6236dae4SAndroid Build Coastguard Worker--libcurl for HTTP RFC1867-type formposting - -F with 3 files, one with explicit type & encoder 34*6236dae4SAndroid Build Coastguard Worker</name> 35*6236dae4SAndroid Build Coastguard Worker<setenv> 36*6236dae4SAndroid Build Coastguard WorkerSSL_CERT_FILE= 37*6236dae4SAndroid Build Coastguard Worker</setenv> 38*6236dae4SAndroid Build Coastguard Worker<command> 39*6236dae4SAndroid Build Coastguard Workerhttp://%HOSTIP:%HTTPPORT/we/want/%TESTNUMBER -F name=value -F 'file=@%LOGDIR/test%TESTNUMBER.txt,%LOGDIR/test%TESTNUMBER.txt;type=magic/content;encoder=8bit,%LOGDIR/test%TESTNUMBER.txt;headers=X-testheader-1: header 1;headers=X-testheader-2: header 2' --libcurl %LOGDIR/test%TESTNUMBER.c 40*6236dae4SAndroid Build Coastguard Worker</command> 41*6236dae4SAndroid Build Coastguard Worker# We create this file before the command is invoked! 42*6236dae4SAndroid Build Coastguard Worker<file name="%LOGDIR/test%TESTNUMBER.txt"> 43*6236dae4SAndroid Build Coastguard Workerdummy data 44*6236dae4SAndroid Build Coastguard Worker</file> 45*6236dae4SAndroid Build Coastguard Worker</client> 46*6236dae4SAndroid Build Coastguard Worker 47*6236dae4SAndroid Build Coastguard Worker# Verify data after the test has been "shot" 48*6236dae4SAndroid Build Coastguard Worker<verify> 49*6236dae4SAndroid Build Coastguard Worker<strip> 50*6236dae4SAndroid Build Coastguard Worker-----+\w+ 51*6236dae4SAndroid Build Coastguard Worker</strip> 52*6236dae4SAndroid Build Coastguard Worker<protocol> 53*6236dae4SAndroid Build Coastguard WorkerPOST /we/want/%TESTNUMBER HTTP/1.1 54*6236dae4SAndroid Build Coastguard WorkerHost: %HOSTIP:%HTTPPORT 55*6236dae4SAndroid Build Coastguard WorkerUser-Agent: curl/%VERSION 56*6236dae4SAndroid Build Coastguard WorkerAccept: */* 57*6236dae4SAndroid Build Coastguard WorkerContent-Length: 930 58*6236dae4SAndroid Build Coastguard WorkerContent-Type: multipart/form-data; boundary=----------------------------9ef8d6205763 59*6236dae4SAndroid Build Coastguard Worker 60*6236dae4SAndroid Build Coastguard Worker------------------------------9ef8d6205763 61*6236dae4SAndroid Build Coastguard WorkerContent-Disposition: form-data; name="name" 62*6236dae4SAndroid Build Coastguard Worker 63*6236dae4SAndroid Build Coastguard Workervalue 64*6236dae4SAndroid Build Coastguard Worker------------------------------9ef8d6205763 65*6236dae4SAndroid Build Coastguard WorkerContent-Disposition: form-data; name="file" 66*6236dae4SAndroid Build Coastguard WorkerContent-Type: multipart/mixed; boundary=----------------------------aaaaaaaaaaaa 67*6236dae4SAndroid Build Coastguard Worker 68*6236dae4SAndroid Build Coastguard WorkerContent-Disposition: attachment; filename="test%TESTNUMBER.txt" 69*6236dae4SAndroid Build Coastguard WorkerContent-Type: text/plain 70*6236dae4SAndroid Build Coastguard Worker 71*6236dae4SAndroid Build Coastguard Workerdummy data 72*6236dae4SAndroid Build Coastguard Worker 73*6236dae4SAndroid Build Coastguard Worker------------------------------9ef8d6205763 74*6236dae4SAndroid Build Coastguard WorkerContent-Disposition: attachment; filename="test%TESTNUMBER.txt" 75*6236dae4SAndroid Build Coastguard WorkerContent-Type: magic/content 76*6236dae4SAndroid Build Coastguard WorkerContent-Transfer-Encoding: 8bit 77*6236dae4SAndroid Build Coastguard Worker 78*6236dae4SAndroid Build Coastguard Workerdummy data 79*6236dae4SAndroid Build Coastguard Worker 80*6236dae4SAndroid Build Coastguard Worker------------------------------9ef8d6205763 81*6236dae4SAndroid Build Coastguard WorkerContent-Disposition: attachment; filename="test%TESTNUMBER.txt" 82*6236dae4SAndroid Build Coastguard WorkerContent-Type: text/plain 83*6236dae4SAndroid Build Coastguard WorkerX-testheader-1: header 1 84*6236dae4SAndroid Build Coastguard WorkerX-testheader-2: header 2 85*6236dae4SAndroid Build Coastguard Worker 86*6236dae4SAndroid Build Coastguard Workerdummy data 87*6236dae4SAndroid Build Coastguard Worker 88*6236dae4SAndroid Build Coastguard Worker------------------------------aaaaaaaaaaaa-- 89*6236dae4SAndroid Build Coastguard Worker 90*6236dae4SAndroid Build Coastguard Worker------------------------------9ef8d6205763-- 91*6236dae4SAndroid Build Coastguard Worker</protocol> 92*6236dae4SAndroid Build Coastguard Worker<stripfile> 93*6236dae4SAndroid Build Coastguard Worker# curl's default user-agent varies with version, libraries etc. 94*6236dae4SAndroid Build Coastguard Workers/(USERAGENT, \")[^\"]+/${1}stripped/ 95*6236dae4SAndroid Build Coastguard Worker# CURLOPT_SSL_VERIFYPEER, SSH_KNOWNHOSTS and HTTP_VERSION vary with 96*6236dae4SAndroid Build Coastguard Worker# configurations - just ignore them 97*6236dae4SAndroid Build Coastguard Worker$_ = '' if /CURLOPT_SSL_VERIFYPEER/ 98*6236dae4SAndroid Build Coastguard Worker$_ = '' if /CURLOPT_SSH_KNOWNHOSTS/ 99*6236dae4SAndroid Build Coastguard Worker$_ = '' if /CURLOPT_HTTP_VERSION/ 100*6236dae4SAndroid Build Coastguard Worker$_ = '' if /CURLOPT_INTERLEAVEDATA/ 101*6236dae4SAndroid Build Coastguard Worker# CURL_DOES_CONVERSION generates an extra comment. 102*6236dae4SAndroid Build Coastguard Worker$_ = '' if /\/\* "value" \*\// 103*6236dae4SAndroid Build Coastguard Worker</stripfile> 104*6236dae4SAndroid Build Coastguard Worker<file name="%LOGDIR/test%TESTNUMBER.c" mode="text"> 105*6236dae4SAndroid Build Coastguard Worker/********* Sample code generated by the curl command line tool ********** 106*6236dae4SAndroid Build Coastguard Worker * All curl_easy_setopt() options are documented at: 107*6236dae4SAndroid Build Coastguard Worker * https://curl.se/libcurl/c/curl_easy_setopt.html 108*6236dae4SAndroid Build Coastguard Worker ************************************************************************/ 109*6236dae4SAndroid Build Coastguard Worker#include <curl/curl.h> 110*6236dae4SAndroid Build Coastguard Worker 111*6236dae4SAndroid Build Coastguard Workerint main(int argc, char *argv[]) 112*6236dae4SAndroid Build Coastguard Worker{ 113*6236dae4SAndroid Build Coastguard Worker CURLcode ret; 114*6236dae4SAndroid Build Coastguard Worker CURL *hnd; 115*6236dae4SAndroid Build Coastguard Worker curl_mime *mime1; 116*6236dae4SAndroid Build Coastguard Worker curl_mimepart *part1; 117*6236dae4SAndroid Build Coastguard Worker curl_mime *mime2; 118*6236dae4SAndroid Build Coastguard Worker curl_mimepart *part2; 119*6236dae4SAndroid Build Coastguard Worker struct curl_slist *slist1; 120*6236dae4SAndroid Build Coastguard Worker 121*6236dae4SAndroid Build Coastguard Worker mime1 = NULL; 122*6236dae4SAndroid Build Coastguard Worker mime2 = NULL; 123*6236dae4SAndroid Build Coastguard Worker slist1 = NULL; 124*6236dae4SAndroid Build Coastguard Worker slist1 = curl_slist_append(slist1, "X-testheader-1: header 1"); 125*6236dae4SAndroid Build Coastguard Worker slist1 = curl_slist_append(slist1, "X-testheader-2: header 2"); 126*6236dae4SAndroid Build Coastguard Worker 127*6236dae4SAndroid Build Coastguard Worker hnd = curl_easy_init(); 128*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L); 129*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt(hnd, CURLOPT_URL, "http://%HOSTIP:%HTTPPORT/we/want/%TESTNUMBER"); 130*6236dae4SAndroid Build Coastguard Worker mime1 = curl_mime_init(hnd); 131*6236dae4SAndroid Build Coastguard Worker part1 = curl_mime_addpart(mime1); 132*6236dae4SAndroid Build Coastguard Worker curl_mime_data(part1, "value", CURL_ZERO_TERMINATED); 133*6236dae4SAndroid Build Coastguard Worker curl_mime_name(part1, "name"); 134*6236dae4SAndroid Build Coastguard Worker part1 = curl_mime_addpart(mime1); 135*6236dae4SAndroid Build Coastguard Worker mime2 = curl_mime_init(hnd); 136*6236dae4SAndroid Build Coastguard Worker part2 = curl_mime_addpart(mime2); 137*6236dae4SAndroid Build Coastguard Worker curl_mime_filedata(part2, "%LOGDIR/test%TESTNUMBER.txt"); 138*6236dae4SAndroid Build Coastguard Worker part2 = curl_mime_addpart(mime2); 139*6236dae4SAndroid Build Coastguard Worker curl_mime_filedata(part2, "%LOGDIR/test%TESTNUMBER.txt"); 140*6236dae4SAndroid Build Coastguard Worker curl_mime_encoder(part2, "8bit"); 141*6236dae4SAndroid Build Coastguard Worker curl_mime_type(part2, "magic/content"); 142*6236dae4SAndroid Build Coastguard Worker part2 = curl_mime_addpart(mime2); 143*6236dae4SAndroid Build Coastguard Worker curl_mime_filedata(part2, "%LOGDIR/test%TESTNUMBER.txt"); 144*6236dae4SAndroid Build Coastguard Worker curl_mime_headers(part2, slist1, 1); 145*6236dae4SAndroid Build Coastguard Worker slist1 = NULL; 146*6236dae4SAndroid Build Coastguard Worker curl_mime_subparts(part1, mime2); 147*6236dae4SAndroid Build Coastguard Worker mime2 = NULL; 148*6236dae4SAndroid Build Coastguard Worker curl_mime_name(part1, "file"); 149*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt(hnd, CURLOPT_MIMEPOST, mime1); 150*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt(hnd, CURLOPT_USERAGENT, "stripped"); 151*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L); 152*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L); 153*6236dae4SAndroid Build Coastguard Worker%if ftp 154*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt(hnd, CURLOPT_FTP_SKIP_PASV_IP, 1L); 155*6236dae4SAndroid Build Coastguard Worker%endif 156*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L); 157*6236dae4SAndroid Build Coastguard Worker 158*6236dae4SAndroid Build Coastguard Worker /* Here is a list of options the curl code used that cannot get generated 159*6236dae4SAndroid Build Coastguard Worker as source easily. You may choose to either not use them or implement 160*6236dae4SAndroid Build Coastguard Worker them yourself. 161*6236dae4SAndroid Build Coastguard Worker 162*6236dae4SAndroid Build Coastguard Worker CURLOPT_WRITEDATA was set to an object pointer 163*6236dae4SAndroid Build Coastguard Worker CURLOPT_WRITEFUNCTION was set to a function pointer 164*6236dae4SAndroid Build Coastguard Worker CURLOPT_READDATA was set to an object pointer 165*6236dae4SAndroid Build Coastguard Worker CURLOPT_READFUNCTION was set to a function pointer 166*6236dae4SAndroid Build Coastguard Worker CURLOPT_SEEKDATA was set to an object pointer 167*6236dae4SAndroid Build Coastguard Worker CURLOPT_SEEKFUNCTION was set to a function pointer 168*6236dae4SAndroid Build Coastguard Worker CURLOPT_ERRORBUFFER was set to an object pointer 169*6236dae4SAndroid Build Coastguard Worker CURLOPT_STDERR was set to an object pointer 170*6236dae4SAndroid Build Coastguard Worker CURLOPT_DEBUGFUNCTION was set to a function pointer 171*6236dae4SAndroid Build Coastguard Worker CURLOPT_DEBUGDATA was set to an object pointer 172*6236dae4SAndroid Build Coastguard Worker CURLOPT_HEADERFUNCTION was set to a function pointer 173*6236dae4SAndroid Build Coastguard Worker CURLOPT_HEADERDATA was set to an object pointer 174*6236dae4SAndroid Build Coastguard Worker 175*6236dae4SAndroid Build Coastguard Worker */ 176*6236dae4SAndroid Build Coastguard Worker 177*6236dae4SAndroid Build Coastguard Worker ret = curl_easy_perform(hnd); 178*6236dae4SAndroid Build Coastguard Worker 179*6236dae4SAndroid Build Coastguard Worker curl_easy_cleanup(hnd); 180*6236dae4SAndroid Build Coastguard Worker hnd = NULL; 181*6236dae4SAndroid Build Coastguard Worker curl_mime_free(mime1); 182*6236dae4SAndroid Build Coastguard Worker mime1 = NULL; 183*6236dae4SAndroid Build Coastguard Worker curl_mime_free(mime2); 184*6236dae4SAndroid Build Coastguard Worker mime2 = NULL; 185*6236dae4SAndroid Build Coastguard Worker curl_slist_free_all(slist1); 186*6236dae4SAndroid Build Coastguard Worker slist1 = NULL; 187*6236dae4SAndroid Build Coastguard Worker 188*6236dae4SAndroid Build Coastguard Worker return (int)ret; 189*6236dae4SAndroid Build Coastguard Worker} 190*6236dae4SAndroid Build Coastguard Worker/**** End of sample code ****/ 191*6236dae4SAndroid Build Coastguard Worker</file> 192*6236dae4SAndroid Build Coastguard Worker</verify> 193*6236dae4SAndroid Build Coastguard Worker</testcase> 194