File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / curl / tests / libtest / lib552.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Jun 3 10:01:16 2020 UTC (5 years ago) by misho
Branches: curl, MAIN
CVS tags: v7_70_0p4, HEAD
curl

    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>