2 * This file is open source software, licensed to you under the terms
3 * of the Apache License, Version 2.0 (the "License"). See the NOTICE file
4 * distributed with this work for additional information regarding copyright
5 * ownership. You may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing,
12 * software distributed under the License is distributed on an
13 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 * KIND, either express or implied. See the License for the
15 * specific language governing permissions and limitations
19 * Copyright 2015 Cloudius Systems
22 // This file was modified from boost http example
27 // Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com)
29 // Distributed under the Boost Software License, Version 1.0. (See accompanying
30 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
34 #include <seastar/core/sstring.hh>
35 #include <unordered_map>
36 #include <seastar/http/mime_types.hh>
37 #include <seastar/core/iostream.hh>
38 #include <seastar/util/noncopyable_function.hh>
48 * A reply to be sent to a client.
52 * The status of the reply.
54 enum class status_type {
55 continue_ = 100, //!< continue
57 created = 201, //!< created
58 accepted = 202, //!< accepted
59 no_content = 204, //!< no_content
60 multiple_choices = 300, //!< multiple_choices
61 moved_permanently = 301, //!< moved_permanently
62 moved_temporarily = 302, //!< moved_temporarily
63 not_modified = 304, //!< not_modified
64 bad_request = 400, //!< bad_request
65 unauthorized = 401, //!< unauthorized
66 forbidden = 403, //!< forbidden
67 not_found = 404, //!< not_found
68 length_required = 411, //!< length_required
69 payload_too_large = 413, //!< payload_too_large
70 internal_server_error = 500, //!< internal_server_error
71 not_implemented = 501, //!< not_implemented
72 bad_gateway = 502, //!< bad_gateway
73 service_unavailable = 503 //!< service_unavailable
77 * The headers to be included in the reply.
79 std::unordered_map<sstring, sstring> _headers;
83 * The content to be sent in the reply.
87 sstring _response_line;
89 : _status(status_type::ok) {
92 reply& add_header(const sstring& h, const sstring& value) {
97 reply& set_version(const sstring& version) {
102 reply& set_status(status_type status, const sstring& content = "") {
111 * Set the content type mime type.
112 * Used when the mime type is known.
113 * For most cases, use the set_content_type
115 reply& set_mime_type(const sstring& mime) {
116 _headers["Content-Type"] = mime;
121 * Set the content type mime type according to the file extension
122 * that would have been used if it was a file: e.g. html, txt, json etc'
124 reply& set_content_type(const sstring& content_type = "html") {
125 set_mime_type(httpd::mime_types::extension_to_type(content_type));
129 reply& done(const sstring& content_type) {
130 return set_content_type(content_type).done();
133 * Done should be called before using the reply.
134 * It would set the response line
137 _response_line = response_line();
140 sstring response_line();
143 * \brief use an output stream to write the message body
145 * When a handler needs to use an output stream it should call this method
148 * \param content_type - is used to choose the content type of the body. Use the file extension
149 * you would have used for such a content, (i.e. "txt", "html", "json", etc')
150 * \param body_writer - a function that accept an output stream and use that stream to write the body.
151 * The function should take ownership of the stream while using it and must close the stream when it
154 * Message would use chunked transfer encoding in the reply.
158 void write_body(const sstring& content_type, noncopyable_function<future<>(output_stream<char>&&)>&& body_writer);
161 * \brief Write a string as the reply
163 * \param content_type - is used to choose the content type of the body. Use the file extension
164 * you would have used for such a content, (i.e. "txt", "html", "json", etc')
165 * \param content - the message content.
166 * This would set the the content and content type of the message along
167 * with any additional information that is needed to send the message.
169 void write_body(const sstring& content_type, const sstring& content);
172 future<> write_reply_to_connection(connection& con);
173 future<> write_reply_headers(connection& connection);
175 noncopyable_function<future<>(output_stream<char>&&)> _body_writer;
177 friend class connection;