From 7aecf1d4ec07a5fc2768db76f826fbda9f9f3d8c Mon Sep 17 00:00:00 2001 From: w00t Date: Mon, 8 Sep 2008 19:23:19 +0000 Subject: Give httpd a custom listener class, specialised in creating HttpServerSockets. git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@10471 e03df62e-2008-0410-955e-edbf42e46eb7 --- src/modules/m_httpd.cpp | 56 +++++++++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 23 deletions(-) (limited to 'src/modules/m_httpd.cpp') diff --git a/src/modules/m_httpd.cpp b/src/modules/m_httpd.cpp index 209a71cb0..ec4aec43c 100644 --- a/src/modules/m_httpd.cpp +++ b/src/modules/m_httpd.cpp @@ -26,10 +26,9 @@ static bool claimed; */ enum HttpState { - HTTP_LISTEN = 0, - HTTP_SERVE_WAIT_REQUEST = 1, /* Waiting for a full request */ - HTTP_SERVE_RECV_POSTDATA = 2, /* Waiting to finish recieving POST data */ - HTTP_SERVE_SEND_DATA = 3 /* Sending response */ + HTTP_SERVE_WAIT_REQUEST = 0, /* Waiting for a full request */ + HTTP_SERVE_RECV_POSTDATA = 1, /* Waiting to finish recieving POST data */ + HTTP_SERVE_SEND_DATA = 2 /* Sending response */ }; /** A socket used for HTTP transport @@ -49,11 +48,6 @@ class HttpServerSocket : public BufferedSocket public: - HttpServerSocket(InspIRCd* SI, std::string shost, int iport, bool listening, unsigned long maxtime, FileReader* index_page) : BufferedSocket(SI, shost, iport, listening, maxtime), index(index_page), postsize(0) - { - InternalState = HTTP_LISTEN; - } - HttpServerSocket(InspIRCd* SI, int newfd, char* ip, FileReader* ind) : BufferedSocket(SI, newfd, ip), index(ind), postsize(0) { InternalState = HTTP_SERVE_WAIT_REQUEST; @@ -68,15 +62,6 @@ class HttpServerSocket : public BufferedSocket { } - virtual int OnIncomingConnection(int newsock, char* ip) - { - if (InternalState == HTTP_LISTEN) - { - new HttpServerSocket(this->Instance, newsock, ip, index); - } - return true; - } - virtual void OnClose() { } @@ -379,9 +364,28 @@ class HttpServerSocket : public BufferedSocket } }; +/** Spawn HTTP sockets from a listener + */ +class HttpListener : public ListenSocketBase +{ + FileReader* index; + + public: + HttpListener(InspIRCd* Instance, FileReader *idx, int port, char* addr) : ListenSocketBase(Instance, port, addr) + { + this->index = idx; + } + + virtual void OnAcceptReady(const std::string &ipconnectedto, int nfd, const std::string &incomingip) + { + new HttpServerSocket(ServerInstance, nfd, (char *)incomingip.c_str(), index); // XXX unsafe casts suck + } +}; + class ModuleHttpServer : public Module { - std::vector httpsocks; + std::vector httpsocks; + std::vector httplisteners; public: void ReadConfig() @@ -391,10 +395,11 @@ class ModuleHttpServer : public Module std::string bindip; std::string indexfile; FileReader* index; - HttpServerSocket* http; + HttpListener *http; ConfigReader c(ServerInstance); - httpsocks.clear(); + httpsocks.clear(); // XXX this will BREAK if this module is made rehashable + httplisteners.clear(); for (int i = 0; i < c.Enumerate("http"); i++) { @@ -405,8 +410,8 @@ class ModuleHttpServer : public Module index = new FileReader(ServerInstance, indexfile); if (!index->Exists()) throw ModuleException("Can't read index file: "+indexfile); - http = new HttpServerSocket(ServerInstance, bindip, port, true, 0, index); - httpsocks.push_back(http); + http = new HttpListener(ServerInstance, index, port, (char *)bindip.c_str()); // XXX this cast SUCKS. + httplisteners.push_back(http); } } @@ -430,6 +435,11 @@ class ModuleHttpServer : public Module virtual ~ModuleHttpServer() { + for (size_t i = 0; i < httplisteners.size(); i++) + { + delete httplisteners[i]; + } + for (size_t i = 0; i < httpsocks.size(); i++) { ServerInstance->SE->DelFd(httpsocks[i]); -- cgit v1.2.3