113498266Sopenharmony_ci/*************************************************************************** 213498266Sopenharmony_ci * _ _ ____ _ 313498266Sopenharmony_ci * Project ___| | | | _ \| | 413498266Sopenharmony_ci * / __| | | | |_) | | 513498266Sopenharmony_ci * | (__| |_| | _ <| |___ 613498266Sopenharmony_ci * \___|\___/|_| \_\_____| 713498266Sopenharmony_ci * 813498266Sopenharmony_ci * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al. 913498266Sopenharmony_ci * 1013498266Sopenharmony_ci * This software is licensed as described in the file COPYING, which 1113498266Sopenharmony_ci * you should have received as part of this distribution. The terms 1213498266Sopenharmony_ci * are also available at https://curl.se/docs/copyright.html. 1313498266Sopenharmony_ci * 1413498266Sopenharmony_ci * You may opt to use, copy, modify, merge, publish, distribute and/or sell 1513498266Sopenharmony_ci * copies of the Software, and permit persons to whom the Software is 1613498266Sopenharmony_ci * furnished to do so, under the terms of the COPYING file. 1713498266Sopenharmony_ci * 1813498266Sopenharmony_ci * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 1913498266Sopenharmony_ci * KIND, either express or implied. 2013498266Sopenharmony_ci * 2113498266Sopenharmony_ci * SPDX-License-Identifier: curl 2213498266Sopenharmony_ci * 2313498266Sopenharmony_ci ***************************************************************************/ 2413498266Sopenharmony_ci#include "curlcheck.h" 2513498266Sopenharmony_ci 2613498266Sopenharmony_ci#include "noproxy.h" 2713498266Sopenharmony_ci 2813498266Sopenharmony_cistatic CURLcode unit_setup(void) 2913498266Sopenharmony_ci{ 3013498266Sopenharmony_ci return CURLE_OK; 3113498266Sopenharmony_ci} 3213498266Sopenharmony_ci 3313498266Sopenharmony_cistatic void unit_stop(void) 3413498266Sopenharmony_ci{ 3513498266Sopenharmony_ci 3613498266Sopenharmony_ci} 3713498266Sopenharmony_ci 3813498266Sopenharmony_cistruct check { 3913498266Sopenharmony_ci const char *a; 4013498266Sopenharmony_ci const char *n; 4113498266Sopenharmony_ci unsigned int bits; 4213498266Sopenharmony_ci bool match; 4313498266Sopenharmony_ci}; 4413498266Sopenharmony_ci 4513498266Sopenharmony_cistruct noproxy { 4613498266Sopenharmony_ci const char *a; 4713498266Sopenharmony_ci const char *n; 4813498266Sopenharmony_ci bool match; 4913498266Sopenharmony_ci bool space; /* space separated */ 5013498266Sopenharmony_ci}; 5113498266Sopenharmony_ci 5213498266Sopenharmony_ciUNITTEST_START 5313498266Sopenharmony_ci#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_PROXY) 5413498266Sopenharmony_ci{ 5513498266Sopenharmony_ci int i; 5613498266Sopenharmony_ci int err = 0; 5713498266Sopenharmony_ci struct check list4[]= { 5813498266Sopenharmony_ci { "192.160.0.1", "192.160.0.1", 33, FALSE}, 5913498266Sopenharmony_ci { "192.160.0.1", "192.160.0.1", 32, TRUE}, 6013498266Sopenharmony_ci { "192.160.0.1", "192.160.0.1", 0, TRUE}, 6113498266Sopenharmony_ci { "192.160.0.1", "192.160.0.1", 24, TRUE}, 6213498266Sopenharmony_ci { "192.160.0.1", "192.160.0.1", 26, TRUE}, 6313498266Sopenharmony_ci { "192.160.0.1", "192.160.0.1", 20, TRUE}, 6413498266Sopenharmony_ci { "192.160.0.1", "192.160.0.1", 18, TRUE}, 6513498266Sopenharmony_ci { "192.160.0.1", "192.160.0.1", 12, TRUE}, 6613498266Sopenharmony_ci { "192.160.0.1", "192.160.0.1", 8, TRUE}, 6713498266Sopenharmony_ci { "192.160.0.1", "10.0.0.1", 8, FALSE}, 6813498266Sopenharmony_ci { "192.160.0.1", "10.0.0.1", 32, FALSE}, 6913498266Sopenharmony_ci { "192.160.0.1", "10.0.0.1", 0, FALSE}, 7013498266Sopenharmony_ci { NULL, NULL, 0, FALSE} /* end marker */ 7113498266Sopenharmony_ci }; 7213498266Sopenharmony_ci struct check list6[]= { 7313498266Sopenharmony_ci { "::1", "::1", 0, TRUE}, 7413498266Sopenharmony_ci { "::1", "::1", 128, TRUE}, 7513498266Sopenharmony_ci { "::1", "0:0::1", 128, TRUE}, 7613498266Sopenharmony_ci { "::1", "0:0::1", 129, FALSE}, 7713498266Sopenharmony_ci { "fe80::ab47:4396:55c9:8474", "fe80::ab47:4396:55c9:8474", 64, TRUE}, 7813498266Sopenharmony_ci { NULL, NULL, 0, FALSE} /* end marker */ 7913498266Sopenharmony_ci }; 8013498266Sopenharmony_ci struct noproxy list[]= { 8113498266Sopenharmony_ci { "www.example.com", "localhost .example.com .example.de", TRUE, TRUE}, 8213498266Sopenharmony_ci { "www.example.com", "localhost,.example.com,.example.de", TRUE, FALSE}, 8313498266Sopenharmony_ci { "www.example.com.", "localhost,.example.com,.example.de", TRUE, FALSE}, 8413498266Sopenharmony_ci { "example.com", "localhost,.example.com,.example.de", TRUE, FALSE}, 8513498266Sopenharmony_ci { "example.com.", "localhost,.example.com,.example.de", TRUE, FALSE}, 8613498266Sopenharmony_ci { "www.example.com", "localhost,.example.com.,.example.de", TRUE, FALSE}, 8713498266Sopenharmony_ci { "www.example.com", "localhost,www.example.com.,.example.de", 8813498266Sopenharmony_ci TRUE, FALSE}, 8913498266Sopenharmony_ci { "example.com", "localhost,example.com,.example.de", TRUE, FALSE}, 9013498266Sopenharmony_ci { "example.com.", "localhost,example.com,.example.de", TRUE, FALSE}, 9113498266Sopenharmony_ci { "nexample.com", "localhost,example.com,.example.de", FALSE, FALSE}, 9213498266Sopenharmony_ci { "www.example.com", "localhost,example.com,.example.de", TRUE, FALSE}, 9313498266Sopenharmony_ci { "127.0.0.1", "127.0.0.1,localhost", TRUE, FALSE}, 9413498266Sopenharmony_ci { "127.0.0.1", "127.0.0.1,localhost,", TRUE, FALSE}, 9513498266Sopenharmony_ci { "127.0.0.1", "127.0.0.1/8,localhost,", TRUE, FALSE}, 9613498266Sopenharmony_ci { "127.0.0.1", "127.0.0.1/28,localhost,", TRUE, FALSE}, 9713498266Sopenharmony_ci { "127.0.0.1", "127.0.0.1/31,localhost,", TRUE, FALSE}, 9813498266Sopenharmony_ci { "127.0.0.1", "localhost,127.0.0.1", TRUE, FALSE}, 9913498266Sopenharmony_ci { "127.0.0.1", "localhost,127.0.0.1.127.0.0.1.127.0.0.1.127.0.0.1." 10013498266Sopenharmony_ci "127.0.0.1.127.0.0.1.127.0.0.1.127.0.0.1.127.0.0.1.127.0.0.1.127." 10113498266Sopenharmony_ci "0.0.1.127.0.0.1.127.0.0." /* 128 bytes "address" */, FALSE, FALSE}, 10213498266Sopenharmony_ci { "127.0.0.1", "localhost,127.0.0.1.127.0.0.1.127.0.0.1.127.0.0.1." 10313498266Sopenharmony_ci "127.0.0.1.127.0.0.1.127.0.0.1.127.0.0.1.127.0.0.1.127.0.0.1.127." 10413498266Sopenharmony_ci "0.0.1.127.0.0.1.127.0.0" /* 127 bytes "address" */, FALSE, FALSE}, 10513498266Sopenharmony_ci { "localhost", "localhost,127.0.0.1", TRUE, FALSE}, 10613498266Sopenharmony_ci { "localhost", "127.0.0.1,localhost", TRUE, FALSE}, 10713498266Sopenharmony_ci { "foobar", "barfoo", FALSE, FALSE}, 10813498266Sopenharmony_ci { "foobar", "foobar", TRUE, FALSE}, 10913498266Sopenharmony_ci { "192.168.0.1", "foobar", FALSE, FALSE}, 11013498266Sopenharmony_ci { "192.168.0.1", "192.168.0.0/16", TRUE, FALSE}, 11113498266Sopenharmony_ci { "192.168.0.1", "192.168.0.0/24", TRUE, FALSE}, 11213498266Sopenharmony_ci { "192.168.0.1", "192.168.0.0/32", FALSE, FALSE}, 11313498266Sopenharmony_ci { "192.168.0.1", "192.168.0.0", FALSE, FALSE}, 11413498266Sopenharmony_ci { "192.168.1.1", "192.168.0.0/24", FALSE, FALSE}, 11513498266Sopenharmony_ci { "192.168.1.1", "foo, bar, 192.168.0.0/24", FALSE, FALSE}, 11613498266Sopenharmony_ci { "192.168.1.1", "foo, bar, 192.168.0.0/16", TRUE, FALSE}, 11713498266Sopenharmony_ci { "[::1]", "foo, bar, 192.168.0.0/16", FALSE, FALSE}, 11813498266Sopenharmony_ci { "[::1]", "foo, bar, ::1/64", TRUE, FALSE}, 11913498266Sopenharmony_ci { "bar", "foo, bar, ::1/64", TRUE, FALSE}, 12013498266Sopenharmony_ci { "BAr", "foo, bar, ::1/64", TRUE, FALSE}, 12113498266Sopenharmony_ci { "BAr", "foo,,,,, bar, ::1/64", TRUE, FALSE}, 12213498266Sopenharmony_ci { "www.example.com", "foo, .example.com", TRUE, FALSE}, 12313498266Sopenharmony_ci { "www.example.com", "www2.example.com, .example.net", FALSE, FALSE}, 12413498266Sopenharmony_ci { "example.com", ".example.com, .example.net", TRUE, FALSE}, 12513498266Sopenharmony_ci { "nonexample.com", ".example.com, .example.net", FALSE, FALSE}, 12613498266Sopenharmony_ci { NULL, NULL, FALSE, FALSE} 12713498266Sopenharmony_ci }; 12813498266Sopenharmony_ci for(i = 0; list4[i].a; i++) { 12913498266Sopenharmony_ci bool match = Curl_cidr4_match(list4[i].a, list4[i].n, list4[i].bits); 13013498266Sopenharmony_ci if(match != list4[i].match) { 13113498266Sopenharmony_ci fprintf(stderr, "%s in %s/%u should %smatch\n", 13213498266Sopenharmony_ci list4[i].a, list4[i].n, list4[i].bits, 13313498266Sopenharmony_ci list4[i].match ? "": "not "); 13413498266Sopenharmony_ci err++; 13513498266Sopenharmony_ci } 13613498266Sopenharmony_ci } 13713498266Sopenharmony_ci for(i = 0; list6[i].a; i++) { 13813498266Sopenharmony_ci bool match = Curl_cidr6_match(list6[i].a, list6[i].n, list6[i].bits); 13913498266Sopenharmony_ci if(match != list6[i].match) { 14013498266Sopenharmony_ci fprintf(stderr, "%s in %s/%u should %smatch\n", 14113498266Sopenharmony_ci list6[i].a, list6[i].n, list6[i].bits, 14213498266Sopenharmony_ci list6[i].match ? "": "not "); 14313498266Sopenharmony_ci err++; 14413498266Sopenharmony_ci } 14513498266Sopenharmony_ci } 14613498266Sopenharmony_ci for(i = 0; list[i].a; i++) { 14713498266Sopenharmony_ci bool spacesep = FALSE; 14813498266Sopenharmony_ci bool match = Curl_check_noproxy(list[i].a, list[i].n, &spacesep); 14913498266Sopenharmony_ci if(match != list[i].match) { 15013498266Sopenharmony_ci fprintf(stderr, "%s in %s should %smatch\n", 15113498266Sopenharmony_ci list[i].a, list[i].n, 15213498266Sopenharmony_ci list[i].match ? "": "not "); 15313498266Sopenharmony_ci err++; 15413498266Sopenharmony_ci } 15513498266Sopenharmony_ci if(spacesep != list[i].space) { 15613498266Sopenharmony_ci fprintf(stderr, "%s is claimed to be %sspace separated\n", 15713498266Sopenharmony_ci list[i].n, list[i].space?"":"NOT "); 15813498266Sopenharmony_ci err++; 15913498266Sopenharmony_ci } 16013498266Sopenharmony_ci } 16113498266Sopenharmony_ci fail_if(err, "errors"); 16213498266Sopenharmony_ci} 16313498266Sopenharmony_ci#endif 16413498266Sopenharmony_ciUNITTEST_STOP 165