Annotation of embedaddon/curl/tests/libtest/lib579.c, revision 1.1
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: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>