diff options
-rw-r--r-- | include/modules/httpd.h | 56 | ||||
-rw-r--r-- | src/modules/m_httpd.cpp | 31 | ||||
-rw-r--r-- | src/modules/m_httpd_acl.cpp | 8 | ||||
-rw-r--r-- | src/modules/m_httpd_config.cpp | 9 | ||||
-rw-r--r-- | src/modules/m_httpd_stats.cpp | 7 |
5 files changed, 89 insertions, 22 deletions
diff --git a/include/modules/httpd.h b/include/modules/httpd.h index d1746e862..3d94b3f42 100644 --- a/include/modules/httpd.h +++ b/include/modules/httpd.h @@ -177,27 +177,63 @@ class HTTPRequest : public Event } }; -/** You must return a HTTPDocument to the httpd module by using the Request class. - * When you initialize this class you may initialize it with all components required to - * form a valid HTTP response, including document data, headers, and a response code. +/** If you want to reply to HTTP requests, you must return a HTTPDocumentResponse to + * the httpd module via the HTTPdAPI. + * When you initialize this class you initialize it with all components required to + * form a valid HTTP response: the document data and a response code. + * You can add additional HTTP headers, if you want. */ -class HTTPDocumentResponse : public Request +class HTTPDocumentResponse { + /** Module that generated this reply + */ + Module* const module; + public: std::stringstream* document; - int responsecode; + unsigned int responsecode; + + /** Any extra headers to include with the defaults + */ HTTPHeaders headers; + HTTPRequest& src; - /** Initialize a HTTPRequest ready for sending to m_httpd.so. - * @param opaque The socket pointer you obtained from the HTTPRequest at an earlier time + /** Initialize a HTTPDocumentResponse ready for sending to the httpd module. + * @param mod A pointer to the module who responded to the request + * @param req The request you obtained from the HTTPRequest at an earlier time * @param doc A stringstream containing the document body * @param response A valid HTTP/1.0 or HTTP/1.1 response code. The response text will be determined for you * based upon the response code. - * @param extra Any extra headers to include with the defaults, seperated by carriage return and linefeed. */ - HTTPDocumentResponse(Module* me, HTTPRequest& req, std::stringstream* doc, int response) - : Request(me, req.source, "HTTP-DOC"), document(doc), responsecode(response), src(req) + HTTPDocumentResponse(Module* mod, HTTPRequest& req, std::stringstream* doc, unsigned int response) + : module(mod), document(doc), responsecode(response), src(req) + { + } +}; + +class HTTPdAPIBase : public DataProvider +{ + public: + HTTPdAPIBase(Module* parent) + : DataProvider(parent, "m_httpd_api") + { + } + + /** Answer an incoming HTTP request with the provided document + * @param response The response created by your module that will be sent to the client + */ + virtual void SendResponse(HTTPDocumentResponse& response) = 0; +}; + +/** The API provided by the httpd module that allows other modules to respond to incoming + * HTTP requests + */ +class HTTPdAPI : public dynamic_reference<HTTPdAPIBase> +{ + public: + HTTPdAPI(Module* parent) + : dynamic_reference<HTTPdAPIBase>(parent, "m_httpd_api") { } }; diff --git a/src/modules/m_httpd.cpp b/src/modules/m_httpd.cpp index 9d437bd1c..7cbef13e2 100644 --- a/src/modules/m_httpd.cpp +++ b/src/modules/m_httpd.cpp @@ -331,24 +331,37 @@ class HttpServerSocket : public BufferedSocket } }; +class HTTPdAPIImpl : public HTTPdAPIBase +{ + public: + HTTPdAPIImpl(Module* parent) + : HTTPdAPIBase(parent) + { + } + + void SendResponse(HTTPDocumentResponse& resp) CXX11_OVERRIDE + { + claimed = true; + resp.src.sock->Page(resp.document, resp.responsecode, &resp.headers); + } +}; + class ModuleHttpServer : public Module { std::vector<HttpServerSocket *> httpsocks; + HTTPdAPIImpl APIImpl; public: - void init() CXX11_OVERRIDE + ModuleHttpServer() + : APIImpl(this) { - HttpModule = this; - ServerInstance->Modules->Attach(I_OnAcceptConnection, this); } - void OnRequest(Request& request) CXX11_OVERRIDE + void init() CXX11_OVERRIDE { - if (strcmp(request.id, "HTTP-DOC") != 0) - return; - HTTPDocumentResponse& resp = static_cast<HTTPDocumentResponse&>(request); - claimed = true; - resp.src.sock->Page(resp.document, resp.responsecode, &resp.headers); + HttpModule = this; + ServerInstance->Modules->AddService(APIImpl); + ServerInstance->Modules->Attach(I_OnAcceptConnection, this); } ModResult OnAcceptConnection(int nfd, ListenSocket* from, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server) CXX11_OVERRIDE diff --git a/src/modules/m_httpd_acl.cpp b/src/modules/m_httpd_acl.cpp index 061d56f25..676b35ca4 100644 --- a/src/modules/m_httpd_acl.cpp +++ b/src/modules/m_httpd_acl.cpp @@ -43,8 +43,14 @@ class ModuleHTTPAccessList : public Module { std::string stylesheet; std::vector<HTTPACL> acl_list; + HTTPdAPI API; public: + ModuleHTTPAccessList() + : API(this) + { + } + void OnRehash(User* user) { acl_list.clear(); @@ -105,7 +111,7 @@ class ModuleHTTPAccessList : public Module response.headers.SetHeader("X-Powered-By", "m_httpd_acl.so"); if (!extraheaderkey.empty()) response.headers.SetHeader(extraheaderkey, extraheaderval); - response.Send(); + API->SendResponse(response); } void OnEvent(Event& event) CXX11_OVERRIDE diff --git a/src/modules/m_httpd_config.cpp b/src/modules/m_httpd_config.cpp index a9fdd44fb..3396361d0 100644 --- a/src/modules/m_httpd_config.cpp +++ b/src/modules/m_httpd_config.cpp @@ -26,7 +26,14 @@ class ModuleHttpConfig : public Module { + HTTPdAPI API; + public: + ModuleHttpConfig() + : API(this) + { + } + void init() CXX11_OVERRIDE { Implementation eventlist[] = { I_OnEvent }; @@ -97,7 +104,7 @@ class ModuleHttpConfig : public Module HTTPDocumentResponse response(this, *http, &data, 200); response.headers.SetHeader("X-Powered-By", "m_httpd_config.so"); response.headers.SetHeader("Content-Type", "text/html"); - response.Send(); + API->SendResponse(response); } } } diff --git a/src/modules/m_httpd_stats.cpp b/src/modules/m_httpd_stats.cpp index 99909d97f..faf42d071 100644 --- a/src/modules/m_httpd_stats.cpp +++ b/src/modules/m_httpd_stats.cpp @@ -31,8 +31,13 @@ class ModuleHttpStats : public Module { static std::map<char, char const*> const &entities; + HTTPdAPI API; public: + ModuleHttpStats() + : API(this) + { + } void init() CXX11_OVERRIDE { @@ -233,7 +238,7 @@ class ModuleHttpStats : public Module HTTPDocumentResponse response(this, *http, &data, 200); response.headers.SetHeader("X-Powered-By", "m_httpd_stats.so"); response.headers.SetHeader("Content-Type", "text/xml"); - response.Send(); + API->SendResponse(response); } } } |