1/*************************************************************************** 2 * _ _ ____ _ 3 * Project ___| | | | _ \| | 4 * / __| | | | |_) | | 5 * | (__| |_| | _ <| |___ 6 * \___|\___/|_| \_\_____| 7 * 8 * Copyright (C) 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.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 * SPDX-License-Identifier: curl 22 * 23 ***************************************************************************/ 24 25/* Testing CURLOPT_PROTOCOLS_STR */ 26 27#include "test.h" 28 29#include "memdebug.h" 30 31struct pair { 32 const char *in; 33 CURLcode *exp; 34}; 35 36int test(char *URL) 37{ 38 CURL *curl = NULL; 39 int res = 0; 40 CURLcode result = CURLE_OK; 41 curl_version_info_data *curlinfo; 42 const char *const *proto; 43 int n; 44 int i; 45 static CURLcode ok = CURLE_OK; 46 static CURLcode bad = CURLE_BAD_FUNCTION_ARGUMENT; 47 static CURLcode unsup = CURLE_UNSUPPORTED_PROTOCOL; 48 static CURLcode httpcode = CURLE_UNSUPPORTED_PROTOCOL; 49 static CURLcode httpscode = CURLE_UNSUPPORTED_PROTOCOL; 50 static char protolist[1024]; 51 52 static const struct pair prots[] = { 53 {"goobar", &unsup}, 54 {"http ", &unsup}, 55 {" http", &unsup}, 56 {"http", &httpcode}, 57 {"http,", &httpcode}, 58 {"https,", &httpscode}, 59 {"https,http", &httpscode}, 60 {"http,http", &httpcode}, 61 {"HTTP,HTTP", &httpcode}, 62 {",HTTP,HTTP", &httpcode}, 63 {"http,http,ft", &unsup}, 64 {"", &bad}, 65 {",,", &bad}, 66 {protolist, &ok}, 67 {"all", &ok}, 68 {NULL, NULL}, 69 }; 70 (void)URL; 71 72 global_init(CURL_GLOBAL_ALL); 73 74 easy_init(curl); 75 76 /* Get enabled protocols.*/ 77 curlinfo = curl_version_info(CURLVERSION_NOW); 78 if(!curlinfo) { 79 fputs("curl_version_info failed\n", stderr); 80 res = (int) TEST_ERR_FAILURE; 81 goto test_cleanup; 82 } 83 84 n = 0; 85 for(proto = curlinfo->protocols; *proto; proto++) { 86 if((size_t) n >= sizeof(protolist)) { 87 puts("protolist buffer too small\n"); 88 res = (int) TEST_ERR_FAILURE; 89 goto test_cleanup; 90 } 91 n += msnprintf(protolist + n, sizeof(protolist) - n, ",%s", *proto); 92 if(curl_strequal(*proto, "http")) 93 httpcode = CURLE_OK; 94 if(curl_strequal(*proto, "https")) 95 httpscode = CURLE_OK; 96 } 97 98 /* Run the tests. */ 99 for(i = 0; prots[i].in; i++) { 100 result = curl_easy_setopt(curl, CURLOPT_PROTOCOLS_STR, prots[i].in); 101 if(result != *prots[i].exp) { 102 printf("unexpectedly '%s' returned %u\n", 103 prots[i].in, result); 104 break; 105 } 106 } 107 printf("Tested %u strings\n", i); 108 res = (int)result; 109 110test_cleanup: 111 curl_easy_cleanup(curl); 112 curl_global_cleanup(); 113 114 return (int)result; 115} 116