src/​examples/​cpp03/​http/​server/​request_parser.​hppsrc/​examples/​cpp11/​http/​server/​request_parser.​hpp
1 /​/​1 /​/​
2 /​/​·​request_parser.​hpp2 /​/​·​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·​accompanying7 /​/​·​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_H​PP11 #ifndef·​HTTP_REQUEST_PARSER_H​PP
12 #define·​HTTP_REQUEST_PARSER_H​PP12 #define·​HTTP_REQUEST_PARSER_H​PP
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_parser22 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·request31 ··​/​/​/​·Result·of·​parse.​
33 ··/​/​/​·has·been·parsed,​·false·if·the·data·is·invalid,​·​indeterminate·when·more32 ··​enum·result_type·{·good,​·bad,​·​indeterminate·};​
34 ··/​/​/​·data·is·required.​·The·InputIterator·return·value·indicates·how·much·of·the33
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(indetermin​ate,​·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·​state68 ··​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_st​art,​78 ····​http_version_major_st​art,​
78 ····​http_version_major,​79 ····​http_version_major,​
79 ····​http_version_minor_st​art,​80 ····​http_version_minor_st​art,​
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_v​alue,​86 ····​space_before_header_v​alue,​
86 ····​header_value,​87 ····​header_value,​
87 ····​expecting_newline_2,​88 ····​expecting_newline_2,​
88 ····​expecting_newline_389 ····​expecting_newline_3
89 ··​}·​state_;​90 ··​}·​state_;​
90 };​91 };​
91 92
92 }·​/​/​·​namespace·​server93 }·​/​/​·​namespace·​server
93 }·​/​/​·​namespace·​http94 }·​/​/​·​namespace·​http
94 95
95 #endif·​/​/​·​HTTP_REQUEST_PARSER_H​PP96 #endif·​/​/​·​HTTP_REQUEST_PARSER_H​PP