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