@@ -53,6 +53,17 @@ namespace logic = boost::logic;
53
53
namespace fusion = boost::fusion;
54
54
using namespace boost ::network::http;
55
55
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
+
56
67
BOOST_AUTO_TEST_CASE (incremental_parser_constructor) {
57
68
response_parser<tags::default_string> p; // default constructible
58
69
}
@@ -114,7 +125,7 @@ BOOST_AUTO_TEST_CASE(incremental_parser_parse_http_version) {
114
125
* the parser doesn't do any conversions from string to integer
115
126
* and outsource that part to the user of the parser.
116
127
*/
117
- BOOST_AUTO_TEST_CASE (incremental_parser_parse_status) {
128
+ BOOST_AUTO_TEST_CASE_TEMPLATE (incremental_parser_parse_status, eol, eol_types ) {
118
129
typedef response_parser<tags::default_string> response_parser_type;
119
130
typedef boost::iterator_range<std::string::const_iterator> range_type;
120
131
// 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) {
140
151
BOOST_CHECK_EQUAL (parsed_ok, false );
141
152
parsed = std::string (boost::begin (result_range), boost::end (result_range));
142
153
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;
143
162
}
144
163
145
164
/* * In this test then we get the rest of the first line of the HTTP
146
165
* Response, and treat it as the status message.
147
166
*/
148
- BOOST_AUTO_TEST_CASE (incremental_parser_parse_status_message) {
167
+ BOOST_AUTO_TEST_CASE_TEMPLATE (incremental_parser_parse_status_message, eol, eol_types ) {
149
168
typedef response_parser<tags::default_string> response_parser_type;
150
169
typedef boost::iterator_range<std::string::const_iterator> range_type;
151
170
response_parser_type p (response_parser_type::http_status_done);
152
171
153
- std::string valid_status_message = " OK\r\n Server : Foo" ;
172
+ std::string valid_status_message = " OK" + eol::literal + " Server : Foo" ;
154
173
logic::tribool parsed_ok;
155
174
range_type result_range;
156
175
fusion::tie (parsed_ok, result_range) = p.parse_until (
@@ -161,7 +180,25 @@ BOOST_AUTO_TEST_CASE(incremental_parser_parse_status_message) {
161
180
std::cout << " PARSED: " << parsed << " state=" << p.state () << std::endl;
162
181
163
182
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;
165
202
fusion::tie (parsed_ok, result_range) = p.parse_until (
166
203
response_parser_type::http_status_message_done,
167
204
valid_status_message);
@@ -170,7 +207,7 @@ BOOST_AUTO_TEST_CASE(incremental_parser_parse_status_message) {
170
207
std::cout << " PARSED: " << parsed << " state=" << p.state () << std::endl;
171
208
172
209
p.reset (response_parser_type::http_status_done);
173
- valid_status_message = " Internal Server Error \r\n " ;
210
+ valid_status_message = " 한글메시지 " + eol::literal ;
174
211
fusion::tie (parsed_ok, result_range) = p.parse_until (
175
212
response_parser_type::http_status_message_done,
176
213
valid_status_message);
@@ -181,12 +218,12 @@ BOOST_AUTO_TEST_CASE(incremental_parser_parse_status_message) {
181
218
182
219
/* * This test specifices how one-line-per-header parsing happens incrementally.
183
220
*/
184
- BOOST_AUTO_TEST_CASE (incremental_parser_parse_header_lines) {
221
+ BOOST_AUTO_TEST_CASE_TEMPLATE (incremental_parser_parse_header_lines, eol, eol_types ) {
185
222
typedef response_parser<tags::default_string> response_parser_type;
186
223
typedef boost::iterator_range<std::string::const_iterator> range_type;
187
224
response_parser_type p (response_parser_type::http_status_message_done);
188
225
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 ;
190
227
logic::tribool parsed_ok;
191
228
range_type result_range;
192
229
fusion::tie (parsed_ok, result_range) = p.parse_until (
@@ -211,5 +248,105 @@ BOOST_AUTO_TEST_CASE(incremental_parser_parse_header_lines) {
211
248
valid_headers);
212
249
BOOST_CHECK_EQUAL (parsed_ok, true );
213
250
BOOST_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);
214
351
}
215
352
0 commit comments