| 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-2021·Christopher·M.·Kohlhoff·(chris·at·kohlhoff·dot·com) | 5 | //·Copyright·(c)·2003-2021·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 |