X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_httpd.cpp;h=eaf6712671ccfb39b73f5996099d4255096aa1ea;hb=be609949e3ec2543d6cb16d23240870028732f36;hp=eba78b98bbc88e3f855997297d7e05a0c3ad3333;hpb=d185decae97752368d5cf62311cbc0d1a52aa22c;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_httpd.cpp b/src/modules/m_httpd.cpp index eba78b98b..eaf671267 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() { } @@ -180,7 +165,6 @@ class HttpServerSocket : public BufferedSocket SendHeaders(data.length(), response, empty); this->Write(data); - this->FlushWriteBuffer(); } void SendHeaders(unsigned long size, int response, HTTPHeaders &rheaders) @@ -266,7 +250,6 @@ class HttpServerSocket : public BufferedSocket if (request_type.empty() || uri.empty() || http_version.empty()) { SendHTTPError(400); - SetWrite(); return; } @@ -280,7 +263,6 @@ class HttpServerSocket : public BufferedSocket if ((fieldsep == std::string::npos) || (fieldsep == 0) || (fieldsep == cheader.length() - 1)) { SendHTTPError(400); - SetWrite(); return; } @@ -297,7 +279,6 @@ class HttpServerSocket : public BufferedSocket if ((http_version != "HTTP/1.1") && (http_version != "HTTP/1.0")) { SendHTTPError(505); - SetWrite(); return; } @@ -334,8 +315,6 @@ class HttpServerSocket : public BufferedSocket HTTPHeaders empty; SendHeaders(index->ContentSize(), 200, empty); this->Write(index->Contents()); - this->FlushWriteBuffer(); - SetWrite(); } else { @@ -350,38 +329,40 @@ class HttpServerSocket : public BufferedSocket if (!claimed) { SendHTTPError(404); - SetWrite(); } } } } - - bool OnWriteReady() - { - Instance->Logs->Log("m_httpd",DEBUG,"OnWriteReady()"); - return false; - } - void Page(std::stringstream* n, int response, HTTPHeaders *hheaders) { SendHeaders(n->str().length(), response, *hheaders); this->Write(n->str()); - this->FlushWriteBuffer(); - SetWrite(); + } +}; + +/** Spawn HTTP sockets from a listener + */ +class HttpListener : public ListenSocketBase +{ + FileReader* index; + + public: + HttpListener(InspIRCd* Instance, FileReader *idx, int port, const std::string &addr) : ListenSocketBase(Instance, port, addr) + { + this->index = idx; } - void SetWrite() + virtual void OnAcceptReady(const std::string &ipconnectedto, int nfd, const std::string &incomingip) { - Instance->Logs->Log("m_httpd",DEBUG,"SetWrite()"); - this->WaitingForWriteEvent = true; - Instance->SE->WantWrite(this); + new HttpServerSocket(ServerInstance, nfd, (char *)incomingip.c_str(), index); // ugly cast courtesy of bufferedsocket } }; class ModuleHttpServer : public Module { - std::vector httpsocks; + std::vector httpsocks; + std::vector httplisteners; public: void ReadConfig() @@ -391,10 +372,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 +387,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 +412,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]); @@ -441,7 +428,7 @@ class ModuleHttpServer : public Module virtual Version GetVersion() { - return Version(1,2,0,0,VF_VENDOR|VF_SERVICEPROVIDER,API_VERSION); + return Version("$Id$", VF_VENDOR | VF_SERVICEPROVIDER, API_VERSION); } };