1 <testcase> 2 # Based on test 1315 3 <info> 4 <keywords> 5 HTTP 6 HTTP FORMPOST 7 HTTP file upload 8 --libcurl 9 </keywords> 10 </info> 11 12 # Server-side 13 <reply> 14 <data> 15 HTTP/1.1 200 OK 16 Date: Thu, 29 Jul 2008 14:49:00 GMT 17 Server: test-server/fake 18 Content-Length: 0 19 Connection: close 20 21 </data> 22 </reply> 23 24 # Client-side 25 <client> 26 <server> 27 http 28 </server> 29 <name> 30 --libcurl for HTTP RFC1867-type formposting - -F with three files, one with explicit type 31 </name> 32 <command> 33 http://%HOSTIP:%HTTPPORT/we/want/1404 -F name=value -F 'file=@log/test1404.txt,log/test1404.txt;type=magic/content,log/test1404.txt' --libcurl log/test1404.c 34 </command> 35 # We create this file before the command is invoked! 36 <file name="log/test1404.txt"> 37 dummy data 38 </file> 39 </client> 40 41 # Verify data after the test has been "shot" 42 <verify> 43 <strip> 44 (^User-Agent:.*|-----+\w+) 45 </strip> 46 <protocol> 47 POST /we/want/1404 HTTP/1.1 48 User-Agent: curl/7.18.2 (i686-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.7a ipv6 zlib/1.1.4 49 Host: %HOSTIP:%HTTPPORT 50 Accept: */* 51 Content-Length: 795 52 Expect: 100-continue 53 Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763 54 55 ------------------------------9ef8d6205763 56 Content-Disposition: form-data; name="name" 57 58 value 59 ------------------------------9ef8d6205763 60 Content-Disposition: form-data; name="file" 61 Content-Type: multipart/mixed; boundary=----------------------------aaaaaaaaaaaa 62 63 Content-Disposition: attachment; filename="test1404.txt" 64 Content-Type: text/plain 65 66 dummy data 67 68 ------------------------------9ef8d6205763 69 Content-Disposition: attachment; filename="test1404.txt" 70 Content-Type: magic/content 71 72 dummy data 73 74 ------------------------------9ef8d6205763 75 Content-Disposition: attachment; filename="test1404.txt" 76 Content-Type: text/plain 77 78 dummy data 79 80 ------------------------------aaaaaaaaaaaa-- 81 ------------------------------9ef8d6205763-- 82 </protocol> 83 <stripfile> 84 # curl's default user-agent varies with version, libraries etc. 85 s/(USERAGENT, \")[^\"]+/${1}stripped/ 86 # CURLOPT_SSL_VERIFYPEER, SSH_KNOWNHOSTS and HTTP_VERSION vary with 87 # configurations - just ignore them 88 $_ = '' if /CURLOPT_SSL_VERIFYPEER/ 89 $_ = '' if /CURLOPT_SSH_KNOWNHOSTS/ 90 $_ = '' if /CURLOPT_HTTP_VERSION/ 91 </stripfile> 92 <file name="log/test1404.c" mode="text"> 93 /********* Sample code generated by the curl command line tool ********** 94 * All curl_easy_setopt() options are documented at: 95 * https://curl.haxx.se/libcurl/c/curl_easy_setopt.html 96 ************************************************************************/ 97 #include <curl/curl.h> 98 99 int main(int argc, char *argv[]) 100 { 101 CURLcode ret; 102 CURL *hnd; 103 struct curl_httppost *post1; 104 struct curl_httppost *postend; 105 106 post1 = NULL; 107 postend = NULL; 108 curl_formadd(&post1, &postend, 109 CURLFORM_COPYNAME, "name", 110 CURLFORM_COPYCONTENTS, "value", 111 CURLFORM_END); 112 curl_formadd(&post1, &postend, 113 CURLFORM_COPYNAME, "file", 114 CURLFORM_FILE, "log/test1404.txt", 115 CURLFORM_CONTENTTYPE, "text/plain", 116 CURLFORM_FILE, "log/test1404.txt", 117 CURLFORM_CONTENTTYPE, "magic/content", 118 CURLFORM_FILE, "log/test1404.txt", 119 CURLFORM_CONTENTTYPE, "text/plain", 120 CURLFORM_END); 121 122 hnd = curl_easy_init(); 123 curl_easy_setopt(hnd, CURLOPT_URL, "http://%HOSTIP:%HTTPPORT/we/want/1404"); 124 curl_easy_setopt(hnd, CURLOPT_HEADER, 1L); 125 curl_easy_setopt(hnd, CURLOPT_HTTPPOST, post1); 126 curl_easy_setopt(hnd, CURLOPT_USERAGENT, "stripped"); 127 curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L); 128 curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L); 129 curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L); 130 131 /* Here is a list of options the curl code used that cannot get generated 132 as source easily. You may select to either not use them or implement 133 them yourself. 134 135 CURLOPT_WRITEDATA set to a objectpointer 136 CURLOPT_WRITEFUNCTION set to a functionpointer 137 CURLOPT_READDATA set to a objectpointer 138 CURLOPT_READFUNCTION set to a functionpointer 139 CURLOPT_SEEKDATA set to a objectpointer 140 CURLOPT_SEEKFUNCTION set to a functionpointer 141 CURLOPT_ERRORBUFFER set to a objectpointer 142 CURLOPT_STDERR set to a objectpointer 143 CURLOPT_DEBUGFUNCTION set to a functionpointer 144 CURLOPT_DEBUGDATA set to a objectpointer 145 CURLOPT_HEADERFUNCTION set to a functionpointer 146 CURLOPT_HEADERDATA set to a objectpointer 147 148 */ 149 150 ret = curl_easy_perform(hnd); 151 152 curl_easy_cleanup(hnd); 153 hnd = NULL; 154 curl_formfree(post1); 155 post1 = NULL; 156 157 return (int)ret; 158 } 159 /**** End of sample code ****/ 160 </file> 161 </verify> 162 </testcase> 163