Annotation of embedaddon/curl/tests/libtest/lib552.c, revision 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>