1e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/*************************************************************************** 29bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * _ _ ____ _ 39bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Project ___| | | | _ \| | 49bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * / __| | | | |_) | | 59bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * | (__| |_| | _ <| |___ 69bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * \___|\___/|_| \_\_____| 79bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 8486467e11b5904b3e04adc2f5fdb96fcfe65da84Alex Deymo * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al. 9e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 10e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * This software is licensed as described in the file COPYING, which 11e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * you should have received as part of this distribution. The terms 128f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo * are also available at https://curl.haxx.se/docs/copyright.html. 13e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 14e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * You may opt to use, copy, modify, merge, publish, distribute and/or sell 15e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * copies of the Software, and permit persons to whom the Software is 16e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * furnished to do so, under the terms of the COPYING file. 17e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 18e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 19e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * KIND, either express or implied. 20e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 21e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ***************************************************************************/ 229bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "test.h" 239bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 249bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "memdebug.h" 259bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 269bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsstatic char data[]="this is what we post to the silly web server\n"; 279bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 289bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsstruct WriteThis { 299bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels char *readptr; 309bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels size_t sizeleft; 319bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels}; 329bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 339bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsstatic size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp) 349bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 359bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels struct WriteThis *pooh = (struct WriteThis *)userp; 369bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 379bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(size*nmemb < 1) 389bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return 0; 399bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 409bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(pooh->sizeleft) { 419bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels *(char *)ptr = pooh->readptr[0]; /* copy one single byte */ 429bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels pooh->readptr++; /* advance pointer */ 439bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels pooh->sizeleft--; /* less data left */ 449bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return 1; /* we return 1 byte at a time! */ 459bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 469bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 479bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return 0; /* no more data left to deliver */ 489bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 499bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 509bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsint test(char *URL) 519bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 529bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels CURL *curl; 53486467e11b5904b3e04adc2f5fdb96fcfe65da84Alex Deymo CURLcode res = CURLE_OK; 549bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 559bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels struct WriteThis pooh; 569bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 579bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels pooh.readptr = data; 589bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels pooh.sizeleft = strlen(data); 599bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 608f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { 619bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "curl_global_init() failed\n"); 629bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return TEST_ERR_MAJOR_BAD; 639bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 649bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 6582be86df6ec7baa34d6169c053fd1dfe56fa858eElliott Hughes curl = curl_easy_init(); 6682be86df6ec7baa34d6169c053fd1dfe56fa858eElliott Hughes if(!curl) { 679bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "curl_easy_init() failed\n"); 689bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_global_cleanup(); 699bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return TEST_ERR_MAJOR_BAD; 709bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 719bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 729bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* First set the URL that is about to receive our POST. */ 739bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels test_setopt(curl, CURLOPT_URL, URL); 749bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 759bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* Now specify we want to POST data */ 769bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels test_setopt(curl, CURLOPT_POST, 1L); 779bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 789bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef CURL_DOES_CONVERSIONS 799bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* Convert the POST data to ASCII */ 809bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels test_setopt(curl, CURLOPT_TRANSFERTEXT, 1L); 819bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 829bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 839bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* Set the expected POST size */ 849bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels test_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)pooh.sizeleft); 859bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 869bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* we want to use our own read function */ 879bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels test_setopt(curl, CURLOPT_READFUNCTION, read_callback); 889bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 899bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* pointer to pass to our read function */ 90e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET test_setopt(curl, CURLOPT_READDATA, &pooh); 919bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 929bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* get verbose debug output please */ 939bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels test_setopt(curl, CURLOPT_VERBOSE, 1L); 949bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 959bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* include headers in the output */ 969bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels test_setopt(curl, CURLOPT_HEADER, 1L); 979bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 989bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* Perform the request, res will get the return code */ 999bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels res = curl_easy_perform(curl); 1009bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1019bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelstest_cleanup: 1029bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1039bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* always cleanup */ 1049bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_easy_cleanup(curl); 1059bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_global_cleanup(); 1069bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1079bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return res; 1089bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 109