@@ -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