lib643.c
Go to the documentation of this file.
1 /***************************************************************************
2  * _ _ ____ _
3  * Project ___| | | | _ \| |
4  * / __| | | | |_) | |
5  * | (__| |_| | _ <| |___
6  * \___|\___/|_| \_\_____|
7  *
8  * Copyright (C) 1998 - 2017, 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  "\x74\x68\x69\x73\x20\x69\x73\x20\x77\x68\x61\x74\x20\x77\x65\x20\x70"
30  "\x6f\x73\x74\x20\x74\x6f\x20\x74\x68\x65\x20\x73\x69\x6c\x6c\x79\x20"
31  "\x77\x65\x62\x20\x73\x65\x72\x76\x65\x72\x0a";
32 #else
33  "this is what we post to the silly web server\n";
34 #endif
35 
36 struct WriteThis {
37  char *readptr;
39 };
40 
41 static size_t read_callback(char *ptr, size_t size, size_t nmemb, void *userp)
42 {
43 #ifdef LIB644
44  (void)ptr;
45  (void)size;
46  (void)nmemb;
47  (void)userp;
48  return CURL_READFUNC_ABORT;
49 #else
50 
51  struct WriteThis *pooh = (struct WriteThis *)userp;
52  int eof = !*pooh->readptr;
53 
54  if(size*nmemb < 1)
55  return 0;
56 
57 #ifndef LIB645
58  eof = pooh->sizeleft <= 0;
59  if(!eof)
60  pooh->sizeleft--;
61 #endif
62 
63  if(!eof) {
64  *ptr = *pooh->readptr; /* copy one single byte */
65  pooh->readptr++; /* advance pointer */
66  return 1; /* we return 1 byte at a time! */
67  }
68 
69  return 0; /* no more data left to deliver */
70 #endif
71 }
72 
73 static int once(char *URL, bool oldstyle)
74 {
75  CURL *curl;
77 
78  curl_mime *mime = NULL;
79  curl_mimepart *part = NULL;
80  struct WriteThis pooh;
81  struct WriteThis pooh2;
82  curl_off_t datasize = -1;
83 
84  pooh.readptr = data;
85 #ifndef LIB645
86  datasize = (curl_off_t)strlen(data);
87 #endif
88  pooh.sizeleft = datasize;
89 
90  curl = curl_easy_init();
91  if(!curl) {
92  fprintf(stderr, "curl_easy_init() failed\n");
94  return TEST_ERR_MAJOR_BAD;
95  }
96 
97  mime = curl_mime_init(curl);
98  if(!mime) {
99  fprintf(stderr, "curl_mime_init() failed\n");
100  curl_easy_cleanup(curl);
102  return TEST_ERR_MAJOR_BAD;
103  }
104 
105  part = curl_mime_addpart(mime);
106  if(!part) {
107  fprintf(stderr, "curl_mime_addpart(1) failed\n");
108  curl_mime_free(mime);
109  curl_easy_cleanup(curl);
111  return TEST_ERR_MAJOR_BAD;
112  }
113 
114  /* Fill in the file upload part */
115  if(oldstyle) {
116  res = curl_mime_name(part, "sendfile");
117  if(!res)
118  res = curl_mime_data_cb(part, datasize, read_callback,
119  NULL, NULL, &pooh);
120  if(!res)
121  res = curl_mime_filename(part, "postit2.c");
122  }
123  else {
124  /* new style */
125  res = curl_mime_name(part, "sendfile alternative");
126  if(!res)
127  res = curl_mime_data_cb(part, datasize, read_callback,
128  NULL, NULL, &pooh);
129  if(!res)
130  res = curl_mime_filename(part, "file name 2");
131  }
132 
133  if(res)
134  printf("curl_mime_xxx(1) = %s\n", curl_easy_strerror(res));
135 
136  /* Now add the same data with another name and make it not look like
137  a file upload but still using the callback */
138 
139  pooh2.readptr = data;
140 #ifndef LIB645
141  datasize = (curl_off_t)strlen(data);
142 #endif
143  pooh2.sizeleft = datasize;
144 
145  part = curl_mime_addpart(mime);
146  if(!part) {
147  fprintf(stderr, "curl_mime_addpart(2) failed\n");
148  curl_mime_free(mime);
149  curl_easy_cleanup(curl);
151  return TEST_ERR_MAJOR_BAD;
152  }
153  /* Fill in the file upload part */
154  res = curl_mime_name(part, "callbackdata");
155  if(!res)
156  res = curl_mime_data_cb(part, datasize, read_callback,
157  NULL, NULL, &pooh2);
158 
159  if(res)
160  printf("curl_mime_xxx(2) = %s\n", curl_easy_strerror(res));
161 
162  part = curl_mime_addpart(mime);
163  if(!part) {
164  fprintf(stderr, "curl_mime_addpart(3) failed\n");
165  curl_mime_free(mime);
166  curl_easy_cleanup(curl);
168  return TEST_ERR_MAJOR_BAD;
169  }
170 
171  /* Fill in the filename field */
172  res = curl_mime_name(part, "filename");
173  if(!res)
174  res = curl_mime_data(part,
176  /* ASCII representation with escape
177  sequences for non-ASCII platforms */
178  "\x70\x6f\x73\x74\x69\x74\x32\x2e\x63",
179 #else
180  "postit2.c",
181 #endif
183 
184  if(res)
185  printf("curl_mime_xxx(3) = %s\n", curl_easy_strerror(res));
186 
187  /* Fill in a submit field too */
188  part = curl_mime_addpart(mime);
189  if(!part) {
190  fprintf(stderr, "curl_mime_addpart(4) failed\n");
191  curl_mime_free(mime);
192  curl_easy_cleanup(curl);
194  return TEST_ERR_MAJOR_BAD;
195  }
196  res = curl_mime_name(part, "submit");
197  if(!res)
198  res = curl_mime_data(part,
199 #ifdef CURL_DOES_CONVERSIONS
200  /* ASCII representation with escape
201  sequences for non-ASCII platforms */
202  "\x73\x65\x6e\x64",
203 #else
204  "send",
205 #endif
206  CURL_ZERO_TERMINATED);
207 
208  if(res)
209  printf("curl_mime_xxx(4) = %s\n", curl_easy_strerror(res));
210 
211  part = curl_mime_addpart(mime);
212  if(!part) {
213  fprintf(stderr, "curl_mime_addpart(5) failed\n");
214  curl_mime_free(mime);
215  curl_easy_cleanup(curl);
217  return TEST_ERR_MAJOR_BAD;
218  }
219  res = curl_mime_name(part, "somename");
220  if(!res)
221  res = curl_mime_filename(part, "somefile.txt");
222  if(!res)
223  res = curl_mime_data(part, "blah blah", 9);
224 
225  if(res)
226  printf("curl_mime_xxx(5) = %s\n", curl_easy_strerror(res));
227 
228  /* First set the URL that is about to receive our POST. */
229  test_setopt(curl, CURLOPT_URL, URL);
230 
231  /* send a multi-part mimepost */
232  test_setopt(curl, CURLOPT_MIMEPOST, mime);
233 
234  /* get verbose debug output please */
235  test_setopt(curl, CURLOPT_VERBOSE, 1L);
236 
237  /* include headers in the output */
238  test_setopt(curl, CURLOPT_HEADER, 1L);
239 
240  /* Perform the request, res will get the return code */
241  res = curl_easy_perform(curl);
242 
243 test_cleanup:
244 
245  /* always cleanup */
246  curl_easy_cleanup(curl);
247 
248  /* now cleanup the mimepost structure */
249  curl_mime_free(mime);
250 
251  return res;
252 }
253 
254 int test(char *URL)
255 {
256  int res;
257 
259  fprintf(stderr, "curl_global_init() failed\n");
260  return TEST_ERR_MAJOR_BAD;
261  }
262 
263  res = once(URL, TRUE); /* old */
264  if(!res)
265  res = once(URL, FALSE); /* new */
266 
268 
269  return res;
270 }
size_t sizeleft
#define test_setopt(A, B, C)
Definition: test.h:47
static int once(char *URL, bool oldstyle)
Definition: lib643.c:73
CURL_EXTERN void curl_mime_free(curl_mime *mime)
Definition: mime.c:1110
CURL_EXTERN CURLcode curl_mime_data(curl_mimepart *part, const char *data, size_t datasize)
Definition: mime.c:1230
UNITTEST_START char * ptr
Definition: unit1330.c:38
CURLcode
Definition: curl.h:454
CURL_EXTERN curl_mime * curl_mime_init(CURL *easy)
static int res
#define TEST_ERR_MAJOR_BAD
Definition: test.h:85
#define FALSE
CURL_EXTERN CURLcode curl_mime_name(curl_mimepart *part, const char *name)
Definition: mime.c:1194
#define printf
Definition: curl_printf.h:40
CURL_EXTERN CURL * curl_easy_init(void)
Definition: easy.c:343
#define CURL_DOES_CONVERSIONS
Definition: config-tpf.h:769
static char data[]
Definition: lib643.c:26
static size_t read_callback(char *ptr, size_t size, size_t nmemb, void *userp)
Definition: lib643.c:41
CURL_EXTERN void curl_easy_cleanup(CURL *curl)
CURL_TYPEOF_CURL_OFF_T curl_off_t
Definition: system.h:420
Definition: curl.h:455
const char * readptr
#define CURL_READFUNC_ABORT
Definition: curl.h:350
CURL_EXTERN CURLcode curl_global_init(long flags)
curl_global_init() globally initializes curl given a bitwise set of the different features of what to...
Definition: easy.c:271
CURL_EXTERN curl_mimepart * curl_mime_addpart(curl_mime *mime)
Definition: mime.c:1169
void CURL
Definition: curl.h:102
CURL_EXTERN CURLcode curl_mime_filename(curl_mimepart *part, const char *filename)
Definition: mime.c:1212
#define CURL_ZERO_TERMINATED
Definition: curl.h:1966
CURL_EXTERN CURLcode curl_mime_data_cb(curl_mimepart *part, curl_off_t datasize, curl_read_callback readfunc, curl_seek_callback seekfunc, curl_free_callback freefunc, void *arg)
Definition: mime.c:1369
size_t size
Definition: unit1302.c:52
#define fprintf
Definition: curl_printf.h:41
#define TRUE
CURL_EXTERN void curl_global_cleanup(void)
curl_global_cleanup() globally cleanups curl, uses the value of "init_flags" to determine what needs ...
Definition: easy.c:312
#define CURL_GLOBAL_ALL
Definition: curl.h:2519
curl_off_t sizeleft
Definition: lib643.c:38
static CURL * curl
Definition: sessioninfo.c:35
CURL_EXTERN const char * curl_easy_strerror(CURLcode)
Definition: strerror.c:57
Definition: debug.c:29
CURL_EXTERN CURLcode curl_easy_perform(CURL *curl)
int test(char *URL)
Definition: lib643.c:254


rc_tagdetect_client
Author(s): Monika Florek-Jasinska , Raphael Schaller
autogenerated on Sat Feb 13 2021 03:42:15