@@ -53,6 +53,17 @@ namespace logic = boost::logic;
5353namespace fusion = boost::fusion;
5454using namespace boost ::network::http;
5555
56+ struct crlf {
57+ static const std::string literal;
58+ };
59+ const std::string crlf::literal =" \r\n " ;
60+ struct lf {
61+ static const std::string literal;
62+ };
63+ const std::string lf::literal =" \n " ;
64+ typedef boost::mpl::vector<crlf, lf> eol_types;
65+
66+
5667BOOST_AUTO_TEST_CASE (incremental_parser_constructor) {
5768 response_parser<tags::default_string> p;// default constructible
5869}
@@ -114,7 +125,7 @@ BOOST_AUTO_TEST_CASE(incremental_parser_parse_http_version) {
114125 * the parser doesn't do any conversions from string to integer
115126 * and outsource that part to the user of the parser.
116127*/
117- BOOST_AUTO_TEST_CASE (incremental_parser_parse_status) {
128+ BOOST_AUTO_TEST_CASE_TEMPLATE (incremental_parser_parse_status, eol, eol_types ) {
118129typedef response_parser<tags::default_string> response_parser_type;
119130typedef boost::iterator_range<std::string::const_iterator> range_type;
120131// We want to create a parser that has been initialized to a specific
@@ -140,17 +151,25 @@ BOOST_AUTO_TEST_CASE(incremental_parser_parse_status) {
140151BOOST_CHECK_EQUAL (parsed_ok,false );
141152 parsed =std::string (boost::begin (result_range),boost::end (result_range));
142153 std::cout <<" PARSED:" << parsed <<" state=" << p.state () << std::endl;
154+
155+ valid_status =" 200" + eol::literal;
156+ fusion::tie (parsed_ok, result_range) = p.parse_until (
157+ response_parser_type::http_status_done,
158+ valid_status);
159+ BOOST_CHECK_EQUAL (parsed_ok,true );
160+ parsed =std::string (boost::begin (result_range),boost::end (result_range));
161+ std::cout <<" PARSED:" << parsed <<" state=" << p.state () << std::endl;
143162}
144163
145164/* * In this test then we get the rest of the first line of the HTTP
146165 * Response, and treat it as the status message.
147166*/
148- BOOST_AUTO_TEST_CASE (incremental_parser_parse_status_message) {
167+ BOOST_AUTO_TEST_CASE_TEMPLATE (incremental_parser_parse_status_message, eol, eol_types ) {
149168typedef response_parser<tags::default_string> response_parser_type;
150169typedef boost::iterator_range<std::string::const_iterator> range_type;
151170 response_parser_typep (response_parser_type::http_status_done);
152171
153- std::string valid_status_message =" OK\r\n Server : Foo" ;
172+ std::string valid_status_message =" OK" + eol::literal + " Server : Foo" ;
154173 logic::tribool parsed_ok;
155174 range_type result_range;
156175fusion::tie (parsed_ok, result_range) = p.parse_until (
@@ -161,7 +180,25 @@ BOOST_AUTO_TEST_CASE(incremental_parser_parse_status_message) {
161180 std::cout <<" PARSED:" << parsed <<" state=" << p.state () << std::endl;
162181
163182 p.reset (response_parser_type::http_status_done);
164- valid_status_message =" OK\r\n " ;
183+ valid_status_message =" OK" + eol::literal;
184+ fusion::tie (parsed_ok, result_range) = p.parse_until (
185+ response_parser_type::http_status_message_done,
186+ valid_status_message);
187+ BOOST_CHECK_EQUAL (parsed_ok,true );
188+ parsed =std::string (boost::begin (result_range),boost::end (result_range));
189+ std::cout <<" PARSED:" << parsed <<" state=" << p.state () << std::endl;
190+
191+ p.reset (response_parser_type::http_status_done);
192+ valid_status_message =" Internal Server Error" + eol::literal;
193+ fusion::tie (parsed_ok, result_range) = p.parse_until (
194+ response_parser_type::http_status_message_done,
195+ valid_status_message);
196+ BOOST_CHECK_EQUAL (parsed_ok,true );
197+ parsed =std::string (boost::begin (result_range),boost::end (result_range));
198+ std::cout <<" PARSED:" << parsed <<" state=" << p.state () << std::endl;
199+
200+ p.reset (response_parser_type::http_status_done);
201+ valid_status_message = eol::literal;
165202fusion::tie (parsed_ok, result_range) = p.parse_until (
166203 response_parser_type::http_status_message_done,
167204 valid_status_message);
@@ -170,7 +207,7 @@ BOOST_AUTO_TEST_CASE(incremental_parser_parse_status_message) {
170207 std::cout <<" PARSED:" << parsed <<" state=" << p.state () << std::endl;
171208
172209 p.reset (response_parser_type::http_status_done);
173- valid_status_message =" Internal Server Error \r\n " ;
210+ valid_status_message =" 한글메시지 " + eol::literal ;
174211fusion::tie (parsed_ok, result_range) = p.parse_until (
175212 response_parser_type::http_status_message_done,
176213 valid_status_message);
@@ -181,12 +218,12 @@ BOOST_AUTO_TEST_CASE(incremental_parser_parse_status_message) {
181218
182219/* * This test specifices how one-line-per-header parsing happens incrementally.
183220*/
184- BOOST_AUTO_TEST_CASE (incremental_parser_parse_header_lines) {
221+ BOOST_AUTO_TEST_CASE_TEMPLATE (incremental_parser_parse_header_lines, eol, eol_types ) {
185222typedef response_parser<tags::default_string> response_parser_type;
186223typedef boost::iterator_range<std::string::const_iterator> range_type;
187224 response_parser_typep (response_parser_type::http_status_message_done);
188225
189- std::string valid_headers =" Server: Foo\r\n Content -Type: application/json\r\n\r\n " ;
226+ std::string valid_headers =" Server: Foo" + eol::literal + " Content -Type: application/json" + eol::literal + eol::literal ;
190227 logic::tribool parsed_ok;
191228 range_type result_range;
192229fusion::tie (parsed_ok, result_range) = p.parse_until (
@@ -211,5 +248,105 @@ BOOST_AUTO_TEST_CASE(incremental_parser_parse_header_lines) {
211248 valid_headers);
212249BOOST_CHECK_EQUAL (parsed_ok,true );
213250BOOST_CHECK (parsed1 != parsed2);
251+
252+ p.reset (response_parser_type::http_status_message_done);
253+ valid_headers =" Server: Foo" + eol::literal +" Content-Type: application/json" + eol::literal + eol::literal;
254+ fusion::tie (parsed_ok, result_range) = p.parse_until (
255+ response_parser_type::http_header_line_done,
256+ valid_headers);
257+ BOOST_CHECK_EQUAL (parsed_ok,true );
258+ parsed1 =std::string (boost::begin (result_range),boost::end (result_range));
259+ std::cout <<" PARSED:" << parsed1 <<" state=" << p.state () << std::endl;
260+ p.reset (response_parser_type::http_status_message_done);
261+ end = valid_headers.end ();
262+ valid_headers.assign (boost::end (result_range), end);
263+ fusion::tie (parsed_ok, result_range) = p.parse_until (
264+ response_parser_type::http_header_line_done,
265+ valid_headers);
266+ BOOST_CHECK_EQUAL (parsed_ok,true );
267+ parsed2 =std::string (boost::begin (result_range),boost::end (result_range));
268+ std::cout <<" PARSED:" << parsed2 <<" state=" << p.state () << std::endl;
269+ valid_headers.assign (boost::end (result_range), end);
270+ p.reset (response_parser_type::http_status_message_done);
271+ fusion::tie (parsed_ok, result_range) = p.parse_until (
272+ response_parser_type::http_headers_done,
273+ valid_headers);
274+ BOOST_CHECK_EQUAL (parsed_ok,true );
275+ BOOST_CHECK (parsed1 != parsed2);
276+
277+ p.reset (response_parser_type::http_status_message_done);
278+ valid_headers =" _Server: Foo" + eol::literal +" _Content-Type: application/json" + eol::literal + eol::literal;
279+ fusion::tie (parsed_ok, result_range) = p.parse_until (
280+ response_parser_type::http_header_line_done,
281+ valid_headers);
282+ BOOST_CHECK_EQUAL (parsed_ok,true );
283+ parsed1 =std::string (boost::begin (result_range),boost::end (result_range));
284+ std::cout <<" PARSED:" << parsed1 <<" state=" << p.state () << std::endl;
285+ p.reset (response_parser_type::http_status_message_done);
286+ end = valid_headers.end ();
287+ valid_headers.assign (boost::end (result_range), end);
288+ fusion::tie (parsed_ok, result_range) = p.parse_until (
289+ response_parser_type::http_header_line_done,
290+ valid_headers);
291+ BOOST_CHECK_EQUAL (parsed_ok,true );
292+ parsed2 =std::string (boost::begin (result_range),boost::end (result_range));
293+ std::cout <<" PARSED:" << parsed2 <<" state=" << p.state () << std::endl;
294+ valid_headers.assign (boost::end (result_range), end);
295+ p.reset (response_parser_type::http_status_message_done);
296+ fusion::tie (parsed_ok, result_range) = p.parse_until (
297+ response_parser_type::http_headers_done,
298+ valid_headers);
299+ BOOST_CHECK_EQUAL (parsed_ok,true );
300+ BOOST_CHECK (parsed1 != parsed2);
301+
302+ p.reset (response_parser_type::http_status_message_done);
303+ valid_headers =" Server:" + eol::literal +" Content-Type: application/json" + eol::literal + eol::literal;
304+ fusion::tie (parsed_ok, result_range) = p.parse_until (
305+ response_parser_type::http_header_line_done,
306+ valid_headers);
307+ BOOST_CHECK_EQUAL (parsed_ok,true );
308+ parsed1 =std::string (boost::begin (result_range),boost::end (result_range));
309+ std::cout <<" PARSED:" << parsed1 <<" state=" << p.state () << std::endl;
310+ p.reset (response_parser_type::http_status_message_done);
311+ end = valid_headers.end ();
312+ valid_headers.assign (boost::end (result_range), end);
313+ fusion::tie (parsed_ok, result_range) = p.parse_until (
314+ response_parser_type::http_header_line_done,
315+ valid_headers);
316+ BOOST_CHECK_EQUAL (parsed_ok,true );
317+ parsed2 =std::string (boost::begin (result_range),boost::end (result_range));
318+ std::cout <<" PARSED:" << parsed2 <<" state=" << p.state () << std::endl;
319+ valid_headers.assign (boost::end (result_range), end);
320+ p.reset (response_parser_type::http_status_message_done);
321+ fusion::tie (parsed_ok, result_range) = p.parse_until (
322+ response_parser_type::http_headers_done,
323+ valid_headers);
324+ BOOST_CHECK_EQUAL (parsed_ok,true );
325+ BOOST_CHECK (parsed1 != parsed2);
326+
327+ p.reset (response_parser_type::http_status_message_done);
328+ valid_headers =" Server: 서버" + eol::literal +" Content-Type: application/json" + eol::literal + eol::literal;
329+ fusion::tie (parsed_ok, result_range) = p.parse_until (
330+ response_parser_type::http_header_line_done,
331+ valid_headers);
332+ BOOST_CHECK_EQUAL (parsed_ok,true );
333+ parsed1 =std::string (boost::begin (result_range),boost::end (result_range));
334+ std::cout <<" PARSED:" << parsed1 <<" state=" << p.state () << std::endl;
335+ p.reset (response_parser_type::http_status_message_done);
336+ end = valid_headers.end ();
337+ valid_headers.assign (boost::end (result_range), end);
338+ fusion::tie (parsed_ok, result_range) = p.parse_until (
339+ response_parser_type::http_header_line_done,
340+ valid_headers);
341+ BOOST_CHECK_EQUAL (parsed_ok,true );
342+ parsed2 =std::string (boost::begin (result_range),boost::end (result_range));
343+ std::cout <<" PARSED:" << parsed2 <<" state=" << p.state () << std::endl;
344+ valid_headers.assign (boost::end (result_range), end);
345+ p.reset (response_parser_type::http_status_message_done);
346+ fusion::tie (parsed_ok, result_range) = p.parse_until (
347+ response_parser_type::http_headers_done,
348+ valid_headers);
349+ BOOST_CHECK_EQUAL (parsed_ok,true );
350+ BOOST_CHECK (parsed1 != parsed2);
214351}
215352