Line data Source code
1 : //
2 : // Copyright (c) 2021 Vinnie Falco (vinnie.falco@gmail.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/cppalliance/http_proto
8 : //
9 :
10 : #include <boost/http_proto/error.hpp>
11 : #include <boost/url/grammar/error.hpp>
12 : #include <boost/assert.hpp>
13 : #include <cstring>
14 :
15 : namespace boost {
16 : namespace http_proto {
17 :
18 : namespace detail {
19 :
20 : const char*
21 47 : error_cat_type::
22 : name() const noexcept
23 : {
24 47 : return "boost.http";
25 : }
26 :
27 : std::string
28 130 : error_cat_type::
29 : message(int code) const
30 : {
31 260 : return message(code, nullptr, 0);
32 : }
33 :
34 : char const*
35 130 : error_cat_type::
36 : message(
37 : int code,
38 : char*,
39 : std::size_t) const noexcept
40 : {
41 130 : switch(static_cast<error>(code))
42 : {
43 1 : case error::expect_100_continue: return "expect 100 continue";
44 1 : case error::end_of_message: return "end of message";
45 1 : case error::end_of_stream: return "end of stream";
46 1 : case error::in_place_overflow: return "in place overflow";
47 1 : case error::need_data: return "need data";
48 :
49 13 : case error::bad_connection: return "bad Connection";
50 1 : case error::bad_content_length: return "bad Content-Length";
51 1 : case error::bad_expect: return "bad Expect";
52 67 : case error::bad_field_name: return "bad field name";
53 3 : case error::bad_field_value: return "bad field value";
54 10 : case error::bad_field_smuggle: return "bad field smuggle";
55 1 : case error::bad_line_ending: return "bad line ending";
56 1 : case error::bad_list: return "bad list";
57 1 : case error::bad_method: return "bad method";
58 1 : case error::bad_number: return "bad number";
59 2 : case error::bad_payload: return "bad payload";
60 1 : case error::bad_version: return "bad version";
61 1 : case error::bad_reason: return "bad reason-phrase";
62 1 : case error::bad_request_target: return "bad request-target";
63 1 : case error::bad_status_code: return "bad status-code";
64 1 : case error::bad_status_line: return "bad status-line";
65 1 : case error::bad_transfer_encoding: return "bad Transfer-Encoding";
66 1 : case error::bad_upgrade: return "bad Upgrade";
67 :
68 1 : case error::body_too_large: return "body too large";
69 1 : case error::headers_limit: return "headers limit";
70 1 : case error::start_line_limit: return "start line limit";
71 1 : case error::field_size_limit: return "field size limit";
72 1 : case error::fields_limit: return "fields limit";
73 1 : case error::incomplete: return "incomplete";
74 :
75 1 : case error::numeric_overflow: return "numeric overflow";
76 1 : case error::multiple_content_length: return "multiple Content-Length";
77 1 : case error::buffer_overflow: return "buffer overflow";
78 8 : case error::unhandled_exception: return "unhandled exception";
79 0 : default:
80 0 : return "unknown";
81 : }
82 : }
83 :
84 : //-----------------------------------------------
85 :
86 : const char*
87 2 : condition_cat_type::
88 : name() const noexcept
89 : {
90 2 : return "boost.http";
91 : }
92 :
93 : std::string
94 2 : condition_cat_type::
95 : message(int code) const
96 : {
97 4 : return message(code, nullptr, 0);
98 : }
99 :
100 : char const*
101 2 : condition_cat_type::
102 : message(
103 : int code,
104 : char*,
105 : std::size_t) const noexcept
106 : {
107 2 : switch(static_cast<condition>(code))
108 : {
109 1 : default:
110 1 : case condition::need_more_input: return "need more input";
111 1 : case condition::invalid_payload: return "invalid body octets received";
112 : }
113 : }
114 :
115 : bool
116 86763 : condition_cat_type::
117 : equivalent(
118 : system::error_code const& ec,
119 : int code) const noexcept
120 : {
121 86763 : switch(static_cast<condition>(code))
122 : {
123 10 : case condition::invalid_payload:
124 10 : return (ec == error::bad_payload);
125 :
126 86753 : case condition::need_more_input:
127 160755 : if( ec == urls::grammar::error::need_more ||
128 160755 : ec == error::need_data )
129 71068 : return true;
130 15685 : break;
131 :
132 0 : default:
133 0 : break;
134 : }
135 : return
136 15685 : *this == ec.category() &&
137 15685 : ec.value() == code;
138 : }
139 :
140 : //-----------------------------------------------
141 :
142 : // msvc 14.0 has a bug that warns about inability
143 : // to use constexpr construction here, even though
144 : // there's no constexpr construction
145 : #if defined(_MSC_VER) && _MSC_VER <= 1900
146 : # pragma warning( push )
147 : # pragma warning( disable : 4592 )
148 : #endif
149 :
150 : #if defined(__cpp_constinit) && __cpp_constinit >= 201907L
151 : constinit error_cat_type error_cat;
152 : constinit condition_cat_type condition_cat;
153 : #else
154 : error_cat_type error_cat;
155 : condition_cat_type condition_cat;
156 : #endif
157 :
158 : #if defined(_MSC_VER) && _MSC_VER <= 1900
159 : # pragma warning( pop )
160 : #endif
161 :
162 : } // detail
163 :
164 : } // http_proto
165 : } // boost
|