xref: /aosp_15_r20/external/curl/tests/libtest/lib1156.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 /*
27*6236dae4SAndroid Build Coastguard Worker   Check range/resume returned error codes and data presence.
28*6236dae4SAndroid Build Coastguard Worker 
29*6236dae4SAndroid Build Coastguard Worker   The input parameters are:
30*6236dae4SAndroid Build Coastguard Worker   - CURLOPT_RANGE/CURLOPT_RESUME_FROM
31*6236dae4SAndroid Build Coastguard Worker   - CURLOPT_FAILONERROR
32*6236dae4SAndroid Build Coastguard Worker   - Returned http code (2xx/416)
33*6236dae4SAndroid Build Coastguard Worker   - Content-Range header present in reply.
34*6236dae4SAndroid Build Coastguard Worker 
35*6236dae4SAndroid Build Coastguard Worker */
36*6236dae4SAndroid Build Coastguard Worker 
37*6236dae4SAndroid Build Coastguard Worker #include "memdebug.h"
38*6236dae4SAndroid Build Coastguard Worker 
39*6236dae4SAndroid Build Coastguard Worker #define F_RESUME        (1 << 0)        /* resume/range. */
40*6236dae4SAndroid Build Coastguard Worker #define F_HTTP416       (1 << 1)        /* Server returns http code 416. */
41*6236dae4SAndroid Build Coastguard Worker #define F_FAIL          (1 << 2)        /* Fail on error. */
42*6236dae4SAndroid Build Coastguard Worker #define F_CONTENTRANGE  (1 << 3)        /* Server sends content-range hdr. */
43*6236dae4SAndroid Build Coastguard Worker #define F_IGNOREBODY    (1 << 4)        /* Body should be ignored. */
44*6236dae4SAndroid Build Coastguard Worker 
45*6236dae4SAndroid Build Coastguard Worker struct testparams {
46*6236dae4SAndroid Build Coastguard Worker   unsigned int flags; /* ORed flags as above. */
47*6236dae4SAndroid Build Coastguard Worker   CURLcode result; /* Code that should be returned by curl_easy_perform(). */
48*6236dae4SAndroid Build Coastguard Worker };
49*6236dae4SAndroid Build Coastguard Worker 
50*6236dae4SAndroid Build Coastguard Worker static const struct testparams testparams[] = {
51*6236dae4SAndroid Build Coastguard Worker   { 0,                                                             CURLE_OK },
52*6236dae4SAndroid Build Coastguard Worker   {                                 F_CONTENTRANGE,                CURLE_OK },
53*6236dae4SAndroid Build Coastguard Worker   {                        F_FAIL,                                 CURLE_OK },
54*6236dae4SAndroid Build Coastguard Worker   {                        F_FAIL | F_CONTENTRANGE,                CURLE_OK },
55*6236dae4SAndroid Build Coastguard Worker   {            F_HTTP416,                                          CURLE_OK },
56*6236dae4SAndroid Build Coastguard Worker   {            F_HTTP416 |          F_CONTENTRANGE,                CURLE_OK },
57*6236dae4SAndroid Build Coastguard Worker   {            F_HTTP416 | F_FAIL |                  F_IGNOREBODY,
58*6236dae4SAndroid Build Coastguard Worker                                                   CURLE_HTTP_RETURNED_ERROR },
59*6236dae4SAndroid Build Coastguard Worker   {            F_HTTP416 | F_FAIL | F_CONTENTRANGE | F_IGNOREBODY,
60*6236dae4SAndroid Build Coastguard Worker                                                   CURLE_HTTP_RETURNED_ERROR },
61*6236dae4SAndroid Build Coastguard Worker   { F_RESUME |                                       F_IGNOREBODY,
62*6236dae4SAndroid Build Coastguard Worker                                                           CURLE_RANGE_ERROR },
63*6236dae4SAndroid Build Coastguard Worker   { F_RESUME |                      F_CONTENTRANGE,                CURLE_OK },
64*6236dae4SAndroid Build Coastguard Worker   { F_RESUME |             F_FAIL |                  F_IGNOREBODY,
65*6236dae4SAndroid Build Coastguard Worker                                                           CURLE_RANGE_ERROR },
66*6236dae4SAndroid Build Coastguard Worker   { F_RESUME |             F_FAIL | F_CONTENTRANGE,                CURLE_OK },
67*6236dae4SAndroid Build Coastguard Worker   { F_RESUME | F_HTTP416 |                           F_IGNOREBODY, CURLE_OK },
68*6236dae4SAndroid Build Coastguard Worker   { F_RESUME | F_HTTP416 |          F_CONTENTRANGE | F_IGNOREBODY, CURLE_OK },
69*6236dae4SAndroid Build Coastguard Worker   { F_RESUME | F_HTTP416 | F_FAIL |                  F_IGNOREBODY, CURLE_OK },
70*6236dae4SAndroid Build Coastguard Worker   { F_RESUME | F_HTTP416 | F_FAIL | F_CONTENTRANGE | F_IGNOREBODY,
71*6236dae4SAndroid Build Coastguard Worker                                                                    CURLE_OK }
72*6236dae4SAndroid Build Coastguard Worker };
73*6236dae4SAndroid Build Coastguard Worker 
74*6236dae4SAndroid Build Coastguard Worker static int      hasbody;
75*6236dae4SAndroid Build Coastguard Worker 
writedata(char * data,size_t size,size_t nmemb,void * userdata)76*6236dae4SAndroid Build Coastguard Worker static size_t writedata(char *data, size_t size, size_t nmemb, void *userdata)
77*6236dae4SAndroid Build Coastguard Worker {
78*6236dae4SAndroid Build Coastguard Worker   (void) data;
79*6236dae4SAndroid Build Coastguard Worker   (void) userdata;
80*6236dae4SAndroid Build Coastguard Worker 
81*6236dae4SAndroid Build Coastguard Worker   if(size && nmemb)
82*6236dae4SAndroid Build Coastguard Worker     hasbody = 1;
83*6236dae4SAndroid Build Coastguard Worker   return size * nmemb;
84*6236dae4SAndroid Build Coastguard Worker }
85*6236dae4SAndroid Build Coastguard Worker 
onetest(CURL * curl,const char * url,const struct testparams * p,size_t num)86*6236dae4SAndroid Build Coastguard Worker static int onetest(CURL *curl, const char *url, const struct testparams *p,
87*6236dae4SAndroid Build Coastguard Worker                    size_t num)
88*6236dae4SAndroid Build Coastguard Worker {
89*6236dae4SAndroid Build Coastguard Worker   CURLcode res;
90*6236dae4SAndroid Build Coastguard Worker   unsigned int replyselector;
91*6236dae4SAndroid Build Coastguard Worker   char urlbuf[256];
92*6236dae4SAndroid Build Coastguard Worker 
93*6236dae4SAndroid Build Coastguard Worker   replyselector = (p->flags & F_CONTENTRANGE) ? 1 : 0;
94*6236dae4SAndroid Build Coastguard Worker   if(p->flags & F_HTTP416)
95*6236dae4SAndroid Build Coastguard Worker     replyselector += 2;
96*6236dae4SAndroid Build Coastguard Worker   msnprintf(urlbuf, sizeof(urlbuf), "%s%04u", url, replyselector);
97*6236dae4SAndroid Build Coastguard Worker   test_setopt(curl, CURLOPT_URL, urlbuf);
98*6236dae4SAndroid Build Coastguard Worker   test_setopt(curl, CURLOPT_VERBOSE, 1L);
99*6236dae4SAndroid Build Coastguard Worker   test_setopt(curl, CURLOPT_RESUME_FROM, (p->flags & F_RESUME) ? 3 : 0);
100*6236dae4SAndroid Build Coastguard Worker   test_setopt(curl, CURLOPT_RANGE, !(p->flags & F_RESUME) ?
101*6236dae4SAndroid Build Coastguard Worker                                    "3-1000000": (char *) NULL);
102*6236dae4SAndroid Build Coastguard Worker   test_setopt(curl, CURLOPT_FAILONERROR, (p->flags & F_FAIL) ? 1 : 0);
103*6236dae4SAndroid Build Coastguard Worker   hasbody = 0;
104*6236dae4SAndroid Build Coastguard Worker   res = curl_easy_perform(curl);
105*6236dae4SAndroid Build Coastguard Worker   if(res != p->result) {
106*6236dae4SAndroid Build Coastguard Worker     printf("%zd: bad error code (%d): resume=%s, fail=%s, http416=%s, "
107*6236dae4SAndroid Build Coastguard Worker            "content-range=%s, expected=%d\n", num, res,
108*6236dae4SAndroid Build Coastguard Worker            (p->flags & F_RESUME) ? "yes": "no",
109*6236dae4SAndroid Build Coastguard Worker            (p->flags & F_FAIL) ? "yes": "no",
110*6236dae4SAndroid Build Coastguard Worker            (p->flags & F_HTTP416) ? "yes": "no",
111*6236dae4SAndroid Build Coastguard Worker            (p->flags & F_CONTENTRANGE) ? "yes": "no",
112*6236dae4SAndroid Build Coastguard Worker            p->result);
113*6236dae4SAndroid Build Coastguard Worker     return 1;
114*6236dae4SAndroid Build Coastguard Worker   }
115*6236dae4SAndroid Build Coastguard Worker   if(hasbody && (p->flags & F_IGNOREBODY)) {
116*6236dae4SAndroid Build Coastguard Worker     printf("body should be ignored and is not: resume=%s, fail=%s, "
117*6236dae4SAndroid Build Coastguard Worker            "http416=%s, content-range=%s\n",
118*6236dae4SAndroid Build Coastguard Worker            (p->flags & F_RESUME) ? "yes": "no",
119*6236dae4SAndroid Build Coastguard Worker            (p->flags & F_FAIL) ? "yes": "no",
120*6236dae4SAndroid Build Coastguard Worker            (p->flags & F_HTTP416) ? "yes": "no",
121*6236dae4SAndroid Build Coastguard Worker            (p->flags & F_CONTENTRANGE) ? "yes": "no");
122*6236dae4SAndroid Build Coastguard Worker     return 1;
123*6236dae4SAndroid Build Coastguard Worker   }
124*6236dae4SAndroid Build Coastguard Worker   return 0;
125*6236dae4SAndroid Build Coastguard Worker 
126*6236dae4SAndroid Build Coastguard Worker test_cleanup:
127*6236dae4SAndroid Build Coastguard Worker 
128*6236dae4SAndroid Build Coastguard Worker   return 1;
129*6236dae4SAndroid Build Coastguard Worker }
130*6236dae4SAndroid Build Coastguard Worker 
131*6236dae4SAndroid Build Coastguard Worker /* for debugging: */
132*6236dae4SAndroid Build Coastguard Worker /* #define SINGLETEST 9 */
133*6236dae4SAndroid Build Coastguard Worker 
test(char * URL)134*6236dae4SAndroid Build Coastguard Worker CURLcode test(char *URL)
135*6236dae4SAndroid Build Coastguard Worker {
136*6236dae4SAndroid Build Coastguard Worker   CURLcode res;
137*6236dae4SAndroid Build Coastguard Worker   CURL *curl;
138*6236dae4SAndroid Build Coastguard Worker   size_t i;
139*6236dae4SAndroid Build Coastguard Worker   int status = 0;
140*6236dae4SAndroid Build Coastguard Worker 
141*6236dae4SAndroid Build Coastguard Worker   if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
142*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr, "curl_global_init() failed\n");
143*6236dae4SAndroid Build Coastguard Worker     return TEST_ERR_MAJOR_BAD;
144*6236dae4SAndroid Build Coastguard Worker   }
145*6236dae4SAndroid Build Coastguard Worker 
146*6236dae4SAndroid Build Coastguard Worker   for(i = 0; i < sizeof(testparams) / sizeof(testparams[0]); i++) {
147*6236dae4SAndroid Build Coastguard Worker     curl = curl_easy_init();
148*6236dae4SAndroid Build Coastguard Worker     if(!curl) {
149*6236dae4SAndroid Build Coastguard Worker       fprintf(stderr, "curl_easy_init() failed\n");
150*6236dae4SAndroid Build Coastguard Worker       curl_global_cleanup();
151*6236dae4SAndroid Build Coastguard Worker       return TEST_ERR_MAJOR_BAD;
152*6236dae4SAndroid Build Coastguard Worker     }
153*6236dae4SAndroid Build Coastguard Worker 
154*6236dae4SAndroid Build Coastguard Worker     test_setopt(curl, CURLOPT_WRITEFUNCTION, writedata);
155*6236dae4SAndroid Build Coastguard Worker 
156*6236dae4SAndroid Build Coastguard Worker #ifdef SINGLETEST
157*6236dae4SAndroid Build Coastguard Worker     if(SINGLETEST == i)
158*6236dae4SAndroid Build Coastguard Worker #endif
159*6236dae4SAndroid Build Coastguard Worker       status |= onetest(curl, URL, testparams + i, i);
160*6236dae4SAndroid Build Coastguard Worker     curl_easy_cleanup(curl);
161*6236dae4SAndroid Build Coastguard Worker   }
162*6236dae4SAndroid Build Coastguard Worker 
163*6236dae4SAndroid Build Coastguard Worker   curl_global_cleanup();
164*6236dae4SAndroid Build Coastguard Worker   printf("%d\n", status);
165*6236dae4SAndroid Build Coastguard Worker   return (CURLcode)status;
166*6236dae4SAndroid Build Coastguard Worker 
167*6236dae4SAndroid Build Coastguard Worker test_cleanup:
168*6236dae4SAndroid Build Coastguard Worker 
169*6236dae4SAndroid Build Coastguard Worker   curl_easy_cleanup(curl);
170*6236dae4SAndroid Build Coastguard Worker   curl_global_cleanup();
171*6236dae4SAndroid Build Coastguard Worker 
172*6236dae4SAndroid Build Coastguard Worker   return res;
173*6236dae4SAndroid Build Coastguard Worker }
174