@@ -7925,6 +7925,88 @@ TEST(DirtyDataRequestTest, HeadFieldValueContains_CR_LF_NUL) {
7925
7925
cli.Get (" /test" , {{" Test" , " _\n\r _\n\r _" }});
7926
7926
}
7927
7927
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
+
7928
8010
#ifndef _WIN32
7929
8011
TEST (Expect100ContinueTest, ServerClosesConnection) {
7930
8012
static constexpr char reject[] = " Unauthorized" ;
0 commit comments