]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/asio/example/cpp11/http/server/reply.cpp
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / boost / libs / asio / example / cpp11 / http / server / reply.cpp
CommitLineData
7c673cae
FG
1//
2// reply.cpp
3// ~~~~~~~~~
4//
f67539c2 5// Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com)
7c673cae
FG
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
14namespace http {
15namespace server {
16
17namespace status_strings {
18
19const std::string ok =
20 "HTTP/1.0 200 OK\r\n";
21const std::string created =
22 "HTTP/1.0 201 Created\r\n";
23const std::string accepted =
24 "HTTP/1.0 202 Accepted\r\n";
25const std::string no_content =
26 "HTTP/1.0 204 No Content\r\n";
27const std::string multiple_choices =
28 "HTTP/1.0 300 Multiple Choices\r\n";
29const std::string moved_permanently =
30 "HTTP/1.0 301 Moved Permanently\r\n";
31const std::string moved_temporarily =
32 "HTTP/1.0 302 Moved Temporarily\r\n";
33const std::string not_modified =
34 "HTTP/1.0 304 Not Modified\r\n";
35const std::string bad_request =
36 "HTTP/1.0 400 Bad Request\r\n";
37const std::string unauthorized =
38 "HTTP/1.0 401 Unauthorized\r\n";
39const std::string forbidden =
40 "HTTP/1.0 403 Forbidden\r\n";
41const std::string not_found =
42 "HTTP/1.0 404 Not Found\r\n";
43const std::string internal_server_error =
44 "HTTP/1.0 500 Internal Server Error\r\n";
45const std::string not_implemented =
46 "HTTP/1.0 501 Not Implemented\r\n";
47const std::string bad_gateway =
48 "HTTP/1.0 502 Bad Gateway\r\n";
49const std::string service_unavailable =
50 "HTTP/1.0 503 Service Unavailable\r\n";
51
52boost::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
95namespace misc_strings {
96
97const char name_value_separator[] = { ':', ' ' };
98const char crlf[] = { '\r', '\n' };
99
100} // namespace misc_strings
101
102std::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
119namespace stock_replies {
120
121const char ok[] = "";
122const char created[] =
123 "<html>"
124 "<head><title>Created</title></head>"
125 "<body><h1>201 Created</h1></body>"
126 "</html>";
127const char accepted[] =
128 "<html>"
129 "<head><title>Accepted</title></head>"
130 "<body><h1>202 Accepted</h1></body>"
131 "</html>";
132const char no_content[] =
133 "<html>"
134 "<head><title>No Content</title></head>"
135 "<body><h1>204 Content</h1></body>"
136 "</html>";
137const char multiple_choices[] =
138 "<html>"
139 "<head><title>Multiple Choices</title></head>"
140 "<body><h1>300 Multiple Choices</h1></body>"
141 "</html>";
142const char moved_permanently[] =
143 "<html>"
144 "<head><title>Moved Permanently</title></head>"
145 "<body><h1>301 Moved Permanently</h1></body>"
146 "</html>";
147const char moved_temporarily[] =
148 "<html>"
149 "<head><title>Moved Temporarily</title></head>"
150 "<body><h1>302 Moved Temporarily</h1></body>"
151 "</html>";
152const char not_modified[] =
153 "<html>"
154 "<head><title>Not Modified</title></head>"
155 "<body><h1>304 Not Modified</h1></body>"
156 "</html>";
157const char bad_request[] =
158 "<html>"
159 "<head><title>Bad Request</title></head>"
160 "<body><h1>400 Bad Request</h1></body>"
161 "</html>";
162const char unauthorized[] =
163 "<html>"
164 "<head><title>Unauthorized</title></head>"
165 "<body><h1>401 Unauthorized</h1></body>"
166 "</html>";
167const char forbidden[] =
168 "<html>"
169 "<head><title>Forbidden</title></head>"
170 "<body><h1>403 Forbidden</h1></body>"
171 "</html>";
172const char not_found[] =
173 "<html>"
174 "<head><title>Not Found</title></head>"
175 "<body><h1>404 Not Found</h1></body>"
176 "</html>";
177const 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>";
182const char not_implemented[] =
183 "<html>"
184 "<head><title>Not Implemented</title></head>"
185 "<body><h1>501 Not Implemented</h1></body>"
186 "</html>";
187const char bad_gateway[] =
188 "<html>"
189 "<head><title>Bad Gateway</title></head>"
190 "<body><h1>502 Bad Gateway</h1></body>"
191 "</html>";
192const char service_unavailable[] =
193 "<html>"
194 "<head><title>Service Unavailable</title></head>"
195 "<body><h1>503 Service Unavailable</h1></body>"
196 "</html>";
197
198std::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
241reply 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