@@ -7925,6 +7925,88 @@ TEST(DirtyDataRequestTest, HeadFieldValueContains_CR_LF_NUL) {
79257925 cli.Get (" /test" , {{" Test" , " _\n\r _\n\r _" }});
79267926}
79277927
7928+ TEST (InvalidHeaderCharsTest, is_field_name) {
7929+ EXPECT_TRUE (detail::fields::is_field_name (" exampleToken" ));
7930+ EXPECT_TRUE (detail::fields::is_field_name (" token123" ));
7931+ EXPECT_TRUE (detail::fields::is_field_name (" !#$%&'*+-.^_`|~" ));
7932+
7933+ EXPECT_FALSE (detail::fields::is_field_name (" example token" ));
7934+ EXPECT_FALSE (detail::fields::is_field_name (" example_token" ));
7935+ EXPECT_FALSE (detail::fields::is_field_name (" example_token " ));
7936+ EXPECT_FALSE (detail::fields::is_field_name (" token@123" ));
7937+ EXPECT_FALSE (detail::fields::is_field_name (" " ));
7938+ EXPECT_FALSE (detail::fields::is_field_name (" example\r token" ));
7939+ EXPECT_FALSE (detail::fields::is_field_name (" example\n token" ));
7940+ EXPECT_FALSE (detail::fields::is_field_name (std::string (" \0 " , 1 )));
7941+ EXPECT_FALSE (detail::fields::is_field_name (" example\t token" ));
7942+ }
7943+
7944+ TEST (InvalidHeaderCharsTest, is_field_value) {
7945+ EXPECT_TRUE (detail::fields::is_field_value (" exampleToken" ));
7946+ EXPECT_TRUE (detail::fields::is_field_value (" token123" ));
7947+ EXPECT_TRUE (detail::fields::is_field_value (" !#$%&'*+-.^_`|~" ));
7948+
7949+ EXPECT_TRUE (detail::fields::is_field_value (" example token" ));
7950+ EXPECT_FALSE (detail::fields::is_field_value (" example_token" ));
7951+ EXPECT_FALSE (detail::fields::is_field_value (" example_token " ));
7952+ EXPECT_TRUE (detail::fields::is_field_value (" token@123" ));
7953+ EXPECT_FALSE (detail::fields::is_field_value (" " ));
7954+ EXPECT_FALSE (detail::fields::is_field_value (" example\r token" ));
7955+ EXPECT_FALSE (detail::fields::is_field_value (" example\n token" ));
7956+ EXPECT_FALSE (detail::fields::is_field_value (std::string (" \0 " , 1 )));
7957+ EXPECT_TRUE (detail::fields::is_field_value (" example\t token" ));
7958+
7959+ EXPECT_TRUE (detail::fields::is_field_value (" 0" ));
7960+ }
7961+
7962+ TEST (InvalidHeaderCharsTest, OnServer) {
7963+ Server svr;
7964+
7965+ svr.Get (" /test_name" , [&](const Request &req, Response &res) {
7966+ std::string header = " Not Set" ;
7967+ if (req.has_param (" header" )) { header = req.get_param_value (" header" ); }
7968+
7969+ res.set_header (header, " value" );
7970+ res.set_content (" Page Content Page Content" , " text/plain" );
7971+ });
7972+
7973+ svr.Get (" /test_value" , [&](const Request &req, Response &res) {
7974+ std::string header = " Not Set" ;
7975+ if (req.has_param (" header" )) { header = req.get_param_value (" header" ); }
7976+
7977+ res.set_header (" X-Test" , header);
7978+ res.set_content (" Page Content Page Content" , " text/plain" );
7979+ });
7980+
7981+ auto thread = std::thread ([&]() { svr.listen (HOST, PORT); });
7982+
7983+ auto se = detail::scope_exit ([&] {
7984+ svr.stop ();
7985+ thread.join ();
7986+ ASSERT_FALSE (svr.is_running ());
7987+ });
7988+
7989+ svr.wait_until_ready ();
7990+
7991+ Client cli (HOST, PORT);
7992+ {
7993+ auto res = cli.Get (
7994+ R"( /test_name?header=Value%00%0d%0aHEADER_KEY%3aHEADER_VALUE%0d%0a%0d%0aBODY_BODY_BODY)" );
7995+
7996+ ASSERT_TRUE (res);
7997+ EXPECT_EQ (" Page Content Page Content" , res->body );
7998+ EXPECT_FALSE (res->has_header (" HEADER_KEY" ));
7999+ }
8000+ {
8001+ auto res = cli.Get (
8002+ R"( /test_value?header=Value%00%0d%0aHEADER_KEY%3aHEADER_VALUE%0d%0a%0d%0aBODY_BODY_BODY)" );
8003+
8004+ ASSERT_TRUE (res);
8005+ EXPECT_EQ (" Page Content Page Content" , res->body );
8006+ EXPECT_FALSE (res->has_header (" HEADER_KEY" ));
8007+ }
8008+ }
8009+
79288010#ifndef _WIN32
79298011TEST (Expect100ContinueTest, ServerClosesConnection) {
79308012 static constexpr char reject[] = " Unauthorized" ;
0 commit comments