#include "http_connection.h" #include #include namespace qi = boost::spirit::qi; bool HTTP::Connection::parse_request(boost::asio::streambuf& buf) { std::string data(boost::asio::buffers_begin(buf.data()), boost::asio::buffers_end(buf.data())); typedef std::string::const_iterator Iterator; Iterator begin = data.begin(); Iterator end = data.end(); qi::rule word_p = +(qi::char_ - ' ' - '\r'); qi::rule urlchar_p = (qi::char_ - '%') | ('%' >> qi::uint_parser()); qi::rule path_p = *(+qi::lit('/') >> +(urlchar_p - '/' - '?' - ' ')) >> *qi::lit('/'); qi::rule()> pair_p = +(urlchar_p - '=') >> '=' >> +(urlchar_p - '&' - ' '); qi::rule()> args_p = '?' >> pair_p >> *('&' >> pair_p); qi::rule()> header_p = +(qi::char_ - ':') >> ": " >> +(qi::char_ - '\r'); qi::rule()> headers_p = *(header_p >> "\r\n"); return qi::parse(begin, end, // Method, path, args, version: word_p >> ' ' >> path_p >> -args_p >> ' ' >> word_p >> "\r\n" >> // Headers: headers_p >> // End of headers: "\r\n", // Store into: method, path, args, version, headers); }