#ifndef HTTP_REQUEST_PARSER_HPP #define HTTP_REQUEST_PARSER_HPP #include #include struct HttpRequest; /// Parser for incoming requests. class HttpRequestParser { /// Handle the next character of input. boost::tribool consume(HttpRequest& req, char input); /// Check if a byte is an HTTP character. static bool is_char(int c); /// Check if a byte is an HTTP control character. static bool is_ctl(int c); /// Check if a byte is defined as an HTTP special character. static bool is_tspecial(int c); /// Check if a byte is a digit. static bool is_digit(int c); /// The current state of the parser. enum state { method_start, method, uri_start, uri, http_version_h, http_version_t_1, http_version_t_2, http_version_p, http_version_slash, http_version_major_start, http_version_major, http_version_minor_start, http_version_minor, expecting_newline_1, header_line_start, header_lws, header_name, space_before_header_value, header_value, expecting_newline_2, expecting_newline_3 } state_; public: /// Construct ready to parse the request method. HttpRequestParser(); /// Reset to initial parser state. void reset(); /// Parse some data. The tribool return value is true when a complete request /// has been parsed, false if the data is invalid, indeterminate when more /// data is required. The InputIterator return value indicates how much of the /// input has been consumed. //template boost::tribool parse(HttpRequest& req, char*, char*); }; #endif // HTTP_REQUEST_PARSER_HPP