| @@ -0,0 +1,130 @@ |
| + | /*************************************************************************** |
| + | * _ _ ____ _ |
| + | * 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 check1626 { |
| + | const char *in; /* send this in */ |
| + | const char *out; /* expect this out */ |
| + | }; |
| + | |
| + | static CURLcode test_unit1626(const char *arg) |
| + | { |
| + | size_t i; |
| + | static const struct check1626 list[] = { |
| + | /* basic */ |
| + | { "Header: value", "value" }, |
| + | /* no space */ |
| + | { "Header:value", "value" }, |
| + | /* multiple spaces */ |
| + | { "Header: value", "value" }, |
| + | /* tabs */ |
| + | { "Header: \tvalue", "value" }, |
| + | /* trailing space */ |
| + | { "Header: value ", "value" }, |
| + | /* leading and trailing spaces */ |
| + | { "Header: value ", "value" }, |
| + | /* nothing after colon */ |
| + | { "Header:", "" }, |
| + | /* spaces-only after colon */ |
| + | { "Header: ", "" }, |
| + | /* spaces and tabs after colon */ |
| + | { "Header: \t ", "" }, |
| + | /* spaces in the value */ |
| + | { "Header: one two", "one two" }, |
| + | /* multiple spaces in the value */ |
| + | { "Header: one two a b c ", "one two a b c" }, |
| + | /* realistic */ |
| + | { "Header: text/html", "text/html" }, |
| + | /* ending with CR */ |
| + | { "Header: value\r", "value" }, |
| + | /* ending with LF */ |
| + | { "Header: value\n", "value" }, |
| + | /* quoted value */ |
| + | { "Header: \"value\"\n", "\"value\"" }, |
| + | /* quoted value with trailing space */ |
| + | { "Header: \"value\" ", "\"value\"" }, |
| + | /* leading whitespace before header name */ |
| + | { " Header: value", "value" }, |
| + | /* tab before colon */ |
| + | { "Header\t: value", "value" }, |
| + | /* mixed whitespace after colon */ |
| + | { "Header:\t value", "value" }, |
| + | /* value containing colon */ |
| + | { "Header: foo:bar", "foo:bar" }, |
| + | /* multiple colons */ |
| + | { "Header: foo:bar:baz", "foo:bar:baz" }, |
| + | /* tab-only value */ |
| + | { "Header:\t\t", "" }, |
| + | /* CRLF ending */ |
| + | { "Header: value\r\n", "value" }, |
| + | /* value with internal tabs */ |
| + | { "Header: foo\tbar", "foo\tbar" }, |
| + | /* value with leading tab trimmed */ |
| + | { "Header:\tfoo", "foo" }, |
| + | /* colon with spaces before it */ |
| + | { "Header : value", "value" }, |
| + | /* multiple spaces before colon */ |
| + | { "Header : value", "value" }, |
| + | /* spaces around colon */ |
| + | { "Header : value", "value" }, |
| + | }; |
| + | |
| + | (void)arg; |
| + | |
| + | for(i = 0; i < CURL_ARRAYSIZE(list); i++) { |
| + | bool ok; |
| + | char *get = Curl_copy_header_value(list[i].in); |
| + | |
| + | ok = get && !strcmp(list[i].out, get); |
| + | if(!ok) { |
| + | curl_mprintf("Input: %s\n" |
| + | "Got: %s\n" |
| + | "Expected: %s\n", |
| + | list[i].in, get, list[i].out); |
| + | } |
| + | curlx_free(get); |
| + | if(!ok) |
| + | 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_unit1626(const char *arg) |
| + | { |
| + | (void)arg; |
| + | return CURLE_OK; |
| + | } |
| + | #endif |