Files correlati : Commento : Aggiornata cUrl alla ultima versione su Github: 7.56.1 git-svn-id: svn://10.65.10.50/branches/R_10_00@24203 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			212 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			212 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /***************************************************************************
 | |
|  *                                  _   _ ____  _
 | |
|  *  Project                     ___| | | |  _ \| |
 | |
|  *                             / __| | | | |_) | |
 | |
|  *                            | (__| |_| |  _ <| |___
 | |
|  *                             \___|\___/|_| \_\_____|
 | |
|  *
 | |
|  * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
 | |
|  *
 | |
|  * This software is licensed as described in the file COPYING, which
 | |
|  * you should have received as part of this distribution. The terms
 | |
|  * are also available at https://curl.haxx.se/docs/copyright.html.
 | |
|  *
 | |
|  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 | |
|  * copies of the Software, and permit persons to whom the Software is
 | |
|  * furnished to do so, under the terms of the COPYING file.
 | |
|  *
 | |
|  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 | |
|  * KIND, either express or implied.
 | |
|  *
 | |
|  ***************************************************************************/
 | |
| #include "test.h"
 | |
| 
 | |
| #include "memdebug.h"
 | |
| 
 | |
| static char data[] =
 | |
| #ifdef CURL_DOES_CONVERSIONS
 | |
|   /* ASCII representation with escape sequences for non-ASCII platforms */
 | |
|   "\x74\x68\x69\x73\x20\x69\x73\x20\x77\x68\x61\x74\x20\x77\x65\x20\x70"
 | |
|   "\x6f\x73\x74\x20\x74\x6f\x20\x74\x68\x65\x20\x73\x69\x6c\x6c\x79\x20"
 | |
|   "\x77\x65\x62\x20\x73\x65\x72\x76\x65\x72";
 | |
| #else
 | |
|   "this is what we post to the silly web server";
 | |
| #endif
 | |
| 
 | |
| static const char name[] = "fieldname";
 | |
| 
 | |
| 
 | |
| /* This test attempts to use all form API features that are not
 | |
|  * used elsewhere.
 | |
|  */
 | |
| 
 | |
| /* curl_formget callback to count characters. */
 | |
| static size_t count_chars(void *userp, const char *buf, size_t len)
 | |
| {
 | |
|   size_t *pcounter = (size_t *) userp;
 | |
| 
 | |
|   (void) buf;
 | |
|   *pcounter += len;
 | |
|   return len;
 | |
| }
 | |
| 
 | |
| 
 | |
| int test(char *URL)
 | |
| {
 | |
|   CURL *curl = NULL;
 | |
|   CURLcode res = TEST_ERR_MAJOR_BAD;
 | |
|   CURLFORMcode formrc;
 | |
|   struct curl_slist *headers, *headers2 = NULL;
 | |
|   struct curl_httppost *formpost = NULL;
 | |
|   struct curl_httppost *lastptr = NULL;
 | |
|   struct curl_forms formarray[3];
 | |
|   size_t formlength = 0;
 | |
|   char flbuf[32];
 | |
| 
 | |
|   if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
 | |
|     fprintf(stderr, "curl_global_init() failed\n");
 | |
|     return TEST_ERR_MAJOR_BAD;
 | |
|   }
 | |
| 
 | |
|   /* Check proper name and data copying, as well as headers. */
 | |
|   headers = curl_slist_append(NULL, "X-customheader-1: Header 1 data");
 | |
|   if(!headers) {
 | |
|     goto test_cleanup;
 | |
|   }
 | |
|   headers2 = curl_slist_append(headers, "X-customheader-2: Header 2 data");
 | |
|   if(!headers2) {
 | |
|     goto test_cleanup;
 | |
|   }
 | |
|   headers = headers2;
 | |
|   headers2 = curl_slist_append(headers, "Content-Type: text/plain");
 | |
|   if(!headers2) {
 | |
|     goto test_cleanup;
 | |
|   }
 | |
|   headers = headers2;
 | |
|   formrc = curl_formadd(&formpost, &lastptr,
 | |
|                         CURLFORM_COPYNAME, &name,
 | |
|                         CURLFORM_COPYCONTENTS, &data,
 | |
|                         CURLFORM_CONTENTHEADER, headers,
 | |
|                         CURLFORM_END);
 | |
| 
 | |
|   if(formrc) {
 | |
|     printf("curl_formadd(1) = %d\n", (int) formrc);
 | |
|     goto test_cleanup;
 | |
|   }
 | |
| 
 | |
|   /* Use a form array for the non-copy test. */
 | |
|   formarray[0].option = CURLFORM_PTRCONTENTS;
 | |
|   formarray[0].value = data;
 | |
|   formarray[1].option = CURLFORM_CONTENTSLENGTH;
 | |
|   formarray[1].value = (char *) strlen(data) - 1;
 | |
|   formarray[2].option = CURLFORM_END;
 | |
|   formarray[2].value = NULL;
 | |
|   formrc = curl_formadd(&formpost,
 | |
|                         &lastptr,
 | |
|                         CURLFORM_PTRNAME, name,
 | |
|                         CURLFORM_NAMELENGTH, strlen(name) - 1,
 | |
|                         CURLFORM_ARRAY, formarray,
 | |
|                         CURLFORM_FILENAME, "remotefile.txt",
 | |
|                         CURLFORM_END);
 | |
| 
 | |
|   if(formrc) {
 | |
|     printf("curl_formadd(2) = %d\n", (int) formrc);
 | |
|     goto test_cleanup;
 | |
|   }
 | |
| 
 | |
|   /* Now change in-memory data to affect CURLOPT_PTRCONTENTS value.
 | |
|      Copied values (first field) must not be affected.
 | |
|      CURLOPT_PTRNAME actually copies the name thus we do not test this here. */
 | |
|   data[0]++;
 | |
| 
 | |
|   /* Check multi-files and content type propagation. */
 | |
|   formrc = curl_formadd(&formpost,
 | |
|                         &lastptr,
 | |
|                         CURLFORM_COPYNAME, "multifile",
 | |
|                         CURLFORM_FILE, libtest_arg2,    /* Set in first.c. */
 | |
|                         CURLFORM_FILE, libtest_arg2,
 | |
|                         CURLFORM_CONTENTTYPE, "text/whatever",
 | |
|                         CURLFORM_FILE, libtest_arg2,
 | |
|                         CURLFORM_END);
 | |
| 
 | |
|   if(formrc) {
 | |
|     printf("curl_formadd(3) = %d\n", (int) formrc);
 | |
|     goto test_cleanup;
 | |
|   }
 | |
| 
 | |
|   /* Check data from file content. */
 | |
|   formrc = curl_formadd(&formpost,
 | |
|                         &lastptr,
 | |
|                         CURLFORM_COPYNAME, "filecontents",
 | |
|                         CURLFORM_FILECONTENT, libtest_arg2,
 | |
|                         CURLFORM_END);
 | |
| 
 | |
|   if(formrc) {
 | |
|     printf("curl_formadd(4) = %d\n", (int) formrc);
 | |
|     goto test_cleanup;
 | |
|   }
 | |
| 
 | |
|   /* Measure the current form length.
 | |
|    * This is done before including stdin data because we want to reuse it
 | |
|    * and stdin cannot be rewound.
 | |
|    */
 | |
|   curl_formget(formpost, (void *) &formlength, count_chars);
 | |
| 
 | |
|   /* Include length in data for external check. */
 | |
|   curl_msnprintf(flbuf, sizeof flbuf, "%lu", (unsigned long) formlength);
 | |
|   formrc = curl_formadd(&formpost,
 | |
|                         &lastptr,
 | |
|                         CURLFORM_COPYNAME, "formlength",
 | |
|                         CURLFORM_COPYCONTENTS, &flbuf,
 | |
|                         CURLFORM_END);
 | |
|   if(formrc) {
 | |
|     printf("curl_formadd(5) = %d\n", (int) formrc);
 | |
|     goto test_cleanup;
 | |
|   }
 | |
| 
 | |
|   /* Check stdin (may be problematic on some platforms). */
 | |
|   formrc = curl_formadd(&formpost,
 | |
|                         &lastptr,
 | |
|                         CURLFORM_COPYNAME, "standardinput",
 | |
|                         CURLFORM_FILE, "-",
 | |
|                         CURLFORM_END);
 | |
|   if(formrc) {
 | |
|     printf("curl_formadd(6) = %d\n", (int) formrc);
 | |
|     goto test_cleanup;
 | |
|   }
 | |
| 
 | |
|   curl = curl_easy_init();
 | |
|   if(!curl) {
 | |
|     fprintf(stderr, "curl_easy_init() failed\n");
 | |
|     goto test_cleanup;
 | |
|   }
 | |
| 
 | |
|   /* First set the URL that is about to receive our POST. */
 | |
|   test_setopt(curl, CURLOPT_URL, URL);
 | |
| 
 | |
|   /* send a multi-part formpost */
 | |
|   test_setopt(curl, CURLOPT_HTTPPOST, formpost);
 | |
| 
 | |
|   /* get verbose debug output please */
 | |
|   test_setopt(curl, CURLOPT_VERBOSE, 1L);
 | |
| 
 | |
|   /* include headers in the output */
 | |
|   test_setopt(curl, CURLOPT_HEADER, 1L);
 | |
| 
 | |
|   /* Perform the request, res will get the return code */
 | |
|   res = curl_easy_perform(curl);
 | |
| 
 | |
| test_cleanup:
 | |
| 
 | |
|   /* always cleanup */
 | |
|   curl_easy_cleanup(curl);
 | |
| 
 | |
|   /* now cleanup the formpost chain */
 | |
|   curl_formfree(formpost);
 | |
|   curl_slist_free_all(headers);
 | |
| 
 | |
|   curl_global_cleanup();
 | |
| 
 | |
|   return res;
 | |
| }
 |