]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/asio/example/cpp11/http/server/request_parser.hpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / libs / asio / example / cpp11 / http / server / request_parser.hpp
CommitLineData
7c673cae
FG
1//
2// request_parser.hpp
3// ~~~~~~~~~~~~~~~~~~
4//
b32b8144 5// Copyright (c) 2003-2017 Christopher M. Kohlhoff (chris at kohlhoff dot com)
7c673cae
FG
6//
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)
9//
10
11#ifndef HTTP_REQUEST_PARSER_HPP
12#define HTTP_REQUEST_PARSER_HPP
13
14#include <tuple>
15
16namespace http {
17namespace server {
18
19struct request;
20
21/// Parser for incoming requests.
22class request_parser
23{
24public:
25 /// Construct ready to parse the request method.
26 request_parser();
27
28 /// Reset to initial parser state.
29 void reset();
30
31 /// Result of parse.
32 enum result_type { good, bad, indeterminate };
33
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.
38 template <typename InputIterator>
39 std::tuple<result_type, InputIterator> parse(request& req,
40 InputIterator begin, InputIterator end)
41 {
42 while (begin != end)
43 {
44 result_type result = consume(req, *begin++);
45 if (result == good || result == bad)
46 return std::make_tuple(result, begin);
47 }
48 return std::make_tuple(indeterminate, begin);
49 }
50
51private:
52 /// Handle the next character of input.
53 result_type consume(request& req, char input);
54
55 /// Check if a byte is an HTTP character.
56 static bool is_char(int c);
57
58 /// Check if a byte is an HTTP control character.
59 static bool is_ctl(int c);
60
61 /// Check if a byte is defined as an HTTP tspecial character.
62 static bool is_tspecial(int c);
63
64 /// Check if a byte is a digit.
65 static bool is_digit(int c);
66
67 /// The current state of the parser.
68 enum state
69 {
70 method_start,
71 method,
72 uri,
73 http_version_h,
74 http_version_t_1,
75 http_version_t_2,
76 http_version_p,
77 http_version_slash,
78 http_version_major_start,
79 http_version_major,
80 http_version_minor_start,
81 http_version_minor,
82 expecting_newline_1,
83 header_line_start,
84 header_lws,
85 header_name,
86 space_before_header_value,
87 header_value,
88 expecting_newline_2,
89 expecting_newline_3
90 } state_;
91};
92
93} // namespace server
94} // namespace http
95
96#endif // HTTP_REQUEST_PARSER_HPP