pion-net
4.0.9
|
00001 // ------------------------------------------------------------------ 00002 // pion-net: a C++ framework for building lightweight HTTP interfaces 00003 // ------------------------------------------------------------------ 00004 // Copyright (C) 2007-2008 Atomic Labs, Inc. (http://www.atomiclabs.com) 00005 // 00006 // Distributed under the Boost Software License, Version 1.0. 00007 // See http://www.boost.org/LICENSE_1_0.txt 00008 // 00009 00010 #ifndef __PION_WEBSERVER_HEADER__ 00011 #define __PION_WEBSERVER_HEADER__ 00012 00013 #include <string> 00014 #include <boost/asio.hpp> 00015 #include <boost/bind.hpp> 00016 #include <boost/shared_ptr.hpp> 00017 #include <pion/PionConfig.hpp> 00018 #include <pion/PionException.hpp> 00019 #include <pion/PionPlugin.hpp> 00020 #include <pion/PluginManager.hpp> 00021 #include <pion/net/HTTPServer.hpp> 00022 #include <pion/net/WebService.hpp> 00023 00024 00025 namespace pion { // begin namespace pion 00026 namespace net { // begin namespace net (Pion Network Library) 00027 00031 class PION_NET_API WebServer : 00032 public HTTPServer 00033 { 00034 00035 public: 00036 00038 class ServiceNotFoundException : public PionException { 00039 public: 00040 ServiceNotFoundException(const std::string& resource) 00041 : PionException("No web services are identified by the resource: ", resource) {} 00042 }; 00043 00045 class ConfigNotFoundException : public PionException { 00046 public: 00047 ConfigNotFoundException(const std::string& file) 00048 : PionException("Web service configuration file not found: ", file) {} 00049 }; 00050 00052 class ConfigParsingException : public PionException { 00053 public: 00054 ConfigParsingException(const std::string& file) 00055 : PionException("Unable to parse configuration file: ", file) {} 00056 }; 00057 00059 class AuthConfigException : public PionException { 00060 public: 00061 AuthConfigException(const std::string& error_msg) 00062 : PionException("Error in web server authorization config: ", error_msg) {} 00063 }; 00064 00066 class WebServiceException : public PionException { 00067 public: 00068 WebServiceException(const std::string& resource, const std::string& file) 00069 : PionException(std::string("WebService (") + resource, 00070 std::string("): ") + file) 00071 {} 00072 }; 00073 00074 00076 virtual ~WebServer() { clear(); } 00077 00083 explicit WebServer(const unsigned int tcp_port = 0) 00084 : HTTPServer(tcp_port) 00085 { 00086 setLogger(PION_GET_LOGGER("pion.net.WebServer")); 00087 } 00088 00094 explicit WebServer(const boost::asio::ip::tcp::endpoint& endpoint) 00095 : HTTPServer(endpoint) 00096 { 00097 setLogger(PION_GET_LOGGER("pion.net.WebServer")); 00098 } 00099 00106 explicit WebServer(PionScheduler& scheduler, const unsigned int tcp_port = 0) 00107 : HTTPServer(scheduler, tcp_port) 00108 { 00109 setLogger(PION_GET_LOGGER("pion.net.WebServer")); 00110 } 00111 00118 WebServer(PionScheduler& scheduler, const boost::asio::ip::tcp::endpoint& endpoint) 00119 : HTTPServer(scheduler, endpoint) 00120 { 00121 setLogger(PION_GET_LOGGER("pion.net.WebServer")); 00122 } 00123 00130 void addService(const std::string& resource, WebService *service_ptr); 00131 00139 void loadService(const std::string& resource, const std::string& service_name); 00140 00148 void setServiceOption(const std::string& resource, 00149 const std::string& name, const std::string& value); 00150 00163 void loadServiceConfig(const std::string& config_name); 00164 00166 virtual void clear(void) { 00167 if (isListening()) stop(); 00168 m_services.clear(); 00169 HTTPServer::clear(); 00170 } 00171 00172 00173 protected: 00174 00176 virtual void beforeStarting(void) { 00177 // call the start() method for each web service associated with this server 00178 try { m_services.run(boost::bind(&WebService::start, _1)); } 00179 catch (std::exception& e) { 00180 // catch exceptions thrown by services since their exceptions may be free'd 00181 // from memory before they are caught 00182 throw WebServiceException("[Startup]", e.what()); 00183 } 00184 } 00185 00187 virtual void afterStopping(void) { 00188 // call the stop() method for each web service associated with this server 00189 try { m_services.run(boost::bind(&WebService::stop, _1)); } 00190 catch (std::exception& e) { 00191 // catch exceptions thrown by services since their exceptions may be free'd 00192 // from memory before they are caught 00193 throw WebServiceException("[Shutdown]", e.what()); 00194 } 00195 } 00196 00197 00198 private: 00199 00201 typedef PluginManager<WebService> WebServiceManager; 00202 00203 00205 WebServiceManager m_services; 00206 }; 00207 00208 00210 typedef boost::shared_ptr<WebServer> WebServerPtr; 00211 00212 00213 } // end namespace net 00214 } // end namespace pion 00215 00216 #endif