10 #ifndef __PION_HTTP_SERVER_HEADER__ 11 #define __PION_HTTP_SERVER_HEADER__ 15 #include <boost/asio.hpp> 16 #include <boost/function.hpp> 17 #include <boost/function/function2.hpp> 18 #include <boost/function/function3.hpp> 19 #include <boost/shared_ptr.hpp> 20 #include <boost/thread/mutex.hpp> 21 #include <pion/config.hpp> 22 #include <pion/tcp/server.hpp> 23 #include <pion/tcp/connection.hpp> 24 #include <pion/http/request.hpp> 25 #include <pion/http/auth.hpp> 26 #include <pion/http/parser.hpp> 43 typedef boost::function2<void, const http::request_ptr&, const tcp::connection_ptr&>
request_handler_t;
46 typedef boost::function3<void,
const http::request_ptr&,
const tcp::connection_ptr&,
51 virtual ~server() {
if (is_listening()) stop(); }
58 explicit server(
const unsigned int tcp_port = 0)
60 m_bad_request_handler(
server::handle_bad_request),
61 m_not_found_handler(
server::handle_not_found_request),
62 m_server_error_handler(
server::handle_server_error),
63 m_max_content_length(http::
parser::DEFAULT_CONTENT_MAX)
65 set_logger(PION_GET_LOGGER(
"pion.http.server"));
73 explicit server(
const boost::asio::ip::tcp::endpoint& endpoint)
75 m_bad_request_handler(
server::handle_bad_request),
76 m_not_found_handler(
server::handle_not_found_request),
77 m_server_error_handler(
server::handle_server_error),
78 m_max_content_length(http::
parser::DEFAULT_CONTENT_MAX)
80 set_logger(PION_GET_LOGGER(
"pion.http.server"));
90 : tcp::
server(sched, tcp_port),
91 m_bad_request_handler(
server::handle_bad_request),
92 m_not_found_handler(
server::handle_not_found_request),
93 m_server_error_handler(
server::handle_server_error),
94 m_max_content_length(http::
parser::DEFAULT_CONTENT_MAX)
96 set_logger(PION_GET_LOGGER(
"pion.http.server"));
106 : tcp::
server(sched, endpoint),
107 m_bad_request_handler(
server::handle_bad_request),
108 m_not_found_handler(
server::handle_not_found_request),
109 m_server_error_handler(
server::handle_server_error),
110 m_max_content_length(http::
parser::DEFAULT_CONTENT_MAX)
112 set_logger(PION_GET_LOGGER(
"pion.http.server"));
121 void add_resource(
const std::string& resource, request_handler_t request_handler);
128 void remove_resource(
const std::string& resource);
136 void add_redirect(
const std::string& requested_resource,
const std::string& new_resource);
149 if (is_listening()) stop();
150 boost::mutex::scoped_lock resource_lock(m_resource_mutex);
161 std::string result(str);
162 if (!result.empty() && result[result.size()-1]==
'/')
163 result.resize(result.size() - 1);
173 static void handle_bad_request(
const http::request_ptr& http_request_ptr,
174 const tcp::connection_ptr& tcp_conn);
182 static void handle_not_found_request(
const http::request_ptr& http_request_ptr,
183 const tcp::connection_ptr& tcp_conn);
192 static void handle_server_error(
const http::request_ptr& http_request_ptr,
193 const tcp::connection_ptr& tcp_conn,
194 const std::string& error_msg);
203 static void handle_forbidden_request(
const http::request_ptr& http_request_ptr,
204 const tcp::connection_ptr& tcp_conn,
205 const std::string& error_msg);
214 static void handle_method_not_allowed(
const http::request_ptr& http_request_ptr,
215 const tcp::connection_ptr& tcp_conn,
216 const std::string& allowed_methods =
"");
233 virtual void handle_connection(
const tcp::connection_ptr& tcp_conn);
242 virtual void handle_request(
const http::request_ptr& http_request_ptr,
243 const tcp::connection_ptr& tcp_conn,
const boost::system::error_code& ec);
251 virtual bool find_request_handler(
const std::string& resource,
252 request_handler_t& request_handler)
const;
258 static const unsigned int MAX_REDIRECTS;
261 typedef std::map<std::string, request_handler_t> resource_map_t;
264 typedef std::map<std::string, std::string> redirect_map_t;
268 resource_map_t m_resources;
271 redirect_map_t m_redirects;
274 request_handler_t m_bad_request_handler;
277 request_handler_t m_not_found_handler;
280 error_handler_t m_server_error_handler;
283 mutable boost::mutex m_resource_mutex;
286 http::auth_ptr m_auth_ptr;
289 std::size_t m_max_content_length;
294 typedef boost::shared_ptr<server> server_ptr;
server(scheduler &sched, const unsigned int tcp_port=0)
boost::function3< void, const http::request_ptr &, const tcp::connection_ptr &, const std::string & > error_handler_t
handler for requests that result in "500 Server Error"
void set_error_handler(error_handler_t h)
sets the function that handles requests which match no other web services
void set_max_content_length(std::size_t n)
sets the maximum length for HTTP request payload content
server(scheduler &sched, const boost::asio::ip::tcp::endpoint &endpoint)
virtual ~server()
default destructor
void set_not_found_handler(request_handler_t h)
sets the function that handles requests which match no other web services
virtual void clear(void)
clears the collection of resources recognized by the HTTP server
static std::string strip_trailing_slash(const std::string &str)
boost::function2< void, const http::request_ptr &, const tcp::connection_ptr & > request_handler_t
type of function that is used to handle requests
server(const unsigned int tcp_port=0)
void set_bad_request_handler(request_handler_t h)
sets the function that handles bad HTTP requests
server(const boost::asio::ip::tcp::endpoint &endpoint)
void set_authentication(http::auth_ptr auth)