Annotation of embedaddon/curl/tests/libtest/lib643.c, revision 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: #include "test.h"
        !            23: 
        !            24: #include "memdebug.h"
        !            25: 
        !            26: static char data[]=
        !            27: #ifdef CURL_DOES_CONVERSIONS
        !            28:   /* ASCII representation with escape sequences for non-ASCII platforms */
        !            29:   "\x64\x75\x6d\x6d\x79\x0a";
        !            30: #else
        !            31:   "dummy\n";
        !            32: #endif
        !            33: 
        !            34: struct WriteThis {
        !            35:   char *readptr;
        !            36:   curl_off_t sizeleft;
        !            37: };
        !            38: 
        !            39: static size_t read_callback(char *ptr, size_t size, size_t nmemb, void *userp)
        !            40: {
        !            41: #ifdef LIB644
        !            42:   static int count = 0;
        !            43:   (void)ptr;
        !            44:   (void)size;
        !            45:   (void)nmemb;
        !            46:   (void)userp;
        !            47:   switch(count++) {
        !            48:   case 0: /* Return a single byte. */
        !            49:     *ptr = '\n';
        !            50:     return 1;
        !            51:   case 1: /* Request abort. */
        !            52:     return CURL_READFUNC_ABORT;
        !            53:   }
        !            54:   printf("Wrongly called >2 times\n");
        !            55:   exit(1); /* trigger major failure */
        !            56: #else
        !            57: 
        !            58:   struct WriteThis *pooh = (struct WriteThis *)userp;
        !            59:   int eof = !*pooh->readptr;
        !            60: 
        !            61:   if(size*nmemb < 1)
        !            62:     return 0;
        !            63: 
        !            64: #ifndef LIB645
        !            65:   eof = pooh->sizeleft <= 0;
        !            66:   if(!eof)
        !            67:     pooh->sizeleft--;
        !            68: #endif
        !            69: 
        !            70:   if(!eof) {
        !            71:     *ptr = *pooh->readptr;           /* copy one single byte */
        !            72:     pooh->readptr++;                 /* advance pointer */
        !            73:     return 1;                        /* we return 1 byte at a time! */
        !            74:   }
        !            75: 
        !            76:   return 0;                         /* no more data left to deliver */
        !            77: #endif
        !            78: }
        !            79: 
        !            80: static int once(char *URL, bool oldstyle)
        !            81: {
        !            82:   CURL *curl;
        !            83:   CURLcode res = CURLE_OK;
        !            84: 
        !            85:   curl_mime *mime = NULL;
        !            86:   curl_mimepart *part = NULL;
        !            87:   struct WriteThis pooh;
        !            88:   struct WriteThis pooh2;
        !            89:   curl_off_t datasize = -1;
        !            90: 
        !            91:   pooh.readptr = data;
        !            92: #ifndef LIB645
        !            93:   datasize = (curl_off_t)strlen(data);
        !            94: #endif
        !            95:   pooh.sizeleft = datasize;
        !            96: 
        !            97:   curl = curl_easy_init();
        !            98:   if(!curl) {
        !            99:     fprintf(stderr, "curl_easy_init() failed\n");
        !           100:     curl_global_cleanup();
        !           101:     return TEST_ERR_MAJOR_BAD;
        !           102:   }
        !           103: 
        !           104:   mime = curl_mime_init(curl);
        !           105:   if(!mime) {
        !           106:     fprintf(stderr, "curl_mime_init() failed\n");
        !           107:     curl_easy_cleanup(curl);
        !           108:     curl_global_cleanup();
        !           109:     return TEST_ERR_MAJOR_BAD;
        !           110:   }
        !           111: 
        !           112:   part = curl_mime_addpart(mime);
        !           113:   if(!part) {
        !           114:     fprintf(stderr, "curl_mime_addpart(1) failed\n");
        !           115:     curl_mime_free(mime);
        !           116:     curl_easy_cleanup(curl);
        !           117:     curl_global_cleanup();
        !           118:     return TEST_ERR_MAJOR_BAD;
        !           119:   }
        !           120: 
        !           121:   /* Fill in the file upload part */
        !           122:   if(oldstyle) {
        !           123:     res = curl_mime_name(part, "sendfile");
        !           124:     if(!res)
        !           125:       res = curl_mime_data_cb(part, datasize, read_callback,
        !           126:                               NULL, NULL, &pooh);
        !           127:     if(!res)
        !           128:       res = curl_mime_filename(part, "postit2.c");
        !           129:   }
        !           130:   else {
        !           131:     /* new style */
        !           132:     res = curl_mime_name(part, "sendfile alternative");
        !           133:     if(!res)
        !           134:       res = curl_mime_data_cb(part, datasize, read_callback,
        !           135:                               NULL, NULL, &pooh);
        !           136:     if(!res)
        !           137:       res = curl_mime_filename(part, "file name 2");
        !           138:   }
        !           139: 
        !           140:   if(res)
        !           141:     printf("curl_mime_xxx(1) = %s\n", curl_easy_strerror(res));
        !           142: 
        !           143:   /* Now add the same data with another name and make it not look like
        !           144:      a file upload but still using the callback */
        !           145: 
        !           146:   pooh2.readptr = data;
        !           147: #ifndef LIB645
        !           148:   datasize = (curl_off_t)strlen(data);
        !           149: #endif
        !           150:   pooh2.sizeleft = datasize;
        !           151: 
        !           152:   part = curl_mime_addpart(mime);
        !           153:   if(!part) {
        !           154:     fprintf(stderr, "curl_mime_addpart(2) failed\n");
        !           155:     curl_mime_free(mime);
        !           156:     curl_easy_cleanup(curl);
        !           157:     curl_global_cleanup();
        !           158:     return TEST_ERR_MAJOR_BAD;
        !           159:   }
        !           160:   /* Fill in the file upload part */
        !           161:   res = curl_mime_name(part, "callbackdata");
        !           162:   if(!res)
        !           163:     res = curl_mime_data_cb(part, datasize, read_callback,
        !           164:                             NULL, NULL, &pooh2);
        !           165: 
        !           166:   if(res)
        !           167:     printf("curl_mime_xxx(2) = %s\n", curl_easy_strerror(res));
        !           168: 
        !           169:   part = curl_mime_addpart(mime);
        !           170:   if(!part) {
        !           171:     fprintf(stderr, "curl_mime_addpart(3) failed\n");
        !           172:     curl_mime_free(mime);
        !           173:     curl_easy_cleanup(curl);
        !           174:     curl_global_cleanup();
        !           175:     return TEST_ERR_MAJOR_BAD;
        !           176:   }
        !           177: 
        !           178:   /* Fill in the filename field */
        !           179:   res = curl_mime_name(part, "filename");
        !           180:   if(!res)
        !           181:     res = curl_mime_data(part,
        !           182: #ifdef CURL_DOES_CONVERSIONS
        !           183:                          /* ASCII representation with escape
        !           184:                             sequences for non-ASCII platforms */
        !           185:                          "\x70\x6f\x73\x74\x69\x74\x32\x2e\x63",
        !           186: #else
        !           187:                           "postit2.c",
        !           188: #endif
        !           189:                           CURL_ZERO_TERMINATED);
        !           190: 
        !           191:   if(res)
        !           192:     printf("curl_mime_xxx(3) = %s\n", curl_easy_strerror(res));
        !           193: 
        !           194:   /* Fill in a submit field too */
        !           195:   part = curl_mime_addpart(mime);
        !           196:   if(!part) {
        !           197:     fprintf(stderr, "curl_mime_addpart(4) failed\n");
        !           198:     curl_mime_free(mime);
        !           199:     curl_easy_cleanup(curl);
        !           200:     curl_global_cleanup();
        !           201:     return TEST_ERR_MAJOR_BAD;
        !           202:   }
        !           203:   res = curl_mime_name(part, "submit");
        !           204:   if(!res)
        !           205:     res = curl_mime_data(part,
        !           206: #ifdef CURL_DOES_CONVERSIONS
        !           207:                          /* ASCII representation with escape
        !           208:                             sequences for non-ASCII platforms */
        !           209:                          "\x73\x65\x6e\x64",
        !           210: #else
        !           211:                           "send",
        !           212: #endif
        !           213:                           CURL_ZERO_TERMINATED);
        !           214: 
        !           215:   if(res)
        !           216:     printf("curl_mime_xxx(4) = %s\n", curl_easy_strerror(res));
        !           217: 
        !           218:   part = curl_mime_addpart(mime);
        !           219:   if(!part) {
        !           220:     fprintf(stderr, "curl_mime_addpart(5) failed\n");
        !           221:     curl_mime_free(mime);
        !           222:     curl_easy_cleanup(curl);
        !           223:     curl_global_cleanup();
        !           224:     return TEST_ERR_MAJOR_BAD;
        !           225:   }
        !           226:   res = curl_mime_name(part, "somename");
        !           227:   if(!res)
        !           228:     res = curl_mime_filename(part, "somefile.txt");
        !           229:   if(!res)
        !           230:     res = curl_mime_data(part, "blah blah", 9);
        !           231: 
        !           232:   if(res)
        !           233:     printf("curl_mime_xxx(5) = %s\n", curl_easy_strerror(res));
        !           234: 
        !           235:   /* First set the URL that is about to receive our POST. */
        !           236:   test_setopt(curl, CURLOPT_URL, URL);
        !           237: 
        !           238:   /* send a multi-part mimepost */
        !           239:   test_setopt(curl, CURLOPT_MIMEPOST, mime);
        !           240: 
        !           241:   /* get verbose debug output please */
        !           242:   test_setopt(curl, CURLOPT_VERBOSE, 1L);
        !           243: 
        !           244:   /* include headers in the output */
        !           245:   test_setopt(curl, CURLOPT_HEADER, 1L);
        !           246: 
        !           247:   /* Perform the request, res will get the return code */
        !           248:   res = curl_easy_perform(curl);
        !           249: 
        !           250: test_cleanup:
        !           251: 
        !           252:   /* always cleanup */
        !           253:   curl_easy_cleanup(curl);
        !           254: 
        !           255:   /* now cleanup the mimepost structure */
        !           256:   curl_mime_free(mime);
        !           257: 
        !           258:   return res;
        !           259: }
        !           260: 
        !           261: static int cyclic_add(void)
        !           262: {
        !           263:   CURL *easy = curl_easy_init();
        !           264:   curl_mime *mime = curl_mime_init(easy);
        !           265:   curl_mimepart *part = curl_mime_addpart(mime);
        !           266:   CURLcode a1 = curl_mime_subparts(part, mime);
        !           267: 
        !           268:   if(a1 == CURLE_BAD_FUNCTION_ARGUMENT) {
        !           269:     curl_mime *submime = curl_mime_init(easy);
        !           270:     curl_mimepart *subpart = curl_mime_addpart(submime);
        !           271: 
        !           272:     curl_mime_subparts(part, submime);
        !           273:     a1 = curl_mime_subparts(subpart, mime);
        !           274:   }
        !           275: 
        !           276:   curl_mime_free(mime);
        !           277:   curl_easy_cleanup(easy);
        !           278:   if(a1 != CURLE_BAD_FUNCTION_ARGUMENT)
        !           279:     /* that should have failed */
        !           280:     return 1;
        !           281: 
        !           282:   return 0;
        !           283: }
        !           284: 
        !           285: int test(char *URL)
        !           286: {
        !           287:   int res;
        !           288: 
        !           289:   if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
        !           290:     fprintf(stderr, "curl_global_init() failed\n");
        !           291:     return TEST_ERR_MAJOR_BAD;
        !           292:   }
        !           293: 
        !           294:   res = once(URL, TRUE); /* old */
        !           295:   if(!res)
        !           296:     res = once(URL, FALSE); /* new */
        !           297: 
        !           298:   if(!res)
        !           299:     res = cyclic_add();
        !           300: 
        !           301:   curl_global_cleanup();
        !           302: 
        !           303:   return res;
        !           304: }

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