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