| @@ -0,0 +1,136 @@ |
| + | /*************************************************************************** |
| + | * _ _ ____ _ |
| + | * Project ___| | | | _ \| | |
| + | * / __| | | | |_) | | |
| + | * | (__| |_| | _ <| |___ |
| + | * \___|\___/|_| \_\_____| |
| + | * |
| + | * Copyright (C) Daniel Stenberg, <[email protected]>, et al. |
| + | * |
| + | * This software is licensed as described in the file COPYING, which |
| + | * you should have received as part of this distribution. The terms |
| + | * are also available at https://curl.se/docs/copyright.html. |
| + | * |
| + | * You may opt to use, copy, modify, merge, publish, distribute and/or sell |
| + | * copies of the Software, and permit persons to whom the Software is |
| + | * furnished to do so, under the terms of the COPYING file. |
| + | * |
| + | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY |
| + | * KIND, either express or implied. |
| + | * |
| + | * SPDX-License-Identifier: curl |
| + | * |
| + | ***************************************************************************/ |
| + | #include "unitcheck.h" |
| + | |
| + | #ifndef CURL_DISABLE_HTTP |
| + | |
| + | #include "urldata.h" |
| + | #include "url.h" |
| + | |
| + | struct check1625 { |
| + | const char *in; |
| + | const char *hdr; |
| + | const char *extract; |
| + | bool expect; |
| + | }; |
| + | |
| + | static CURLcode test_unit1625(const char *arg) |
| + | { |
| + | size_t i; |
| + | static const struct check1625 list[] = { |
| + | /* basic case */ |
| + | { "Encoding: gzip, chunked", "Encoding:", "chunked", TRUE }, |
| + | /* single value */ |
| + | { "Encoding: chunked", "Encoding:", "chunked", TRUE }, |
| + | /* third token */ |
| + | { "Encoding: a, b, chunked", "Encoding:", "chunked", TRUE }, |
| + | /* fourth token */ |
| + | { "Encoding: a, b, c, chunked", "Encoding:", "chunked", TRUE }, |
| + | /* in middle of three tokens */ |
| + | { "Encoding: a, chunked, ninja", "Encoding:", "chunked", TRUE }, |
| + | /* empty incoming header */ |
| + | { "Encoding:", "Encoding:", "chunked", FALSE }, |
| + | /* just spaces in header */ |
| + | { "Encoding: ", "Encoding:", "chunked", FALSE }, |
| + | /* last among several with no spaces */ |
| + | { "Encoding: ab,cd,ef,gh,ig,kl", "Encoding:", "kl", TRUE }, |
| + | /* double commas */ |
| + | { "Encoding: ab,,kl", "Encoding:", "kl", TRUE }, |
| + | /* repeated commas */ |
| + | { "Encoding: ab,cd,,,,kl", "Encoding:", "kl", TRUE }, |
| + | /* first token of four */ |
| + | { "Encoding: chunked, a, b, c", "Encoding:", "chunked", TRUE }, |
| + | /* different case */ |
| + | { "Encoding: gzip, chunked", "Encoding:", "CHUNKED", TRUE }, |
| + | /* another different case */ |
| + | { "Encoding: gzip, CHUNKED", "Encoding:", "chunked", TRUE }, |
| + | /* incoming header different case */ |
| + | { "encoDING: gzip, CHUNKED", "encoding:", "chunked", TRUE }, |
| + | /* incoming header upper case */ |
| + | { "ENCODING: gzip, chunked", "encoding:", "chunked", TRUE }, |
| + | /* the other value */ |
| + | { "Encoding: gzip, chunked", "Encoding:", "gzip", TRUE }, |
| + | /* without space */ |
| + | { "Encoding: gzip,chunked", "Encoding:", "gzip", TRUE }, |
| + | /* multiple spaces */ |
| + | { "Encoding: gzip, chunked", "Encoding:", "chunked", TRUE }, |
| + | /* tabs */ |
| + | { "Encoding: gzip, \tchunked", "Encoding:", "chunked", TRUE }, |
| + | /* end with CR */ |
| + | { "Encoding: gzip\r\n", "Encoding:", "gzip", TRUE }, |
| + | /* end with LF */ |
| + | { "Encoding: gzip\n", "Encoding:", "gzip", TRUE }, |
| + | /* end with tab */ |
| + | { "Encoding: gzip\t", "Encoding:", "gzip", TRUE }, |
| + | /* end with space + LF */ |
| + | { "Encoding: gzip \n", "Encoding:", "gzip", TRUE }, |
| + | /* missing value */ |
| + | { "Encoding: gzip, chunked", "Encoding:", "br", FALSE }, |
| + | /* wrong header */ |
| + | { "Encoding: gzip, chunked", "Encodin:", "chunked", FALSE }, |
| + | /* prefix only */ |
| + | { "Encoding: gzip2, chunked", "Encoding:", "gzip", FALSE }, |
| + | /* prefix with letter */ |
| + | { "Encoding: gzipp, chunked", "Encoding:", "gzip", FALSE }, |
| + | /* suffix only */ |
| + | { "Encoding: agzip, chunked", "Encoding:", "gzip", FALSE }, |
| + | /* not the right header */ |
| + | { "Decoding: gzip, chunked", "Encoding:", "gzip", FALSE }, |
| + | /* hyphenated */ |
| + | { "Encoding: super-nice", "Encoding:", "super-nice", TRUE }, |
| + | /* hyphenated second token */ |
| + | { "Encoding: extra-good, super-nice", "Encoding:", "super-nice", TRUE }, |
| + | }; |
| + | (void)arg; |
| + | |
| + | for(i = 0; i < CURL_ARRAYSIZE(list); i++) { |
| + | bool check = Curl_compareheader(list[i].in, |
| + | list[i].hdr, strlen(list[i].hdr), |
| + | list[i].extract, strlen(list[i].extract)); |
| + | if(check != list[i].expect) { |
| + | curl_mprintf("Input: %s\n" |
| + | "Header: %s\n" |
| + | "Look for: %s\n" |
| + | "Returned: %s\n", |
| + | list[i].in, list[i].hdr, list[i].extract, |
| + | check ? "TRUE" : "FALSE"); |
| + | break; |
| + | } |
| + | } |
| + | |
| + | curl_mprintf("%zu invokes\n", i); |
| + | |
| + | if(i != CURL_ARRAYSIZE(list)) |
| + | return CURLE_FAILED_INIT; |
| + | |
| + | return CURLE_OK; |
| + | } |
| + | #else |
| + | /* for HTTP-disabled builds */ |
| + | static CURLcode test_unit1625(const char *arg) |
| + | { |
| + | (void)arg; |
| + | return CURLE_OK; |
| + | } |
| + | #endif |