113498266Sopenharmony_ci/*************************************************************************** 213498266Sopenharmony_ci * _ _ ____ _ 313498266Sopenharmony_ci * Project ___| | | | _ \| | 413498266Sopenharmony_ci * / __| | | | |_) | | 513498266Sopenharmony_ci * | (__| |_| | _ <| |___ 613498266Sopenharmony_ci * \___|\___/|_| \_\_____| 713498266Sopenharmony_ci * 813498266Sopenharmony_ci * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al. 913498266Sopenharmony_ci * 1013498266Sopenharmony_ci * This software is licensed as described in the file COPYING, which 1113498266Sopenharmony_ci * you should have received as part of this distribution. The terms 1213498266Sopenharmony_ci * are also available at https://curl.se/docs/copyright.html. 1313498266Sopenharmony_ci * 1413498266Sopenharmony_ci * You may opt to use, copy, modify, merge, publish, distribute and/or sell 1513498266Sopenharmony_ci * copies of the Software, and permit persons to whom the Software is 1613498266Sopenharmony_ci * furnished to do so, under the terms of the COPYING file. 1713498266Sopenharmony_ci * 1813498266Sopenharmony_ci * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 1913498266Sopenharmony_ci * KIND, either express or implied. 2013498266Sopenharmony_ci * 2113498266Sopenharmony_ci * SPDX-License-Identifier: curl 2213498266Sopenharmony_ci * 2313498266Sopenharmony_ci ***************************************************************************/ 2413498266Sopenharmony_ci#include "test.h" 2513498266Sopenharmony_ci 2613498266Sopenharmony_ci#include "memdebug.h" 2713498266Sopenharmony_ci 2813498266Sopenharmony_cistatic char data[]= 2913498266Sopenharmony_ci "dummy\n"; 3013498266Sopenharmony_ci 3113498266Sopenharmony_cistruct WriteThis { 3213498266Sopenharmony_ci char *readptr; 3313498266Sopenharmony_ci curl_off_t sizeleft; 3413498266Sopenharmony_ci}; 3513498266Sopenharmony_ci 3613498266Sopenharmony_cistatic size_t read_callback(char *ptr, size_t size, size_t nmemb, void *userp) 3713498266Sopenharmony_ci{ 3813498266Sopenharmony_ci struct WriteThis *pooh = (struct WriteThis *)userp; 3913498266Sopenharmony_ci int eof = !*pooh->readptr; 4013498266Sopenharmony_ci 4113498266Sopenharmony_ci if(size*nmemb < 1) 4213498266Sopenharmony_ci return 0; 4313498266Sopenharmony_ci 4413498266Sopenharmony_ci#ifndef LIB645 4513498266Sopenharmony_ci eof = pooh->sizeleft <= 0; 4613498266Sopenharmony_ci if(!eof) 4713498266Sopenharmony_ci pooh->sizeleft--; 4813498266Sopenharmony_ci#endif 4913498266Sopenharmony_ci 5013498266Sopenharmony_ci if(!eof) { 5113498266Sopenharmony_ci *ptr = *pooh->readptr; /* copy one single byte */ 5213498266Sopenharmony_ci pooh->readptr++; /* advance pointer */ 5313498266Sopenharmony_ci return 1; /* we return 1 byte at a time! */ 5413498266Sopenharmony_ci } 5513498266Sopenharmony_ci 5613498266Sopenharmony_ci return 0; /* no more data left to deliver */ 5713498266Sopenharmony_ci} 5813498266Sopenharmony_ci 5913498266Sopenharmony_cistatic int once(char *URL, bool oldstyle) 6013498266Sopenharmony_ci{ 6113498266Sopenharmony_ci CURL *curl; 6213498266Sopenharmony_ci CURLcode res = CURLE_OK; 6313498266Sopenharmony_ci 6413498266Sopenharmony_ci curl_mime *mime = NULL; 6513498266Sopenharmony_ci curl_mimepart *part = NULL; 6613498266Sopenharmony_ci struct WriteThis pooh; 6713498266Sopenharmony_ci struct WriteThis pooh2; 6813498266Sopenharmony_ci curl_off_t datasize = -1; 6913498266Sopenharmony_ci 7013498266Sopenharmony_ci pooh.readptr = data; 7113498266Sopenharmony_ci#ifndef LIB645 7213498266Sopenharmony_ci datasize = (curl_off_t)strlen(data); 7313498266Sopenharmony_ci#endif 7413498266Sopenharmony_ci pooh.sizeleft = datasize; 7513498266Sopenharmony_ci 7613498266Sopenharmony_ci curl = curl_easy_init(); 7713498266Sopenharmony_ci if(!curl) { 7813498266Sopenharmony_ci fprintf(stderr, "curl_easy_init() failed\n"); 7913498266Sopenharmony_ci curl_global_cleanup(); 8013498266Sopenharmony_ci return TEST_ERR_MAJOR_BAD; 8113498266Sopenharmony_ci } 8213498266Sopenharmony_ci 8313498266Sopenharmony_ci mime = curl_mime_init(curl); 8413498266Sopenharmony_ci if(!mime) { 8513498266Sopenharmony_ci fprintf(stderr, "curl_mime_init() failed\n"); 8613498266Sopenharmony_ci curl_easy_cleanup(curl); 8713498266Sopenharmony_ci curl_global_cleanup(); 8813498266Sopenharmony_ci return TEST_ERR_MAJOR_BAD; 8913498266Sopenharmony_ci } 9013498266Sopenharmony_ci 9113498266Sopenharmony_ci part = curl_mime_addpart(mime); 9213498266Sopenharmony_ci if(!part) { 9313498266Sopenharmony_ci fprintf(stderr, "curl_mime_addpart(1) failed\n"); 9413498266Sopenharmony_ci curl_mime_free(mime); 9513498266Sopenharmony_ci curl_easy_cleanup(curl); 9613498266Sopenharmony_ci curl_global_cleanup(); 9713498266Sopenharmony_ci return TEST_ERR_MAJOR_BAD; 9813498266Sopenharmony_ci } 9913498266Sopenharmony_ci 10013498266Sopenharmony_ci /* Fill in the file upload part */ 10113498266Sopenharmony_ci if(oldstyle) { 10213498266Sopenharmony_ci res = curl_mime_name(part, "sendfile"); 10313498266Sopenharmony_ci if(!res) 10413498266Sopenharmony_ci res = curl_mime_data_cb(part, datasize, read_callback, 10513498266Sopenharmony_ci NULL, NULL, &pooh); 10613498266Sopenharmony_ci if(!res) 10713498266Sopenharmony_ci res = curl_mime_filename(part, "postit2.c"); 10813498266Sopenharmony_ci } 10913498266Sopenharmony_ci else { 11013498266Sopenharmony_ci /* new style */ 11113498266Sopenharmony_ci res = curl_mime_name(part, "sendfile alternative"); 11213498266Sopenharmony_ci if(!res) 11313498266Sopenharmony_ci res = curl_mime_data_cb(part, datasize, read_callback, 11413498266Sopenharmony_ci NULL, NULL, &pooh); 11513498266Sopenharmony_ci if(!res) 11613498266Sopenharmony_ci res = curl_mime_filename(part, "file name 2"); 11713498266Sopenharmony_ci } 11813498266Sopenharmony_ci 11913498266Sopenharmony_ci if(res) 12013498266Sopenharmony_ci printf("curl_mime_xxx(1) = %s\n", curl_easy_strerror(res)); 12113498266Sopenharmony_ci 12213498266Sopenharmony_ci /* Now add the same data with another name and make it not look like 12313498266Sopenharmony_ci a file upload but still using the callback */ 12413498266Sopenharmony_ci 12513498266Sopenharmony_ci pooh2.readptr = data; 12613498266Sopenharmony_ci#ifndef LIB645 12713498266Sopenharmony_ci datasize = (curl_off_t)strlen(data); 12813498266Sopenharmony_ci#endif 12913498266Sopenharmony_ci pooh2.sizeleft = datasize; 13013498266Sopenharmony_ci 13113498266Sopenharmony_ci part = curl_mime_addpart(mime); 13213498266Sopenharmony_ci if(!part) { 13313498266Sopenharmony_ci fprintf(stderr, "curl_mime_addpart(2) failed\n"); 13413498266Sopenharmony_ci curl_mime_free(mime); 13513498266Sopenharmony_ci curl_easy_cleanup(curl); 13613498266Sopenharmony_ci curl_global_cleanup(); 13713498266Sopenharmony_ci return TEST_ERR_MAJOR_BAD; 13813498266Sopenharmony_ci } 13913498266Sopenharmony_ci /* Fill in the file upload part */ 14013498266Sopenharmony_ci res = curl_mime_name(part, "callbackdata"); 14113498266Sopenharmony_ci if(!res) 14213498266Sopenharmony_ci res = curl_mime_data_cb(part, datasize, read_callback, 14313498266Sopenharmony_ci NULL, NULL, &pooh2); 14413498266Sopenharmony_ci 14513498266Sopenharmony_ci if(res) 14613498266Sopenharmony_ci printf("curl_mime_xxx(2) = %s\n", curl_easy_strerror(res)); 14713498266Sopenharmony_ci 14813498266Sopenharmony_ci part = curl_mime_addpart(mime); 14913498266Sopenharmony_ci if(!part) { 15013498266Sopenharmony_ci fprintf(stderr, "curl_mime_addpart(3) failed\n"); 15113498266Sopenharmony_ci curl_mime_free(mime); 15213498266Sopenharmony_ci curl_easy_cleanup(curl); 15313498266Sopenharmony_ci curl_global_cleanup(); 15413498266Sopenharmony_ci return TEST_ERR_MAJOR_BAD; 15513498266Sopenharmony_ci } 15613498266Sopenharmony_ci 15713498266Sopenharmony_ci /* Fill in the filename field */ 15813498266Sopenharmony_ci res = curl_mime_name(part, "filename"); 15913498266Sopenharmony_ci if(!res) 16013498266Sopenharmony_ci res = curl_mime_data(part, "postit2.c", 16113498266Sopenharmony_ci CURL_ZERO_TERMINATED); 16213498266Sopenharmony_ci 16313498266Sopenharmony_ci if(res) 16413498266Sopenharmony_ci printf("curl_mime_xxx(3) = %s\n", curl_easy_strerror(res)); 16513498266Sopenharmony_ci 16613498266Sopenharmony_ci /* Fill in a submit field too */ 16713498266Sopenharmony_ci part = curl_mime_addpart(mime); 16813498266Sopenharmony_ci if(!part) { 16913498266Sopenharmony_ci fprintf(stderr, "curl_mime_addpart(4) failed\n"); 17013498266Sopenharmony_ci curl_mime_free(mime); 17113498266Sopenharmony_ci curl_easy_cleanup(curl); 17213498266Sopenharmony_ci curl_global_cleanup(); 17313498266Sopenharmony_ci return TEST_ERR_MAJOR_BAD; 17413498266Sopenharmony_ci } 17513498266Sopenharmony_ci res = curl_mime_name(part, "submit"); 17613498266Sopenharmony_ci if(!res) 17713498266Sopenharmony_ci res = curl_mime_data(part, "send", 17813498266Sopenharmony_ci CURL_ZERO_TERMINATED); 17913498266Sopenharmony_ci 18013498266Sopenharmony_ci if(res) 18113498266Sopenharmony_ci printf("curl_mime_xxx(4) = %s\n", curl_easy_strerror(res)); 18213498266Sopenharmony_ci 18313498266Sopenharmony_ci part = curl_mime_addpart(mime); 18413498266Sopenharmony_ci if(!part) { 18513498266Sopenharmony_ci fprintf(stderr, "curl_mime_addpart(5) failed\n"); 18613498266Sopenharmony_ci curl_mime_free(mime); 18713498266Sopenharmony_ci curl_easy_cleanup(curl); 18813498266Sopenharmony_ci curl_global_cleanup(); 18913498266Sopenharmony_ci return TEST_ERR_MAJOR_BAD; 19013498266Sopenharmony_ci } 19113498266Sopenharmony_ci res = curl_mime_name(part, "somename"); 19213498266Sopenharmony_ci if(!res) 19313498266Sopenharmony_ci res = curl_mime_filename(part, "somefile.txt"); 19413498266Sopenharmony_ci if(!res) 19513498266Sopenharmony_ci res = curl_mime_data(part, "blah blah", 9); 19613498266Sopenharmony_ci 19713498266Sopenharmony_ci if(res) 19813498266Sopenharmony_ci printf("curl_mime_xxx(5) = %s\n", curl_easy_strerror(res)); 19913498266Sopenharmony_ci 20013498266Sopenharmony_ci /* First set the URL that is about to receive our POST. */ 20113498266Sopenharmony_ci test_setopt(curl, CURLOPT_URL, URL); 20213498266Sopenharmony_ci 20313498266Sopenharmony_ci /* send a multi-part mimepost */ 20413498266Sopenharmony_ci test_setopt(curl, CURLOPT_MIMEPOST, mime); 20513498266Sopenharmony_ci 20613498266Sopenharmony_ci /* get verbose debug output please */ 20713498266Sopenharmony_ci test_setopt(curl, CURLOPT_VERBOSE, 1L); 20813498266Sopenharmony_ci 20913498266Sopenharmony_ci /* include headers in the output */ 21013498266Sopenharmony_ci test_setopt(curl, CURLOPT_HEADER, 1L); 21113498266Sopenharmony_ci 21213498266Sopenharmony_ci /* Perform the request, res will get the return code */ 21313498266Sopenharmony_ci res = curl_easy_perform(curl); 21413498266Sopenharmony_ci 21513498266Sopenharmony_citest_cleanup: 21613498266Sopenharmony_ci 21713498266Sopenharmony_ci /* always cleanup */ 21813498266Sopenharmony_ci curl_easy_cleanup(curl); 21913498266Sopenharmony_ci 22013498266Sopenharmony_ci /* now cleanup the mimepost structure */ 22113498266Sopenharmony_ci curl_mime_free(mime); 22213498266Sopenharmony_ci 22313498266Sopenharmony_ci return res; 22413498266Sopenharmony_ci} 22513498266Sopenharmony_ci 22613498266Sopenharmony_cistatic int cyclic_add(void) 22713498266Sopenharmony_ci{ 22813498266Sopenharmony_ci CURL *easy = curl_easy_init(); 22913498266Sopenharmony_ci curl_mime *mime = curl_mime_init(easy); 23013498266Sopenharmony_ci curl_mimepart *part = curl_mime_addpart(mime); 23113498266Sopenharmony_ci CURLcode a1 = curl_mime_subparts(part, mime); 23213498266Sopenharmony_ci 23313498266Sopenharmony_ci if(a1 == CURLE_BAD_FUNCTION_ARGUMENT) { 23413498266Sopenharmony_ci curl_mime *submime = curl_mime_init(easy); 23513498266Sopenharmony_ci curl_mimepart *subpart = curl_mime_addpart(submime); 23613498266Sopenharmony_ci 23713498266Sopenharmony_ci curl_mime_subparts(part, submime); 23813498266Sopenharmony_ci a1 = curl_mime_subparts(subpart, mime); 23913498266Sopenharmony_ci } 24013498266Sopenharmony_ci 24113498266Sopenharmony_ci curl_mime_free(mime); 24213498266Sopenharmony_ci curl_easy_cleanup(easy); 24313498266Sopenharmony_ci if(a1 != CURLE_BAD_FUNCTION_ARGUMENT) 24413498266Sopenharmony_ci /* that should have failed */ 24513498266Sopenharmony_ci return 1; 24613498266Sopenharmony_ci 24713498266Sopenharmony_ci return 0; 24813498266Sopenharmony_ci} 24913498266Sopenharmony_ci 25013498266Sopenharmony_ciint test(char *URL) 25113498266Sopenharmony_ci{ 25213498266Sopenharmony_ci int res; 25313498266Sopenharmony_ci 25413498266Sopenharmony_ci if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { 25513498266Sopenharmony_ci fprintf(stderr, "curl_global_init() failed\n"); 25613498266Sopenharmony_ci return TEST_ERR_MAJOR_BAD; 25713498266Sopenharmony_ci } 25813498266Sopenharmony_ci 25913498266Sopenharmony_ci res = once(URL, TRUE); /* old */ 26013498266Sopenharmony_ci if(!res) 26113498266Sopenharmony_ci res = once(URL, FALSE); /* new */ 26213498266Sopenharmony_ci 26313498266Sopenharmony_ci if(!res) 26413498266Sopenharmony_ci res = cyclic_add(); 26513498266Sopenharmony_ci 26613498266Sopenharmony_ci curl_global_cleanup(); 26713498266Sopenharmony_ci 26813498266Sopenharmony_ci return res; 26913498266Sopenharmony_ci} 270