Annotation of embedaddon/curl/tests/libtest/lib552.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: /* argv1 = URL
                     23:  * argv2 = proxy with embedded user+password
                     24:  */
                     25: 
                     26: #include "test.h"
                     27: 
                     28: #include "warnless.h"
                     29: #include "memdebug.h"
                     30: 
                     31: struct data {
                     32:   char trace_ascii; /* 1 or 0 */
                     33: };
                     34: 
                     35: static
                     36: void dump(const char *text,
                     37:           FILE *stream, unsigned char *ptr, size_t size,
                     38:           char nohex)
                     39: {
                     40:   size_t i;
                     41:   size_t c;
                     42: 
                     43:   unsigned int width = 0x10;
                     44: 
                     45:   if(nohex)
                     46:     /* without the hex output, we can fit more on screen */
                     47:     width = 0x40;
                     48: 
                     49:   fprintf(stream, "%s, %zu bytes (0x%zx)\n", text, size, size);
                     50: 
                     51:   for(i = 0; i<size; i += width) {
                     52: 
                     53:     fprintf(stream, "%04zx: ", i);
                     54: 
                     55:     if(!nohex) {
                     56:       /* hex not disabled, show it */
                     57:       for(c = 0; c < width; c++)
                     58:         if(i + c < size)
                     59:           fprintf(stream, "%02x ", ptr[i + c]);
                     60:         else
                     61:           fputs("   ", stream);
                     62:     }
                     63: 
                     64:     for(c = 0; (c < width) && (i + c < size); c++) {
                     65:       /* check for 0D0A; if found, skip past and start a new line of output */
                     66:       if(nohex && (i + c + 1 < size) && ptr[i + c] == 0x0D &&
                     67:          ptr[i + c + 1] == 0x0A) {
                     68:         i += (c + 2 - width);
                     69:         break;
                     70:       }
                     71:       fprintf(stream, "%c",
                     72:               (ptr[i + c] >= 0x20) && (ptr[i + c]<0x80)? ptr[i + c] : '.');
                     73:       /* check again for 0D0A, to avoid an extra \n if it's at width */
                     74:       if(nohex && (i + c + 2 < size) && ptr[i + c + 1] == 0x0D &&
                     75:          ptr[i + c + 2] == 0x0A) {
                     76:         i += (c + 3 - width);
                     77:         break;
                     78:       }
                     79:     }
                     80:     fputc('\n', stream); /* newline */
                     81:   }
                     82:   fflush(stream);
                     83: }
                     84: 
                     85: static
                     86: int my_trace(CURL *handle, curl_infotype type,
                     87:              char *data, size_t size,
                     88:              void *userp)
                     89: {
                     90:   struct data *config = (struct data *)userp;
                     91:   const char *text;
                     92:   (void)handle; /* prevent compiler warning */
                     93: 
                     94:   switch(type) {
                     95:   case CURLINFO_TEXT:
                     96:     fprintf(stderr, "== Info: %s", (char *)data);
                     97:     /* FALLTHROUGH */
                     98:   default: /* in case a new one is introduced to shock us */
                     99:     return 0;
                    100: 
                    101:   case CURLINFO_HEADER_OUT:
                    102:     text = "=> Send header";
                    103:     break;
                    104:   case CURLINFO_DATA_OUT:
                    105:     text = "=> Send data";
                    106:     break;
                    107:   case CURLINFO_SSL_DATA_OUT:
                    108:     text = "=> Send SSL data";
                    109:     break;
                    110:   case CURLINFO_HEADER_IN:
                    111:     text = "<= Recv header";
                    112:     break;
                    113:   case CURLINFO_DATA_IN:
                    114:     text = "<= Recv data";
                    115:     break;
                    116:   case CURLINFO_SSL_DATA_IN:
                    117:     text = "<= Recv SSL data";
                    118:     break;
                    119:   }
                    120: 
                    121:   dump(text, stderr, (unsigned char *)data, size, config->trace_ascii);
                    122:   return 0;
                    123: }
                    124: 
                    125: 
                    126: static size_t current_offset = 0;
                    127: static char databuf[70000]; /* MUST be more than 64k OR
                    128:                                MAX_INITIAL_POST_SIZE */
                    129: 
                    130: static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
                    131: {
                    132:   size_t  amount = nmemb * size; /* Total bytes curl wants */
                    133:   size_t  available = sizeof(databuf) - current_offset; /* What we have to
                    134:                                                            give */
                    135:   size_t  given = amount < available ? amount : available; /* What is given */
                    136:   (void)stream;
                    137:   memcpy(ptr, databuf + current_offset, given);
                    138:   current_offset += given;
                    139:   return given;
                    140: }
                    141: 
                    142: 
                    143: static size_t write_callback(void *ptr, size_t size, size_t nmemb,
                    144:                              void *stream)
                    145: {
                    146:   int amount = curlx_uztosi(size * nmemb);
                    147:   printf("%.*s", amount, (char *)ptr);
                    148:   (void)stream;
                    149:   return size * nmemb;
                    150: }
                    151: 
                    152: 
                    153: static curlioerr ioctl_callback(CURL *handle, int cmd, void *clientp)
                    154: {
                    155:   (void)clientp;
                    156:   if(cmd == CURLIOCMD_RESTARTREAD) {
                    157:     printf("APPLICATION: received a CURLIOCMD_RESTARTREAD request\n");
                    158:     printf("APPLICATION: ** REWINDING! **\n");
                    159:     current_offset = 0;
                    160:     return CURLIOE_OK;
                    161:   }
                    162:   (void)handle;
                    163:   return CURLIOE_UNKNOWNCMD;
                    164: }
                    165: 
                    166: 
                    167: 
                    168: int test(char *URL)
                    169: {
                    170:   CURL *curl;
                    171:   CURLcode res = CURLE_OK;
                    172:   struct data config;
                    173:   size_t i;
                    174:   static const char fill[] = "test data";
                    175: 
                    176:   config.trace_ascii = 1; /* enable ascii tracing */
                    177: 
                    178:   global_init(CURL_GLOBAL_ALL);
                    179:   easy_init(curl);
                    180: 
                    181:   test_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace);
                    182:   test_setopt(curl, CURLOPT_DEBUGDATA, &config);
                    183:   /* the DEBUGFUNCTION has no effect until we enable VERBOSE */
                    184:   test_setopt(curl, CURLOPT_VERBOSE, 1L);
                    185: 
                    186:   /* setup repeated data string */
                    187:   for(i = 0; i < sizeof(databuf); ++i)
                    188:     databuf[i] = fill[i % sizeof(fill)];
                    189: 
                    190:   /* Post */
                    191:   test_setopt(curl, CURLOPT_POST, 1L);
                    192: 
                    193: #ifdef CURL_DOES_CONVERSIONS
                    194:   /* Convert the POST data to ASCII */
                    195:   test_setopt(curl, CURLOPT_TRANSFERTEXT, 1L);
                    196: #endif
                    197: 
                    198:   /* Setup read callback */
                    199:   test_setopt(curl, CURLOPT_POSTFIELDSIZE, (long) sizeof(databuf));
                    200:   test_setopt(curl, CURLOPT_READFUNCTION, read_callback);
                    201: 
                    202:   /* Write callback */
                    203:   test_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
                    204: 
                    205:   /* Ioctl function */
                    206:   test_setopt(curl, CURLOPT_IOCTLFUNCTION, ioctl_callback);
                    207: 
                    208:   test_setopt(curl, CURLOPT_PROXY, libtest_arg2);
                    209: 
                    210:   test_setopt(curl, CURLOPT_URL, URL);
                    211: 
                    212:   /* Accept any auth. But for this bug configure proxy with DIGEST, basic
                    213:      might work too, not NTLM */
                    214:   test_setopt(curl, CURLOPT_PROXYAUTH, (long)CURLAUTH_ANY);
                    215: 
                    216:   res = curl_easy_perform(curl);
                    217:   fprintf(stderr, "curl_easy_perform = %d\n", (int)res);
                    218: 
                    219: test_cleanup:
                    220: 
                    221:   curl_easy_cleanup(curl);
                    222:   curl_global_cleanup();
                    223:   return (int)res;
                    224: }

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