Annotation of embedaddon/curl/tests/libtest/lib670.c, revision 1.1.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: 
                     23: #include <time.h>
                     24: 
                     25: #include "test.h"
                     26: 
                     27: #include "memdebug.h"
                     28: 
                     29: #define PAUSE_TIME      2
                     30: 
                     31: 
                     32: static const char name[] = "field";
                     33: 
                     34: struct ReadThis {
                     35:   CURL *easy;
                     36:   time_t origin;
                     37:   int count;
                     38: };
                     39: 
                     40: 
                     41: static size_t read_callback(char *ptr, size_t size, size_t nmemb, void *userp)
                     42: {
                     43:   struct ReadThis *pooh = (struct ReadThis *) userp;
                     44:   time_t delta;
                     45: 
                     46:   if(size * nmemb < 1)
                     47:     return 0;
                     48: 
                     49:   switch(pooh->count++) {
                     50:   case 0:
                     51:     *ptr = '\x41'; /* ASCII A. */
                     52:     return 1;
                     53:   case 1:
                     54:     pooh->origin = time(NULL);
                     55:     return CURL_READFUNC_PAUSE;
                     56:   case 2:
                     57:     delta = time(NULL) - pooh->origin;
                     58:     *ptr = delta >= PAUSE_TIME? '\x42': '\x41'; /* ASCII A or B. */
                     59:     return 1;
                     60:   case 3:
                     61:     return 0;
                     62:   }
                     63:   fprintf(stderr, "Read callback called after EOF\n");
                     64:   exit(1);
                     65: }
                     66: 
                     67: #if !defined(LIB670) && !defined(LIB672)
                     68: static int xferinfo(void *clientp, curl_off_t dltotal, curl_off_t dlnow,
                     69:                     curl_off_t ultotal, curl_off_t ulnow)
                     70: {
                     71:   struct ReadThis *pooh = (struct ReadThis *) clientp;
                     72: 
                     73:   (void) dltotal;
                     74:   (void) dlnow;
                     75:   (void) ultotal;
                     76:   (void) ulnow;
                     77: 
                     78:   if(pooh->origin) {
                     79:     time_t delta = time(NULL) - pooh->origin;
                     80: 
                     81:     if(delta >= 4 * PAUSE_TIME) {
                     82:       fprintf(stderr, "unpausing failed: drain problem?\n");
                     83:       return CURLE_ABORTED_BY_CALLBACK;
                     84:     }
                     85: 
                     86:     if(delta >= PAUSE_TIME)
                     87:       curl_easy_pause(pooh->easy, CURLPAUSE_CONT);
                     88:   }
                     89: 
                     90:   return 0;
                     91: }
                     92: #endif
                     93: 
                     94: int test(char *URL)
                     95: {
                     96: #if defined(LIB670) || defined(LIB671)
                     97:   curl_mime *mime = NULL;
                     98:   curl_mimepart *part;
                     99: #else
                    100:   CURLFORMcode formrc;
                    101:   struct curl_httppost *formpost = NULL;
                    102:   struct curl_httppost *lastptr = NULL;
                    103: #endif
                    104: #if defined(LIB670) || defined(LIB672)
                    105:   CURLM *multi = NULL;
                    106:   CURLMcode mres;
                    107:   CURLMsg *msg;
                    108:   int msgs_left;
                    109:   int still_running = 0;
                    110: #endif
                    111: 
                    112:   struct ReadThis pooh;
                    113:   CURLcode result;
                    114:   int res = TEST_ERR_FAILURE;
                    115: 
                    116:   /*
                    117:    * Check proper pausing/unpausing from a mime or form read callback.
                    118:    */
                    119: 
                    120:   if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
                    121:     fprintf(stderr, "curl_global_init() failed\n");
                    122:     return TEST_ERR_MAJOR_BAD;
                    123:   }
                    124: 
                    125:   pooh.origin = (time_t) 0;
                    126:   pooh.count = 0;
                    127:   pooh.easy = curl_easy_init();
                    128: 
                    129:   /* First set the URL that is about to receive our POST. */
                    130:   test_setopt(pooh.easy, CURLOPT_URL, URL);
                    131: 
                    132:   /* get verbose debug output please */
                    133:   test_setopt(pooh.easy, CURLOPT_VERBOSE, 1L);
                    134: 
                    135:   /* include headers in the output */
                    136:   test_setopt(pooh.easy, CURLOPT_HEADER, 1L);
                    137: 
                    138: #if defined(LIB670) || defined(LIB671)
                    139:   /* Build the mime tree. */
                    140:   mime = curl_mime_init(pooh.easy);
                    141:   part = curl_mime_addpart(mime);
                    142:   result = curl_mime_name(part, name);
                    143:   if(!result)
                    144:     res = curl_mime_data_cb(part, (curl_off_t) 2, read_callback,
                    145:                             NULL, NULL, &pooh);
                    146: 
                    147:   if(result) {
                    148:     fprintf(stderr,
                    149:             "Something went wrong when building the mime structure: %d\n",
                    150:             (int) result);
                    151:     goto test_cleanup;
                    152:   }
                    153: 
                    154:   /* Bind mime data to its easy handle. */
                    155:   if(!res)
                    156:     test_setopt(pooh.easy, CURLOPT_MIMEPOST, mime);
                    157: #else
                    158:   /* Build the form. */
                    159:   formrc = curl_formadd(&formpost, &lastptr,
                    160:                         CURLFORM_COPYNAME, name,
                    161:                         CURLFORM_STREAM, &pooh,
                    162:                         CURLFORM_CONTENTLEN, (curl_off_t) 2,
                    163:                         CURLFORM_END);
                    164:   if(formrc) {
                    165:     fprintf(stderr, "curl_formadd() = %d\n", (int) formrc);
                    166:     goto test_cleanup;
                    167:   }
                    168: 
                    169:   /* We want to use our own read function. */
                    170:   test_setopt(pooh.easy, CURLOPT_READFUNCTION, read_callback);
                    171: 
                    172:   /* Send a multi-part formpost. */
                    173:   test_setopt(pooh.easy, CURLOPT_HTTPPOST, formpost);
                    174: #endif
                    175: 
                    176: #if defined(LIB670) || defined(LIB672)
                    177:   /* Use the multi interface. */
                    178:   multi = curl_multi_init();
                    179:   mres = curl_multi_add_handle(multi, pooh.easy);
                    180:   while(!mres) {
                    181:     struct timeval timeout;
                    182:     int rc = 0;
                    183:     fd_set fdread;
                    184:     fd_set fdwrite;
                    185:     fd_set fdexcept;
                    186:     int maxfd = -1;
                    187: 
                    188:     mres = curl_multi_perform(multi, &still_running);
                    189:     if(!still_running || mres != CURLM_OK)
                    190:       break;
                    191: 
                    192:     if(pooh.origin) {
                    193:       time_t delta = time(NULL) - pooh.origin;
                    194: 
                    195:       if(delta >= 4 * PAUSE_TIME) {
                    196:         fprintf(stderr, "unpausing failed: drain problem?\n");
                    197:         res = CURLE_OPERATION_TIMEDOUT;
                    198:         break;
                    199:       }
                    200: 
                    201:       if(delta >= PAUSE_TIME)
                    202:         curl_easy_pause(pooh.easy, CURLPAUSE_CONT);
                    203:     }
                    204: 
                    205:     FD_ZERO(&fdread);
                    206:     FD_ZERO(&fdwrite);
                    207:     FD_ZERO(&fdexcept);
                    208:     timeout.tv_sec = 0;
                    209:     timeout.tv_usec = 1000000 * PAUSE_TIME / 10;
                    210:     mres = curl_multi_fdset(multi, &fdread, &fdwrite, &fdexcept, &maxfd);
                    211:     if(mres)
                    212:       break;
                    213: #if defined(WIN32) || defined(_WIN32)
                    214:     if(maxfd == -1)
                    215:       Sleep(100);
                    216:     else
                    217: #endif
                    218:     rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcept, &timeout);
                    219:     if(rc == -1) {
                    220:       fprintf(stderr, "Select error\n");
                    221:       break;
                    222:     }
                    223:   }
                    224: 
                    225:   if(mres != CURLM_OK)
                    226:     for(;;) {
                    227:       msg = curl_multi_info_read(multi, &msgs_left);
                    228:       if(!msg)
                    229:         break;
                    230:       if(msg->msg == CURLMSG_DONE) {
                    231:         result = msg->data.result;
                    232:         res = (int) result;
                    233:       }
                    234:     }
                    235: 
                    236:   curl_multi_remove_handle(multi, pooh.easy);
                    237:   curl_multi_cleanup(multi);
                    238: 
                    239: #else
                    240:   /* Use the easy interface. */
                    241:   test_setopt(pooh.easy, CURLOPT_XFERINFODATA, &pooh);
                    242:   test_setopt(pooh.easy, CURLOPT_XFERINFOFUNCTION, xferinfo);
                    243:   test_setopt(pooh.easy, CURLOPT_NOPROGRESS, 0L);
                    244:   result = curl_easy_perform(pooh.easy);
                    245:   res = (int) result;
                    246: #endif
                    247: 
                    248: 
                    249: test_cleanup:
                    250:   curl_easy_cleanup(pooh.easy);
                    251: #if defined(LIB670) || defined(LIB671)
                    252:   curl_mime_free(mime);
                    253: #else
                    254:   curl_formfree(formpost);
                    255: #endif
                    256: 
                    257:   curl_global_cleanup();
                    258:   return res;
                    259: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>