10 #ifndef __PION_HTTPSERVER_HEADER__
11 #define __PION_HTTPSERVER_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/PionConfig.hpp>
22 #include <pion/net/TCPServer.hpp>
23 #include <pion/net/TCPConnection.hpp>
24 #include <pion/net/HTTPRequest.hpp>
25 #include <pion/net/HTTPAuth.hpp>
26 #include <pion/net/HTTPParser.hpp>
42 typedef boost::function2<void, HTTPRequestPtr&, TCPConnectionPtr&>
RequestHandler;
45 typedef boost::function3<void, HTTPRequestPtr&, TCPConnectionPtr&,
59 m_bad_request_handler(
HTTPServer::handleBadRequest),
60 m_not_found_handler(
HTTPServer::handleNotFoundRequest),
61 m_server_error_handler(
HTTPServer::handleServerError),
62 m_max_content_length(
HTTPParser::DEFAULT_CONTENT_MAX)
64 setLogger(PION_GET_LOGGER(
"pion.net.HTTPServer"));
72 explicit HTTPServer(
const boost::asio::ip::tcp::endpoint& endpoint)
74 m_bad_request_handler(
HTTPServer::handleBadRequest),
75 m_not_found_handler(
HTTPServer::handleNotFoundRequest),
76 m_server_error_handler(
HTTPServer::handleServerError),
77 m_max_content_length(
HTTPParser::DEFAULT_CONTENT_MAX)
79 setLogger(PION_GET_LOGGER(
"pion.net.HTTPServer"));
90 m_bad_request_handler(
HTTPServer::handleBadRequest),
91 m_not_found_handler(
HTTPServer::handleNotFoundRequest),
92 m_server_error_handler(
HTTPServer::handleServerError),
93 m_max_content_length(
HTTPParser::DEFAULT_CONTENT_MAX)
95 setLogger(PION_GET_LOGGER(
"pion.net.HTTPServer"));
106 m_bad_request_handler(
HTTPServer::handleBadRequest),
107 m_not_found_handler(
HTTPServer::handleNotFoundRequest),
108 m_server_error_handler(
HTTPServer::handleServerError),
109 m_max_content_length(
HTTPParser::DEFAULT_CONTENT_MAX)
111 setLogger(PION_GET_LOGGER(
"pion.net.HTTPServer"));
120 void addResource(
const std::string& resource, RequestHandler request_handler);
127 void removeResource(
const std::string& resource);
135 void addRedirect(
const std::string& requested_resource,
const std::string& new_resource);
148 if (isListening()) stop();
149 boost::mutex::scoped_lock resource_lock(m_resource_mutex);
160 std::string result(str);
161 if (!result.empty() && result[result.size()-1]==
'/')
162 result.resize(result.size() - 1);
172 static void handleBadRequest(HTTPRequestPtr& http_request,
173 TCPConnectionPtr& tcp_conn);
181 static void handleNotFoundRequest(HTTPRequestPtr& http_request,
182 TCPConnectionPtr& tcp_conn);
191 static void handleServerError(HTTPRequestPtr& http_request,
192 TCPConnectionPtr& tcp_conn,
193 const std::string& error_msg);
202 static void handleForbiddenRequest(HTTPRequestPtr& http_request,
203 TCPConnectionPtr& tcp_conn,
204 const std::string& error_msg);
213 static void handleMethodNotAllowed(HTTPRequestPtr& http_request,
214 TCPConnectionPtr& tcp_conn,
215 const std::string& allowed_methods =
"");
232 virtual void handleConnection(TCPConnectionPtr& tcp_conn);
241 virtual void handleRequest(HTTPRequestPtr& http_request,
242 TCPConnectionPtr& tcp_conn,
const boost::system::error_code& ec);
250 virtual bool findRequestHandler(
const std::string& resource,
251 RequestHandler& request_handler)
const;
257 static const unsigned int MAX_REDIRECTS;
260 typedef std::map<std::string, RequestHandler> ResourceMap;
263 typedef std::map<std::string, std::string> RedirectMap;
267 ResourceMap m_resources;
270 RedirectMap m_redirects;
273 RequestHandler m_bad_request_handler;
276 RequestHandler m_not_found_handler;
279 ServerErrorHandler m_server_error_handler;
282 mutable boost::mutex m_resource_mutex;
288 std::size_t m_max_content_length;
293 typedef boost::shared_ptr<HTTPServer> HTTPServerPtr;
HTTPServer(PionScheduler &scheduler, const unsigned int tcp_port=0)
HTTPServer(const unsigned int tcp_port=0)
void setBadRequestHandler(RequestHandler h)
sets the function that handles bad HTTP requests
static std::string stripTrailingSlash(const std::string &str)
boost::function3< void, HTTPRequestPtr &, TCPConnectionPtr &, const std::string & > ServerErrorHandler
handler for requests that result in "500 Server Error"
HTTPServer(PionScheduler &scheduler, const boost::asio::ip::tcp::endpoint &endpoint)
boost::function2< void, HTTPRequestPtr &, TCPConnectionPtr & > RequestHandler
type of function that is used to handle requests
virtual void clear(void)
clears the collection of resources recognized by the HTTP server
void setAuthentication(HTTPAuthPtr auth)
void setMaxContentLength(std::size_t n)
sets the maximum length for HTTP request payload content
void setNotFoundHandler(RequestHandler h)
sets the function that handles requests which match no other web services
HTTPServer(const boost::asio::ip::tcp::endpoint &endpoint)
void setServerErrorHandler(ServerErrorHandler h)
sets the function that handles requests which match no other web services
virtual ~HTTPServer()
default destructor