Annotation of embedaddon/curl/tests/libtest/lib555.c, revision 1.1.1.1

1.1       misho       1: /***************************************************************************
                      2:  *                                  _   _ ____  _
                      3:  *  Project                     ___| | | |  _ \| |
                      4:  *                             / __| | | | |_) | |
                      5:  *                            | (__| |_| |  _ <| |___
                      6:  *                             \___|\___/|_| \_\_____|
                      7:  *
                      8:  * Copyright (C) 1998 - 2018, 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: /* This test case is supposed to be identical to 547 except that this uses the
                     24:  * multi interface and 547 is easy interface.
                     25:  *
                     26:  * argv1 = URL
                     27:  * argv2 = proxy
                     28:  * argv3 = proxyuser:password
                     29:  */
                     30: 
                     31: #include "test.h"
                     32: #include "testutil.h"
                     33: #include "warnless.h"
                     34: #include "memdebug.h"
                     35: 
                     36: #define TEST_HANG_TIMEOUT 60 * 1000
                     37: 
                     38: static const char uploadthis[] =
                     39: #ifdef CURL_DOES_CONVERSIONS
                     40:   /* ASCII representation with escape sequences for non-ASCII platforms */
                     41:   "\x74\x68\x69\x73\x20\x69\x73\x20\x74\x68\x65\x20\x62\x6c\x75\x72"
                     42:   "\x62\x20\x77\x65\x20\x77\x61\x6e\x74\x20\x74\x6f\x20\x75\x70\x6c"
                     43:   "\x6f\x61\x64\x0a";
                     44: #else
                     45:   "this is the blurb we want to upload\n";
                     46: #endif
                     47: 
                     48: static size_t readcallback(void  *ptr,
                     49:                            size_t size,
                     50:                            size_t nmemb,
                     51:                            void *clientp)
                     52: {
                     53:   int *counter = (int *)clientp;
                     54: 
                     55:   if(*counter) {
                     56:     /* only do this once and then require a clearing of this */
                     57:     fprintf(stderr, "READ ALREADY DONE!\n");
                     58:     return 0;
                     59:   }
                     60:   (*counter)++; /* bump */
                     61: 
                     62:   if(size * nmemb > strlen(uploadthis)) {
                     63:     fprintf(stderr, "READ!\n");
                     64:     strcpy(ptr, uploadthis);
                     65:     return strlen(uploadthis);
                     66:   }
                     67:   fprintf(stderr, "READ NOT FINE!\n");
                     68:   return 0;
                     69: }
                     70: static curlioerr ioctlcallback(CURL *handle,
                     71:                                int cmd,
                     72:                                void *clientp)
                     73: {
                     74:   int *counter = (int *)clientp;
                     75:   (void)handle; /* unused */
                     76:   if(cmd == CURLIOCMD_RESTARTREAD) {
                     77:     fprintf(stderr, "REWIND!\n");
                     78:     *counter = 0; /* clear counter to make the read callback restart */
                     79:   }
                     80:   return CURLIOE_OK;
                     81: }
                     82: 
                     83: 
                     84: int test(char *URL)
                     85: {
                     86:   int res = 0;
                     87:   CURL *curl = NULL;
                     88:   int counter = 0;
                     89:   CURLM *m = NULL;
                     90:   int running = 1;
                     91: 
                     92:   start_test_timing();
                     93: 
                     94:   global_init(CURL_GLOBAL_ALL);
                     95: 
                     96:   easy_init(curl);
                     97: 
                     98:   easy_setopt(curl, CURLOPT_URL, URL);
                     99:   easy_setopt(curl, CURLOPT_VERBOSE, 1L);
                    100:   easy_setopt(curl, CURLOPT_HEADER, 1L);
                    101: 
                    102:   /* read the POST data from a callback */
                    103:   easy_setopt(curl, CURLOPT_IOCTLFUNCTION, ioctlcallback);
                    104:   easy_setopt(curl, CURLOPT_IOCTLDATA, &counter);
                    105:   easy_setopt(curl, CURLOPT_READFUNCTION, readcallback);
                    106:   easy_setopt(curl, CURLOPT_READDATA, &counter);
                    107:   /* We CANNOT do the POST fine without setting the size (or choose
                    108:      chunked)! */
                    109:   easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(uploadthis));
                    110: 
                    111:   easy_setopt(curl, CURLOPT_POST, 1L);
                    112:   easy_setopt(curl, CURLOPT_PROXY, libtest_arg2);
                    113:   easy_setopt(curl, CURLOPT_PROXYUSERPWD, libtest_arg3);
                    114:   easy_setopt(curl, CURLOPT_PROXYAUTH,
                    115:                    (long) (CURLAUTH_NTLM | CURLAUTH_DIGEST | CURLAUTH_BASIC) );
                    116: 
                    117:   multi_init(m);
                    118: 
                    119:   multi_add_handle(m, curl);
                    120: 
                    121:   while(running) {
                    122:     struct timeval timeout;
                    123:     fd_set fdread, fdwrite, fdexcep;
                    124:     int maxfd = -99;
                    125: 
                    126:     timeout.tv_sec = 0;
                    127:     timeout.tv_usec = 100000L; /* 100 ms */
                    128: 
                    129:     multi_perform(m, &running);
                    130: 
                    131:     abort_on_test_timeout();
                    132: 
                    133: #ifdef TPF
                    134:     sleep(1); /* avoid ctl-10 dump */
                    135: #endif
                    136: 
                    137:     if(!running)
                    138:       break; /* done */
                    139: 
                    140:     FD_ZERO(&fdread);
                    141:     FD_ZERO(&fdwrite);
                    142:     FD_ZERO(&fdexcep);
                    143: 
                    144:     multi_fdset(m, &fdread, &fdwrite, &fdexcep, &maxfd);
                    145: 
                    146:     /* At this point, maxfd is guaranteed to be greater or equal than -1. */
                    147: 
                    148:     select_test(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
                    149: 
                    150:     abort_on_test_timeout();
                    151:   }
                    152: 
                    153: test_cleanup:
                    154: 
                    155:   /* proper cleanup sequence - type PA */
                    156: 
                    157:   curl_multi_remove_handle(m, curl);
                    158:   curl_multi_cleanup(m);
                    159:   curl_easy_cleanup(curl);
                    160:   curl_global_cleanup();
                    161: 
                    162:   return res;
                    163: }

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