xref: /aosp_15_r20/external/curl/tests/libtest/lib1522.c (revision 6236dae45794135f37c4eb022389c904c8b0090d)
1*6236dae4SAndroid Build Coastguard Worker /***************************************************************************
2*6236dae4SAndroid Build Coastguard Worker  *                                  _   _ ____  _
3*6236dae4SAndroid Build Coastguard Worker  *  Project                     ___| | | |  _ \| |
4*6236dae4SAndroid Build Coastguard Worker  *                             / __| | | | |_) | |
5*6236dae4SAndroid Build Coastguard Worker  *                            | (__| |_| |  _ <| |___
6*6236dae4SAndroid Build Coastguard Worker  *                             \___|\___/|_| \_\_____|
7*6236dae4SAndroid Build Coastguard Worker  *
8*6236dae4SAndroid Build Coastguard Worker  * Copyright (C) Daniel Stenberg, <[email protected]>, et al.
9*6236dae4SAndroid Build Coastguard Worker  *
10*6236dae4SAndroid Build Coastguard Worker  * This software is licensed as described in the file COPYING, which
11*6236dae4SAndroid Build Coastguard Worker  * you should have received as part of this distribution. The terms
12*6236dae4SAndroid Build Coastguard Worker  * are also available at https://curl.se/docs/copyright.html.
13*6236dae4SAndroid Build Coastguard Worker  *
14*6236dae4SAndroid Build Coastguard Worker  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15*6236dae4SAndroid Build Coastguard Worker  * copies of the Software, and permit persons to whom the Software is
16*6236dae4SAndroid Build Coastguard Worker  * furnished to do so, under the terms of the COPYING file.
17*6236dae4SAndroid Build Coastguard Worker  *
18*6236dae4SAndroid Build Coastguard Worker  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19*6236dae4SAndroid Build Coastguard Worker  * KIND, either express or implied.
20*6236dae4SAndroid Build Coastguard Worker  *
21*6236dae4SAndroid Build Coastguard Worker  * SPDX-License-Identifier: curl
22*6236dae4SAndroid Build Coastguard Worker  *
23*6236dae4SAndroid Build Coastguard Worker  ***************************************************************************/
24*6236dae4SAndroid Build Coastguard Worker #include "test.h"
25*6236dae4SAndroid Build Coastguard Worker 
26*6236dae4SAndroid Build Coastguard Worker /* test case and code based on https://github.com/curl/curl/issues/2847 */
27*6236dae4SAndroid Build Coastguard Worker 
28*6236dae4SAndroid Build Coastguard Worker #include "testtrace.h"
29*6236dae4SAndroid Build Coastguard Worker #include "testutil.h"
30*6236dae4SAndroid Build Coastguard Worker #include "warnless.h"
31*6236dae4SAndroid Build Coastguard Worker #include "memdebug.h"
32*6236dae4SAndroid Build Coastguard Worker 
33*6236dae4SAndroid Build Coastguard Worker static char g_Data[40 * 1024]; /* POST 40KB */
34*6236dae4SAndroid Build Coastguard Worker 
sockopt_callback(void * clientp,curl_socket_t curlfd,curlsocktype purpose)35*6236dae4SAndroid Build Coastguard Worker static int sockopt_callback(void *clientp, curl_socket_t curlfd,
36*6236dae4SAndroid Build Coastguard Worker                             curlsocktype purpose)
37*6236dae4SAndroid Build Coastguard Worker {
38*6236dae4SAndroid Build Coastguard Worker #if defined(SOL_SOCKET) && defined(SO_SNDBUF)
39*6236dae4SAndroid Build Coastguard Worker   int sndbufsize = 4 * 1024; /* 4KB send buffer */
40*6236dae4SAndroid Build Coastguard Worker   (void) clientp;
41*6236dae4SAndroid Build Coastguard Worker   (void) purpose;
42*6236dae4SAndroid Build Coastguard Worker   setsockopt(curlfd, SOL_SOCKET, SO_SNDBUF,
43*6236dae4SAndroid Build Coastguard Worker              (char *)&sndbufsize, sizeof(sndbufsize));
44*6236dae4SAndroid Build Coastguard Worker #else
45*6236dae4SAndroid Build Coastguard Worker   (void)clientp;
46*6236dae4SAndroid Build Coastguard Worker   (void)curlfd;
47*6236dae4SAndroid Build Coastguard Worker   (void)purpose;
48*6236dae4SAndroid Build Coastguard Worker #endif
49*6236dae4SAndroid Build Coastguard Worker   return CURL_SOCKOPT_OK;
50*6236dae4SAndroid Build Coastguard Worker }
51*6236dae4SAndroid Build Coastguard Worker 
test(char * URL)52*6236dae4SAndroid Build Coastguard Worker CURLcode test(char *URL)
53*6236dae4SAndroid Build Coastguard Worker {
54*6236dae4SAndroid Build Coastguard Worker   CURLcode code = TEST_ERR_MAJOR_BAD;
55*6236dae4SAndroid Build Coastguard Worker   CURLcode res;
56*6236dae4SAndroid Build Coastguard Worker   struct curl_slist *pHeaderList = NULL;
57*6236dae4SAndroid Build Coastguard Worker   CURL *curl = curl_easy_init();
58*6236dae4SAndroid Build Coastguard Worker   memset(g_Data, 'A', sizeof(g_Data)); /* send As! */
59*6236dae4SAndroid Build Coastguard Worker 
60*6236dae4SAndroid Build Coastguard Worker   curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, sockopt_callback);
61*6236dae4SAndroid Build Coastguard Worker   curl_easy_setopt(curl, CURLOPT_URL, URL);
62*6236dae4SAndroid Build Coastguard Worker   curl_easy_setopt(curl, CURLOPT_POSTFIELDS, g_Data);
63*6236dae4SAndroid Build Coastguard Worker   curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)sizeof(g_Data));
64*6236dae4SAndroid Build Coastguard Worker 
65*6236dae4SAndroid Build Coastguard Worker   libtest_debug_config.nohex = 1;
66*6236dae4SAndroid Build Coastguard Worker   libtest_debug_config.tracetime = 1;
67*6236dae4SAndroid Build Coastguard Worker   test_setopt(curl, CURLOPT_DEBUGDATA, &libtest_debug_config);
68*6236dae4SAndroid Build Coastguard Worker   test_setopt(curl, CURLOPT_DEBUGFUNCTION, libtest_debug_cb);
69*6236dae4SAndroid Build Coastguard Worker   test_setopt(curl, CURLOPT_VERBOSE, 1L);
70*6236dae4SAndroid Build Coastguard Worker 
71*6236dae4SAndroid Build Coastguard Worker   /* Remove "Expect: 100-continue" */
72*6236dae4SAndroid Build Coastguard Worker   pHeaderList = curl_slist_append(pHeaderList, "Expect:");
73*6236dae4SAndroid Build Coastguard Worker 
74*6236dae4SAndroid Build Coastguard Worker   curl_easy_setopt(curl, CURLOPT_HTTPHEADER, pHeaderList);
75*6236dae4SAndroid Build Coastguard Worker 
76*6236dae4SAndroid Build Coastguard Worker   code = curl_easy_perform(curl);
77*6236dae4SAndroid Build Coastguard Worker 
78*6236dae4SAndroid Build Coastguard Worker   if(code == CURLE_OK) {
79*6236dae4SAndroid Build Coastguard Worker     curl_off_t uploadSize;
80*6236dae4SAndroid Build Coastguard Worker     curl_easy_getinfo(curl, CURLINFO_SIZE_UPLOAD_T, &uploadSize);
81*6236dae4SAndroid Build Coastguard Worker 
82*6236dae4SAndroid Build Coastguard Worker     printf("uploadSize = %ld\n", (long)uploadSize);
83*6236dae4SAndroid Build Coastguard Worker 
84*6236dae4SAndroid Build Coastguard Worker     if((size_t) uploadSize == sizeof(g_Data)) {
85*6236dae4SAndroid Build Coastguard Worker       printf("!!!!!!!!!! PASS\n");
86*6236dae4SAndroid Build Coastguard Worker     }
87*6236dae4SAndroid Build Coastguard Worker     else {
88*6236dae4SAndroid Build Coastguard Worker       printf("sent %d, libcurl says %d\n",
89*6236dae4SAndroid Build Coastguard Worker              (int)sizeof(g_Data), (int)uploadSize);
90*6236dae4SAndroid Build Coastguard Worker     }
91*6236dae4SAndroid Build Coastguard Worker   }
92*6236dae4SAndroid Build Coastguard Worker   else {
93*6236dae4SAndroid Build Coastguard Worker     printf("curl_easy_perform() failed. e = %d\n", code);
94*6236dae4SAndroid Build Coastguard Worker   }
95*6236dae4SAndroid Build Coastguard Worker test_cleanup:
96*6236dae4SAndroid Build Coastguard Worker   curl_slist_free_all(pHeaderList);
97*6236dae4SAndroid Build Coastguard Worker   curl_easy_cleanup(curl);
98*6236dae4SAndroid Build Coastguard Worker   curl_global_cleanup();
99*6236dae4SAndroid Build Coastguard Worker 
100*6236dae4SAndroid Build Coastguard Worker   return code;
101*6236dae4SAndroid Build Coastguard Worker }
102