@@ -186,7 +186,8 @@ TEST(ParseMultipartBoundaryTest, ValueWithQuote) {
186
186
}
187
187
188
188
TEST (ParseMultipartBoundaryTest, ValueWithCharset) {
189
- string content_type = " multipart/mixed; boundary=THIS_STRING_SEPARATES;charset=UTF-8" ;
189
+ string content_type =
190
+ " multipart/mixed; boundary=THIS_STRING_SEPARATES;charset=UTF-8" ;
190
191
string boundary;
191
192
auto ret = detail::parse_multipart_boundary (content_type, boundary);
192
193
EXPECT_TRUE (ret);
@@ -1710,6 +1711,30 @@ class ServerTest : public ::testing::Test {
1710
1711
delete i;
1711
1712
});
1712
1713
})
1714
+ .Get (" /streamed-chunked-with-trailer" ,
1715
+ [&](const Request & /* req*/ , Response &res) {
1716
+ auto i = new int (0 );
1717
+ res.set_header (" Trailer" , " Dummy1, Dummy2" );
1718
+ res.set_chunked_content_provider (
1719
+ " text/plain" ,
1720
+ [i](size_t /* offset*/ , DataSink &sink) {
1721
+ switch (*i) {
1722
+ case 0 : sink.os << " 123" ; break ;
1723
+ case 1 : sink.os << " 456" ; break ;
1724
+ case 2 : sink.os << " 789" ; break ;
1725
+ case 3 : {
1726
+ sink.done_with_trailer (
1727
+ {{" Dummy1" , " DummyVal1" }, {" Dummy2" , " DummyVal2" }});
1728
+ } break ;
1729
+ }
1730
+ (*i)++;
1731
+ return true ;
1732
+ },
1733
+ [i](bool success) {
1734
+ EXPECT_TRUE (success);
1735
+ delete i;
1736
+ });
1737
+ })
1713
1738
.Get (" /streamed" ,
1714
1739
[&](const Request & /* req*/ , Response &res) {
1715
1740
res.set_content_provider (
@@ -1801,39 +1826,39 @@ class ServerTest : public ::testing::Test {
1801
1826
}
1802
1827
})
1803
1828
.Post (" /multipart/multi_file_values" ,
1804
- [&](const Request &req, Response & /* res*/ ) {
1805
- EXPECT_EQ (5u , req.files .size ());
1806
- ASSERT_TRUE (!req.has_file (" ???" ));
1807
- ASSERT_TRUE (req.body .empty ());
1829
+ [&](const Request &req, Response & /* res*/ ) {
1830
+ EXPECT_EQ (5u , req.files .size ());
1831
+ ASSERT_TRUE (!req.has_file (" ???" ));
1832
+ ASSERT_TRUE (req.body .empty ());
1808
1833
1809
- {
1834
+ {
1810
1835
const auto &text_value = req.get_file_values (" text" );
1811
1836
EXPECT_EQ (text_value.size (), 1 );
1812
1837
auto &text = text_value[0 ];
1813
1838
EXPECT_TRUE (text.filename .empty ());
1814
1839
EXPECT_EQ (" default text" , text.content );
1815
- }
1816
- {
1817
- const auto &text1_values = req.get_file_values (" multi_text1" );
1818
- EXPECT_EQ (text1_values.size (), 2 );
1819
- EXPECT_EQ (" aaaaa" , text1_values[0 ].content );
1820
- EXPECT_EQ (" bbbbb" , text1_values[1 ].content );
1821
- }
1822
-
1823
- {
1824
- const auto &file1_values = req.get_file_values (" multi_file1" );
1825
- EXPECT_EQ (file1_values.size (), 2 );
1826
- auto file1 = file1_values[0 ];
1827
- EXPECT_EQ (file1.filename , " hello.txt" );
1828
- EXPECT_EQ (file1.content_type , " text/plain" );
1829
- EXPECT_EQ (" h\n e\n\n l\n l\n o\n " , file1.content );
1830
-
1831
- auto file2 = file1_values[1 ];
1832
- EXPECT_EQ (file2.filename , " world.json" );
1833
- EXPECT_EQ (file2.content_type , " application/json" );
1834
- EXPECT_EQ (" {\n \" world\" , true\n }\n " , file2.content );
1835
- }
1836
- })
1840
+ }
1841
+ {
1842
+ const auto &text1_values = req.get_file_values (" multi_text1" );
1843
+ EXPECT_EQ (text1_values.size (), 2 );
1844
+ EXPECT_EQ (" aaaaa" , text1_values[0 ].content );
1845
+ EXPECT_EQ (" bbbbb" , text1_values[1 ].content );
1846
+ }
1847
+
1848
+ {
1849
+ const auto &file1_values = req.get_file_values (" multi_file1" );
1850
+ EXPECT_EQ (file1_values.size (), 2 );
1851
+ auto file1 = file1_values[0 ];
1852
+ EXPECT_EQ (file1.filename , " hello.txt" );
1853
+ EXPECT_EQ (file1.content_type , " text/plain" );
1854
+ EXPECT_EQ (" h\n e\n\n l\n l\n o\n " , file1.content );
1855
+
1856
+ auto file2 = file1_values[1 ];
1857
+ EXPECT_EQ (file2.filename , " world.json" );
1858
+ EXPECT_EQ (file2.content_type , " application/json" );
1859
+ EXPECT_EQ (" {\n \" world\" , true\n }\n " , file2.content );
1860
+ }
1861
+ })
1837
1862
.Post (" /empty" ,
1838
1863
[&](const Request &req, Response &res) {
1839
1864
EXPECT_EQ (req.body , " " );
@@ -2680,13 +2705,14 @@ TEST_F(ServerTest, MultipartFormData) {
2680
2705
2681
2706
TEST_F (ServerTest, MultipartFormDataMultiFileValues) {
2682
2707
MultipartFormDataItems items = {
2683
- {" text" , " default text" , " " , " " },
2708
+ {" text" , " default text" , " " , " " },
2684
2709
2685
- {" multi_text1" , " aaaaa" , " " , " " },
2686
- {" multi_text1" , " bbbbb" , " " , " " },
2710
+ {" multi_text1" , " aaaaa" , " " , " " },
2711
+ {" multi_text1" , " bbbbb" , " " , " " },
2687
2712
2688
- {" multi_file1" , " h\n e\n\n l\n l\n o\n " , " hello.txt" , " text/plain" },
2689
- {" multi_file1" , " {\n \" world\" , true\n }\n " , " world.json" , " application/json" },
2713
+ {" multi_file1" , " h\n e\n\n l\n l\n o\n " , " hello.txt" , " text/plain" },
2714
+ {" multi_file1" , " {\n \" world\" , true\n }\n " , " world.json" ,
2715
+ " application/json" },
2690
2716
};
2691
2717
2692
2718
auto res = cli_.Post (" /multipart/multi_file_values" , items);
@@ -2920,6 +2946,15 @@ TEST_F(ServerTest, GetStreamedChunked2) {
2920
2946
EXPECT_EQ (std::string (" 123456789" ), res->body );
2921
2947
}
2922
2948
2949
+ TEST_F (ServerTest, GetStreamedChunkedWithTrailer) {
2950
+ auto res = cli_.Get (" /streamed-chunked-with-trailer" );
2951
+ ASSERT_TRUE (res);
2952
+ EXPECT_EQ (200 , res->status );
2953
+ EXPECT_EQ (std::string (" 123456789" ), res->body );
2954
+ EXPECT_EQ (std::string (" DummyVal1" ), res->get_header_value (" Dummy1" ));
2955
+ EXPECT_EQ (std::string (" DummyVal2" ), res->get_header_value (" Dummy2" ));
2956
+ }
2957
+
2923
2958
TEST_F (ServerTest, LargeChunkedPost) {
2924
2959
Request req;
2925
2960
req.method = " POST" ;
@@ -3906,9 +3941,8 @@ TEST(ServerStopTest, StopServerWithChunkedTransmission) {
3906
3941
3907
3942
TEST (ServerStopTest, ClientAccessAfterServerDown) {
3908
3943
httplib::Server svr;
3909
- svr.Post (" /hi" , [&](const httplib::Request & /* req*/ , httplib::Response &res) {
3910
- res.status = 200 ;
3911
- });
3944
+ svr.Post (" /hi" , [&](const httplib::Request & /* req*/ ,
3945
+ httplib::Response &res) { res.status = 200 ; });
3912
3946
3913
3947
auto thread = std::thread ([&]() { svr.listen (HOST, PORT); });
3914
3948
0 commit comments