|
| 1 | +/* Icinga 2 | (c) 2025 Icinga GmbH | GPLv2+ */ |
| 2 | + |
| 3 | +#include <BoostTestTargetConfig.h> |
| 4 | +#include "remote/httputility.hpp" |
| 5 | +#include "test/icingaapplication-fixture.hpp" |
| 6 | + |
| 7 | +using namespace icinga; |
| 8 | + |
| 9 | +BOOST_AUTO_TEST_SUITE(remote_httputility) |
| 10 | + |
| 11 | +BOOST_AUTO_TEST_CASE(IsValidHeaderName) |
| 12 | +{ |
| 13 | + // Use string_view literals (""sv) to allow test inputs containing '\0'. |
| 14 | + using namespace std::string_view_literals; |
| 15 | + |
| 16 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderName("Host"sv), true); |
| 17 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderName("X-Powered-By"sv), true); |
| 18 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderName("Content-Security-Policy"sv), true); |
| 19 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderName("Strict-Transport-Security"sv), true); |
| 20 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderName("lowercase-is-fine-too"sv), true); |
| 21 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderName("everything-from-the-spec-!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"sv), true); |
| 22 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderName("-this-seems-to-be-allowed-too-"sv), true); |
| 23 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderName("~http~is~weird~"sv), true); |
| 24 | + |
| 25 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderName(""sv /* empty header name is invalid */), false); |
| 26 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderName("spaces are not allowed"sv), false); |
| 27 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderName("tabs\tare\tnot\tallowed"sv), false); |
| 28 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderName("nul-is-bad\0"sv), false); |
| 29 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderName("del-is-bad\x7f"sv), false); |
| 30 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderName("non-ascii-is-bad\x80"sv), false); |
| 31 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderName("non-ascii-is-bad\xff"sv), false); |
| 32 | +} |
| 33 | + |
| 34 | +BOOST_AUTO_TEST_CASE(IsValidHeaderValue) |
| 35 | +{ |
| 36 | + // Use string_view literals (""sv) to allow test inputs containing '\0'. |
| 37 | + using namespace std::string_view_literals; |
| 38 | + |
| 39 | + auto everything = []{ |
| 40 | + std::string s = "everything-from-the-spec \t "; |
| 41 | + for (int i = 0x21; i <= 0x7e; ++i) { |
| 42 | + s.push_back(char(i)); |
| 43 | + } |
| 44 | + for (int i = 0x80; i <= 0xff; ++i) { |
| 45 | + s.push_back(char(i)); |
| 46 | + } |
| 47 | + |
| 48 | + // Sanity checks: |
| 49 | + for (char c : {'\x00', '\x08', '\x0a', '\x1f', '\x7f'}) { |
| 50 | + BOOST_CHECK_EQUAL(s.find(c), std::string::npos); |
| 51 | + } |
| 52 | + for (char c : {'\t' /* == 0x09 */, ' ' /* == 0x20 */, '\x21', '\x7e', '\x80', '\xff'}) { |
| 53 | + BOOST_CHECK_NE(s.find(c), std::string::npos); |
| 54 | + } |
| 55 | + |
| 56 | + return s; |
| 57 | + }; |
| 58 | + |
| 59 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderValue(""sv /* empty header value is allowed */), true); |
| 60 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderValue("example.com"sv), true); |
| 61 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderValue("default-src 'self'; img-src 'self' example.com"sv), true); |
| 62 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderValue("max-age=31536000"sv), true); |
| 63 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderValue("spaces are allowed"sv), true); |
| 64 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderValue("tabs\tare\tallowed"sv), true); |
| 65 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderValue("non-ascii-is-allowed\x80"sv), true); |
| 66 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderValue("non-ascii-is-allowed\xff"sv), true); |
| 67 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderValue(everything()), true); |
| 68 | + |
| 69 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderValue("nul-is-bad\0"sv), false); |
| 70 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderValue("del-is-bad\x7f"sv), false); |
| 71 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderValue(" no leading spaces"sv), false); |
| 72 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderValue("no trailing spaces "sv), false); |
| 73 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderValue("\tno leading tabs"sv), false); |
| 74 | + BOOST_CHECK_EQUAL(HttpUtility::IsValidHeaderValue("no trailing tabs\t"sv), false); |
| 75 | +} |
| 76 | + |
| 77 | +BOOST_AUTO_TEST_SUITE_END() |
0 commit comments