1 // 2 // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com) 3 // 4 // Distributed under the Boost Software License, Version 1.0. (See accompanying 5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6 // 7 // Official repository: https://github.com/boostorg/beast 8 // 9 10 #ifndef BOOST_BEAST_HTTP_DETAIL_BASIC_PARSER_HPP 11 #define BOOST_BEAST_HTTP_DETAIL_BASIC_PARSER_HPP 12 13 #include <boost/beast/core/string.hpp> 14 #include <boost/beast/core/detail/char_buffer.hpp> 15 #include <boost/beast/http/error.hpp> 16 #include <boost/beast/http/detail/rfc7230.hpp> 17 #include <boost/config.hpp> 18 #include <boost/version.hpp> 19 #include <cstddef> 20 #include <utility> 21 22 namespace boost { 23 namespace beast { 24 namespace http { 25 namespace detail { 26 27 struct basic_parser_base 28 { 29 // limit on the size of the obs-fold buffer 30 // 31 // https://stackoverflow.com/questions/686217/maximum-on-http-header-values 32 // 33 static std::size_t constexpr max_obs_fold = 4096; 34 35 enum class state 36 { 37 nothing_yet = 0, 38 start_line, 39 fields, 40 body0, 41 body, 42 body_to_eof0, 43 body_to_eof, 44 chunk_header0, 45 chunk_header, 46 chunk_body, 47 complete 48 }; 49 50 static 51 bool is_digitboost::beast::http::detail::basic_parser_base52 is_digit(char c) 53 { 54 return static_cast<unsigned char>(c-'0') < 10; 55 } 56 57 static 58 bool is_printboost::beast::http::detail::basic_parser_base59 is_print(char c) 60 { 61 return static_cast<unsigned char>(c-32) < 95; 62 } 63 64 BOOST_BEAST_DECL 65 static 66 char const* 67 trim_front(char const* it, char const* end); 68 69 BOOST_BEAST_DECL 70 static 71 char const* 72 trim_back( 73 char const* it, char const* first); 74 75 static 76 string_view make_stringboost::beast::http::detail::basic_parser_base77 make_string(char const* first, char const* last) 78 { 79 return {first, static_cast< 80 std::size_t>(last - first)}; 81 } 82 83 //-------------------------------------------------------------------------- 84 85 BOOST_BEAST_DECL 86 static 87 bool 88 is_pathchar(char c); 89 90 BOOST_BEAST_DECL 91 static 92 bool 93 unhex(unsigned char& d, char c); 94 95 BOOST_BEAST_DECL 96 static 97 std::pair<char const*, bool> 98 find_fast( 99 char const* buf, 100 char const* buf_end, 101 char const* ranges, 102 size_t ranges_size); 103 104 BOOST_BEAST_DECL 105 static 106 char const* 107 find_eol( 108 char const* it, char const* last, 109 error_code& ec); 110 111 BOOST_BEAST_DECL 112 static 113 char const* 114 find_eom(char const* p, char const* last); 115 116 //-------------------------------------------------------------------------- 117 118 BOOST_BEAST_DECL 119 static 120 char const* 121 parse_token_to_eol( 122 char const* p, 123 char const* last, 124 char const*& token_last, 125 error_code& ec); 126 127 BOOST_BEAST_DECL 128 static 129 bool 130 parse_dec(string_view s, std::uint64_t& v); 131 132 BOOST_BEAST_DECL 133 static 134 bool 135 parse_hex(char const*& it, std::uint64_t& v); 136 137 BOOST_BEAST_DECL 138 static 139 bool 140 parse_crlf(char const*& it); 141 142 BOOST_BEAST_DECL 143 static 144 void 145 parse_method( 146 char const*& it, char const* last, 147 string_view& result, error_code& ec); 148 149 BOOST_BEAST_DECL 150 static 151 void 152 parse_target( 153 char const*& it, char const* last, 154 string_view& result, error_code& ec); 155 156 BOOST_BEAST_DECL 157 static 158 void 159 parse_version( 160 char const*& it, char const* last, 161 int& result, error_code& ec); 162 163 BOOST_BEAST_DECL 164 static 165 void 166 parse_status( 167 char const*& it, char const* last, 168 unsigned short& result, error_code& ec); 169 170 BOOST_BEAST_DECL 171 static 172 void 173 parse_reason( 174 char const*& it, char const* last, 175 string_view& result, error_code& ec); 176 177 BOOST_BEAST_DECL 178 static 179 void 180 parse_field( 181 char const*& p, 182 char const* last, 183 string_view& name, 184 string_view& value, 185 beast::detail::char_buffer<max_obs_fold>& buf, 186 error_code& ec); 187 188 BOOST_BEAST_DECL 189 static 190 void 191 parse_chunk_extensions( 192 char const*& it, 193 char const* last, 194 error_code& ec); 195 }; 196 197 } // detail 198 } // http 199 } // beast 200 } // boost 201 202 #ifdef BOOST_BEAST_HEADER_ONLY 203 #include <boost/beast/http/detail/basic_parser.ipp> 204 #endif 205 206 #endif 207