Return to lib579.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / curl / tests / libtest |
1.1 ! misho 1: /*************************************************************************** ! 2: * _ _ ____ _ ! 3: * Project ___| | | | _ \| | ! 4: * / __| | | | |_) | | ! 5: * | (__| |_| | _ <| |___ ! 6: * \___|\___/|_| \_\_____| ! 7: * ! 8: * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al. ! 9: * ! 10: * This software is licensed as described in the file COPYING, which ! 11: * you should have received as part of this distribution. The terms ! 12: * are also available at https://curl.haxx.se/docs/copyright.html. ! 13: * ! 14: * You may opt to use, copy, modify, merge, publish, distribute and/or sell ! 15: * copies of the Software, and permit persons to whom the Software is ! 16: * furnished to do so, under the terms of the COPYING file. ! 17: * ! 18: * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY ! 19: * KIND, either express or implied. ! 20: * ! 21: ***************************************************************************/ ! 22: #include "test.h" ! 23: ! 24: #include "memdebug.h" ! 25: ! 26: static const char * const post[]={ ! 27: "one", ! 28: "two", ! 29: "three", ! 30: "and a final longer crap: four", ! 31: NULL ! 32: }; ! 33: ! 34: ! 35: struct WriteThis { ! 36: int counter; ! 37: }; ! 38: ! 39: static int progress_callback(void *clientp, double dltotal, double dlnow, ! 40: double ultotal, double ulnow) ! 41: { ! 42: static int prev_ultotal = -1; ! 43: static int prev_ulnow = -1; ! 44: (void)clientp; /* UNUSED */ ! 45: (void)dltotal; /* UNUSED */ ! 46: (void)dlnow; /* UNUSED */ ! 47: ! 48: /* to avoid depending on timing, which will cause this progress function to ! 49: get called a different number of times depending on circumstances, we ! 50: only log these lines if the numbers are different from the previous ! 51: invoke */ ! 52: if((prev_ultotal != (int)ultotal) || ! 53: (prev_ulnow != (int)ulnow)) { ! 54: ! 55: FILE *moo = fopen(libtest_arg2, "ab"); ! 56: if(moo) { ! 57: fprintf(moo, "Progress callback called with UL %d out of %d\n", ! 58: (int)ulnow, (int)ultotal); ! 59: fclose(moo); ! 60: } ! 61: prev_ulnow = (int) ulnow; ! 62: prev_ultotal = (int) ultotal; ! 63: } ! 64: return 0; ! 65: } ! 66: ! 67: static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp) ! 68: { ! 69: struct WriteThis *pooh = (struct WriteThis *)userp; ! 70: const char *data; ! 71: ! 72: if(size*nmemb < 1) ! 73: return 0; ! 74: ! 75: data = post[pooh->counter]; ! 76: ! 77: if(data) { ! 78: size_t len = strlen(data); ! 79: memcpy(ptr, data, len); ! 80: pooh->counter++; /* advance pointer */ ! 81: return len; ! 82: } ! 83: return 0; /* no more data left to deliver */ ! 84: } ! 85: ! 86: int test(char *URL) ! 87: { ! 88: CURL *curl; ! 89: CURLcode res = CURLE_OK; ! 90: struct curl_slist *slist = NULL; ! 91: struct WriteThis pooh; ! 92: pooh.counter = 0; ! 93: ! 94: if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { ! 95: fprintf(stderr, "curl_global_init() failed\n"); ! 96: return TEST_ERR_MAJOR_BAD; ! 97: } ! 98: ! 99: curl = curl_easy_init(); ! 100: if(!curl) { ! 101: fprintf(stderr, "curl_easy_init() failed\n"); ! 102: curl_global_cleanup(); ! 103: return TEST_ERR_MAJOR_BAD; ! 104: } ! 105: ! 106: slist = curl_slist_append(slist, "Transfer-Encoding: chunked"); ! 107: if(slist == NULL) { ! 108: fprintf(stderr, "curl_slist_append() failed\n"); ! 109: curl_easy_cleanup(curl); ! 110: curl_global_cleanup(); ! 111: return TEST_ERR_MAJOR_BAD; ! 112: } ! 113: ! 114: /* First set the URL that is about to receive our POST. */ ! 115: test_setopt(curl, CURLOPT_URL, URL); ! 116: ! 117: /* Now specify we want to POST data */ ! 118: test_setopt(curl, CURLOPT_POST, 1L); ! 119: ! 120: #ifdef CURL_DOES_CONVERSIONS ! 121: /* Convert the POST data to ASCII */ ! 122: test_setopt(curl, CURLOPT_TRANSFERTEXT, 1L); ! 123: #endif ! 124: ! 125: /* we want to use our own read function */ ! 126: test_setopt(curl, CURLOPT_READFUNCTION, read_callback); ! 127: ! 128: /* pointer to pass to our read function */ ! 129: test_setopt(curl, CURLOPT_READDATA, &pooh); ! 130: ! 131: /* get verbose debug output please */ ! 132: test_setopt(curl, CURLOPT_VERBOSE, 1L); ! 133: ! 134: /* include headers in the output */ ! 135: test_setopt(curl, CURLOPT_HEADER, 1L); ! 136: ! 137: /* enforce chunked transfer by setting the header */ ! 138: test_setopt(curl, CURLOPT_HTTPHEADER, slist); ! 139: ! 140: test_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_DIGEST); ! 141: test_setopt(curl, CURLOPT_USERPWD, "foo:bar"); ! 142: ! 143: /* we want to use our own progress function */ ! 144: test_setopt(curl, CURLOPT_NOPROGRESS, 0L); ! 145: test_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback); ! 146: ! 147: /* Perform the request, res will get the return code */ ! 148: res = curl_easy_perform(curl); ! 149: ! 150: test_cleanup: ! 151: ! 152: /* clean up the headers list */ ! 153: if(slist) ! 154: curl_slist_free_all(slist); ! 155: ! 156: /* always cleanup */ ! 157: curl_easy_cleanup(curl); ! 158: curl_global_cleanup(); ! 159: ! 160: return res; ! 161: }