]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/asio/example/cpp03/http/server/request_parser.hpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / libs / asio / example / cpp03 / http / server / request_parser.hpp
CommitLineData
7c673cae
FG
1//
2// request_parser.hpp
3// ~~~~~~~~~~~~~~~~~~
4//
92f5a8d4 5// Copyright (c) 2003-2019 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 <boost/logic/tribool.hpp>
15#include <boost/tuple/tuple.hpp>
16
17namespace http {
18namespace server {
19
20struct request;
21
22/// Parser for incoming requests.
23class request_parser
24{
25public:
26 /// Construct ready to parse the request method.
27 request_parser();
28
29 /// Reset to initial parser state.
30 void reset();
31
32 /// Parse some data. The tribool return value is true when a complete request
33 /// has been parsed, false if the data is invalid, indeterminate when more
34 /// data is required. The InputIterator return value indicates how much of the
35 /// input has been consumed.
36 template <typename InputIterator>
37 boost::tuple<boost::tribool, InputIterator> parse(request& req,
38 InputIterator begin, InputIterator end)
39 {
40 while (begin != end)
41 {
42 boost::tribool result = consume(req, *begin++);
43 if (result || !result)
44 return boost::make_tuple(result, begin);
45 }
46 boost::tribool result = boost::indeterminate;
47 return boost::make_tuple(result, begin);
48 }
49
50private:
51 /// Handle the next character of input.
52 boost::tribool consume(request& req, char input);
53
54 /// Check if a byte is an HTTP character.
55 static bool is_char(int c);
56
57 /// Check if a byte is an HTTP control character.
58 static bool is_ctl(int c);
59
60 /// Check if a byte is defined as an HTTP tspecial character.
61 static bool is_tspecial(int c);
62
63 /// Check if a byte is a digit.
64 static bool is_digit(int c);
65
66 /// The current state of the parser.
67 enum state
68 {
69 method_start,
70 method,
71 uri,
72 http_version_h,
73 http_version_t_1,
74 http_version_t_2,
75 http_version_p,
76 http_version_slash,
77 http_version_major_start,
78 http_version_major,
79 http_version_minor_start,
80 http_version_minor,
81 expecting_newline_1,
82 header_line_start,
83 header_lws,
84 header_name,
85 space_before_header_value,
86 header_value,
87 expecting_newline_2,
88 expecting_newline_3
89 } state_;
90};
91
92} // namespace server
93} // namespace http
94
95#endif // HTTP_REQUEST_PARSER_HPP