]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/asio/example/cpp11/http/server/reply.cpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / libs / asio / example / cpp11 / http / server / reply.cpp
1 //
2 // reply.cpp
3 // ~~~~~~~~~
4 //
5 // Copyright (c) 2003-2017 Christopher M. Kohlhoff (chris at kohlhoff dot com)
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 #include "reply.hpp"
12 #include <string>
13
14 namespace http {
15 namespace server {
16
17 namespace status_strings {
18
19 const std::string ok =
20 "HTTP/1.0 200 OK\r\n";
21 const std::string created =
22 "HTTP/1.0 201 Created\r\n";
23 const std::string accepted =
24 "HTTP/1.0 202 Accepted\r\n";
25 const std::string no_content =
26 "HTTP/1.0 204 No Content\r\n";
27 const std::string multiple_choices =
28 "HTTP/1.0 300 Multiple Choices\r\n";
29 const std::string moved_permanently =
30 "HTTP/1.0 301 Moved Permanently\r\n";
31 const std::string moved_temporarily =
32 "HTTP/1.0 302 Moved Temporarily\r\n";
33 const std::string not_modified =
34 "HTTP/1.0 304 Not Modified\r\n";
35 const std::string bad_request =
36 "HTTP/1.0 400 Bad Request\r\n";
37 const std::string unauthorized =
38 "HTTP/1.0 401 Unauthorized\r\n";
39 const std::string forbidden =
40 "HTTP/1.0 403 Forbidden\r\n";
41 const std::string not_found =
42 "HTTP/1.0 404 Not Found\r\n";
43 const std::string internal_server_error =
44 "HTTP/1.0 500 Internal Server Error\r\n";
45 const std::string not_implemented =
46 "HTTP/1.0 501 Not Implemented\r\n";
47 const std::string bad_gateway =
48 "HTTP/1.0 502 Bad Gateway\r\n";
49 const std::string service_unavailable =
50 "HTTP/1.0 503 Service Unavailable\r\n";
51
52 boost::asio::const_buffer to_buffer(reply::status_type status)
53 {
54 switch (status)
55 {
56 case reply::ok:
57 return boost::asio::buffer(ok);
58 case reply::created:
59 return boost::asio::buffer(created);
60 case reply::accepted:
61 return boost::asio::buffer(accepted);
62 case reply::no_content:
63 return boost::asio::buffer(no_content);
64 case reply::multiple_choices:
65 return boost::asio::buffer(multiple_choices);
66 case reply::moved_permanently:
67 return boost::asio::buffer(moved_permanently);
68 case reply::moved_temporarily:
69 return boost::asio::buffer(moved_temporarily);
70 case reply::not_modified:
71 return boost::asio::buffer(not_modified);
72 case reply::bad_request:
73 return boost::asio::buffer(bad_request);
74 case reply::unauthorized:
75 return boost::asio::buffer(unauthorized);
76 case reply::forbidden:
77 return boost::asio::buffer(forbidden);
78 case reply::not_found:
79 return boost::asio::buffer(not_found);
80 case reply::internal_server_error:
81 return boost::asio::buffer(internal_server_error);
82 case reply::not_implemented:
83 return boost::asio::buffer(not_implemented);
84 case reply::bad_gateway:
85 return boost::asio::buffer(bad_gateway);
86 case reply::service_unavailable:
87 return boost::asio::buffer(service_unavailable);
88 default:
89 return boost::asio::buffer(internal_server_error);
90 }
91 }
92
93 } // namespace status_strings
94
95 namespace misc_strings {
96
97 const char name_value_separator[] = { ':', ' ' };
98 const char crlf[] = { '\r', '\n' };
99
100 } // namespace misc_strings
101
102 std::vector<boost::asio::const_buffer> reply::to_buffers()
103 {
104 std::vector<boost::asio::const_buffer> buffers;
105 buffers.push_back(status_strings::to_buffer(status));
106 for (std::size_t i = 0; i < headers.size(); ++i)
107 {
108 header& h = headers[i];
109 buffers.push_back(boost::asio::buffer(h.name));
110 buffers.push_back(boost::asio::buffer(misc_strings::name_value_separator));
111 buffers.push_back(boost::asio::buffer(h.value));
112 buffers.push_back(boost::asio::buffer(misc_strings::crlf));
113 }
114 buffers.push_back(boost::asio::buffer(misc_strings::crlf));
115 buffers.push_back(boost::asio::buffer(content));
116 return buffers;
117 }
118
119 namespace stock_replies {
120
121 const char ok[] = "";
122 const char created[] =
123 "<html>"
124 "<head><title>Created</title></head>"
125 "<body><h1>201 Created</h1></body>"
126 "</html>";
127 const char accepted[] =
128 "<html>"
129 "<head><title>Accepted</title></head>"
130 "<body><h1>202 Accepted</h1></body>"
131 "</html>";
132 const char no_content[] =
133 "<html>"
134 "<head><title>No Content</title></head>"
135 "<body><h1>204 Content</h1></body>"
136 "</html>";
137 const char multiple_choices[] =
138 "<html>"
139 "<head><title>Multiple Choices</title></head>"
140 "<body><h1>300 Multiple Choices</h1></body>"
141 "</html>";
142 const char moved_permanently[] =
143 "<html>"
144 "<head><title>Moved Permanently</title></head>"
145 "<body><h1>301 Moved Permanently</h1></body>"
146 "</html>";
147 const char moved_temporarily[] =
148 "<html>"
149 "<head><title>Moved Temporarily</title></head>"
150 "<body><h1>302 Moved Temporarily</h1></body>"
151 "</html>";
152 const char not_modified[] =
153 "<html>"
154 "<head><title>Not Modified</title></head>"
155 "<body><h1>304 Not Modified</h1></body>"
156 "</html>";
157 const char bad_request[] =
158 "<html>"
159 "<head><title>Bad Request</title></head>"
160 "<body><h1>400 Bad Request</h1></body>"
161 "</html>";
162 const char unauthorized[] =
163 "<html>"
164 "<head><title>Unauthorized</title></head>"
165 "<body><h1>401 Unauthorized</h1></body>"
166 "</html>";
167 const char forbidden[] =
168 "<html>"
169 "<head><title>Forbidden</title></head>"
170 "<body><h1>403 Forbidden</h1></body>"
171 "</html>";
172 const char not_found[] =
173 "<html>"
174 "<head><title>Not Found</title></head>"
175 "<body><h1>404 Not Found</h1></body>"
176 "</html>";
177 const char internal_server_error[] =
178 "<html>"
179 "<head><title>Internal Server Error</title></head>"
180 "<body><h1>500 Internal Server Error</h1></body>"
181 "</html>";
182 const char not_implemented[] =
183 "<html>"
184 "<head><title>Not Implemented</title></head>"
185 "<body><h1>501 Not Implemented</h1></body>"
186 "</html>";
187 const char bad_gateway[] =
188 "<html>"
189 "<head><title>Bad Gateway</title></head>"
190 "<body><h1>502 Bad Gateway</h1></body>"
191 "</html>";
192 const char service_unavailable[] =
193 "<html>"
194 "<head><title>Service Unavailable</title></head>"
195 "<body><h1>503 Service Unavailable</h1></body>"
196 "</html>";
197
198 std::string to_string(reply::status_type status)
199 {
200 switch (status)
201 {
202 case reply::ok:
203 return ok;
204 case reply::created:
205 return created;
206 case reply::accepted:
207 return accepted;
208 case reply::no_content:
209 return no_content;
210 case reply::multiple_choices:
211 return multiple_choices;
212 case reply::moved_permanently:
213 return moved_permanently;
214 case reply::moved_temporarily:
215 return moved_temporarily;
216 case reply::not_modified:
217 return not_modified;
218 case reply::bad_request:
219 return bad_request;
220 case reply::unauthorized:
221 return unauthorized;
222 case reply::forbidden:
223 return forbidden;
224 case reply::not_found:
225 return not_found;
226 case reply::internal_server_error:
227 return internal_server_error;
228 case reply::not_implemented:
229 return not_implemented;
230 case reply::bad_gateway:
231 return bad_gateway;
232 case reply::service_unavailable:
233 return service_unavailable;
234 default:
235 return internal_server_error;
236 }
237 }
238
239 } // namespace stock_replies
240
241 reply reply::stock_reply(reply::status_type status)
242 {
243 reply rep;
244 rep.status = status;
245 rep.content = stock_replies::to_string(status);
246 rep.headers.resize(2);
247 rep.headers[0].name = "Content-Length";
248 rep.headers[0].value = std::to_string(rep.content.size());
249 rep.headers[1].name = "Content-Type";
250 rep.headers[1].value = "text/html";
251 return rep;
252 }
253
254 } // namespace server
255 } // namespace http