| src/examples/cpp03/http/server/request_parser.hpp | src/examples/cpp11/http/server/request_parser.hpp | 
| ⋮ | ⋮ | 
| 1  | // | 1  | // | 
| 2  | //·request_parser.hpp | 2  | //·request_parser.hpp | 
| 3  | //·~~~~~~~~~~~~~~~~~~ | 3  | //·~~~~~~~~~~~~~~~~~~ | 
| 4  | // | 4  | // | 
| 5  | //·Copyright·(c)·2003-2020·Christopher·M.·Kohlhoff·(chris·at·kohlhoff·dot·com) | 5  | //·Copyright·(c)·2003-2020·Christopher·M.·Kohlhoff·(chris·at·kohlhoff·dot·com) | 
| 6  | // | 6  | // | 
| 7  | //·Distributed·under·the·Boost·Software·License,·Version·1.0.·(See·accompanying | 7  | //·Distributed·under·the·Boost·Software·License,·Version·1.0.·(See·accompanying | 
| 8  | //·file·LICENSE_1_0.txt·or·copy·at·http://www.boost.org/LICENSE_1_0.txt) | 8  | //·file·LICENSE_1_0.txt·or·copy·at·http://www.boost.org/LICENSE_1_0.txt) | 
| 9  | // | 9  | // | 
| 10  |  | 10  |  | 
| 11  | #ifndef·HTTP_REQUEST_PARSER_HPP | 11  | #ifndef·HTTP_REQUEST_PARSER_HPP | 
| 12  | #define·HTTP_REQUEST_PARSER_HPP | 12  | #define·HTTP_REQUEST_PARSER_HPP | 
| 13  |  | 13  |  | 
| 14  | #include·<boost/logic/tribool.hpp> | 14  | #include·<tuple> | 
| 15  | #include·<boost/tuple/tuple.hpp> |  | 
| 16  |  | 15  |  | 
| 17  | namespace·http·{ | 16  | namespace·http·{ | 
| 18  | namespace·server·{ | 17  | namespace·server·{ | 
| 19  |  | 18  |  | 
| 20  | struct·request; | 19  | struct·request; | 
| 21  |  | 20  |  | 
| 22  | ///·Parser·for·incoming·requests. | 21  | ///·Parser·for·incoming·requests. | 
| 23  | class·request_parser | 22  | class·request_parser | 
| 24  | { | 23  | { | 
| 25  | public: | 24  | public: | 
| 26  | ··///·Construct·ready·to·parse·the·request·method. | 25  | ··///·Construct·ready·to·parse·the·request·method. | 
| 27  | ··request_parser(); | 26  | ··request_parser(); | 
| 28  |  | 27  |  | 
| 29  | ··///·Reset·to·initial·parser·state. | 28  | ··///·Reset·to·initial·parser·state. | 
| 30  | ··void·reset(); | 29  | ··void·reset(); | 
| 31  |  | 30  |  | 
| 32  | ··///·Parse·some·data.·The·tribool·return·value·is·true·when·a·complete·request | 31  | ··///·Result·of·parse. | 
| 33  | ··///·has·been·parsed,·false·if·the·data·is·invalid,·indeterminate·when·more | 32  | ··enum·result_type·{·good,·bad,·indeterminate·}; | 
| 34  | ··///·data·is·required.·The·InputIterator·return·value·indicates·how·much·of·the | 33  |  | 
| 35  | ··///·input·has·been·consumed. | 34  | ··///·Parse·some·data.·The·enum·return·value·is·good·when·a·complete·request·has | 
|   | 35  | ··///·been·parsed,·bad·if·the·data·is·invalid,·indeterminate·when·more·data·is | 
|   | 36  | ··///·required.·The·InputIterator·return·value·indicates·how·much·of·the·input | 
|   | 37  | ··///·has·been·consumed. | 
| 36  | ··template·<typename·InputIterator> | 38  | ··template·<typename·InputIterator> | 
| 37  | ··boost::tuple<boost::tribool,·InputIterator>·parse(request&·req, | 39  | ··std::tuple<result_type,·InputIterator>·parse(request&·req, | 
| 38  | ······InputIterator·begin,·InputIterator·end) | 40  | ······InputIterator·begin,·InputIterator·end) | 
| 39  | ··{ | 41  | ··{ | 
| 40  | ····while·(begin·!=·end) | 42  | ····while·(begin·!=·end) | 
| 41  | ····{ | 43  | ····{ | 
| 42  | ······boost::tribool·result·=·consume(req,·*begin++); | 44  | ······result_type·result·=·consume(req,·*begin++); | 
| 43  | ······if·(result·||·!result) | 45  | ······if·(result·==·good·||·result·==·bad) | 
| 44  | ········return·boost::make_tuple(result,·begin); | 46  | ········return·std::make_tuple(result,·begin); | 
| 45  | ····} | 47  | ····} | 
| 46  | ····boost::tribool·result·=·boost::indeterminate; | 48  | ····return·std::make_tuple(indeterminate,·begin); | 
| 47  | ····return·boost::make_tuple(result,·begin); |  | 
| 48  | ··} | 49  | ··} | 
| 49  |  | 50  |  | 
| 50  | private: | 51  | private: | 
| 51  | ··///·Handle·the·next·character·of·input. | 52  | ··///·Handle·the·next·character·of·input. | 
| 52  | ··boost::tribool·consume(request&·req,·char·input); | 53  | ··result_type·consume(request&·req,·char·input); | 
| 53  |  | 54  |  | 
| 54  | ··///·Check·if·a·byte·is·an·HTTP·character. | 55  | ··///·Check·if·a·byte·is·an·HTTP·character. | 
| 55  | ··static·bool·is_char(int·c); | 56  | ··static·bool·is_char(int·c); | 
| 56  |  | 57  |  | 
| 57  | ··///·Check·if·a·byte·is·an·HTTP·control·character. | 58  | ··///·Check·if·a·byte·is·an·HTTP·control·character. | 
| 58  | ··static·bool·is_ctl(int·c); | 59  | ··static·bool·is_ctl(int·c); | 
| 59  |  | 60  |  | 
| 60  | ··///·Check·if·a·byte·is·defined·as·an·HTTP·tspecial·character. | 61  | ··///·Check·if·a·byte·is·defined·as·an·HTTP·tspecial·character. | 
| 61  | ··static·bool·is_tspecial(int·c); | 62  | ··static·bool·is_tspecial(int·c); | 
| 62  |  | 63  |  | 
| 63  | ··///·Check·if·a·byte·is·a·digit. | 64  | ··///·Check·if·a·byte·is·a·digit. | 
| 64  | ··static·bool·is_digit(int·c); | 65  | ··static·bool·is_digit(int·c); | 
| 65  |  | 66  |  | 
| 66  | ··///·The·current·state·of·the·parser. | 67  | ··///·The·current·state·of·the·parser. | 
| 67  | ··enum·state | 68  | ··enum·state | 
| 68  | ··{ | 69  | ··{ | 
| 69  | ····method_start, | 70  | ····method_start, | 
| 70  | ····method, | 71  | ····method, | 
| 71  | ····uri, | 72  | ····uri, | 
| 72  | ····http_version_h, | 73  | ····http_version_h, | 
| 73  | ····http_version_t_1, | 74  | ····http_version_t_1, | 
| 74  | ····http_version_t_2, | 75  | ····http_version_t_2, | 
| 75  | ····http_version_p, | 76  | ····http_version_p, | 
| 76  | ····http_version_slash, | 77  | ····http_version_slash, | 
| 77  | ····http_version_major_start, | 78  | ····http_version_major_start, | 
| 78  | ····http_version_major, | 79  | ····http_version_major, | 
| 79  | ····http_version_minor_start, | 80  | ····http_version_minor_start, | 
| 80  | ····http_version_minor, | 81  | ····http_version_minor, | 
| 81  | ····expecting_newline_1, | 82  | ····expecting_newline_1, | 
| 82  | ····header_line_start, | 83  | ····header_line_start, | 
| 83  | ····header_lws, | 84  | ····header_lws, | 
| 84  | ····header_name, | 85  | ····header_name, | 
| 85  | ····space_before_header_value, | 86  | ····space_before_header_value, | 
| 86  | ····header_value, | 87  | ····header_value, | 
| 87  | ····expecting_newline_2, | 88  | ····expecting_newline_2, | 
| 88  | ····expecting_newline_3 | 89  | ····expecting_newline_3 | 
| 89  | ··}·state_; | 90  | ··}·state_; | 
| 90  | }; | 91  | }; | 
| 91  |  | 92  |  | 
| 92  | }·//·namespace·server | 93  | }·//·namespace·server | 
| 93  | }·//·namespace·http | 94  | }·//·namespace·http | 
| 94  |  | 95  |  | 
| 95  | #endif·//·HTTP_REQUEST_PARSER_HPP | 96  | #endif·//·HTTP_REQUEST_PARSER_HPP |