diff options
-rw-r--r-- | src/modules/httpclient.h | 10 | ||||
-rw-r--r-- | src/modules/m_http_client.cpp | 17 | ||||
-rw-r--r-- | src/modules/m_httpd.cpp | 64 |
3 files changed, 52 insertions, 39 deletions
diff --git a/src/modules/httpclient.h b/src/modules/httpclient.h index 181c58b6b..045e8db8a 100644 --- a/src/modules/httpclient.h +++ b/src/modules/httpclient.h @@ -29,6 +29,10 @@ class HTTPClientRequest : public Request Headers["Accept"] = "*/*"; } + HTTPClientRequest() : Request(NULL, NULL, HTTP_CLIENT_REQUEST) + { + } + const std::string &GetURL() { return url; @@ -65,7 +69,11 @@ class HTTPClientResponse : public Request : Request(src, target, HTTP_CLIENT_RESPONSE), url(url), response(response), responsestr(responsestr) { } - + + HTTPClientResponse() : Request(NULL, NULL, HTTP_CLIENT_RESPONSE) + { + } + void SetData(const std::string &ndata) { data = ndata; diff --git a/src/modules/m_http_client.cpp b/src/modules/m_http_client.cpp index 9004b202b..9fdd75b14 100644 --- a/src/modules/m_http_client.cpp +++ b/src/modules/m_http_client.cpp @@ -34,7 +34,7 @@ class HTTPSocket : public InspSocket private: InspIRCd *Server; class ModuleHTTPClient *Mod; - HTTPClientRequest *req; + HTTPClientRequest req; HTTPClientResponse *response; URL url; enum { HTTP_CLOSED, HTTP_REQSENT, HTTP_HEADERS, HTTP_DATA } status; @@ -134,9 +134,14 @@ HTTPSocket::~HTTPSocket() bool HTTPSocket::DoRequest(HTTPClientRequest *req) { - this->req = req; - - if (!ParseURL(req->GetURL())) + /* Tweak by brain - we take a copy of this, + * so that the caller doesnt need to leave + * pointers knocking around, less chance of + * a memory leak. + */ + this->req = *req; + + if (!ParseURL(this->req.GetURL())) return false; this->port = url.port; @@ -234,7 +239,7 @@ bool HTTPSocket::OnConnected() std::string request = "GET " + url.request + " HTTP/1.1\r\n"; // Dump headers into the request - HeaderMap headers = req->GetHeaders(); + HeaderMap headers = req.GetHeaders(); for (HeaderMap::iterator i = headers.begin(); i != headers.end(); i++) request += i->first + ": " + i->second + "\r\n"; @@ -280,7 +285,7 @@ bool HTTPSocket::OnDataReady() { // HTTP reply (HTTP/1.1 200 msg) data += 9; - response = new HTTPClientResponse((Module*)Mod, req->GetSource() , url.url, atoi(data), data + 4); + response = new HTTPClientResponse((Module*)Mod, req.GetSource() , url.url, atoi(data), data + 4); this->status = HTTP_HEADERS; continue; } diff --git a/src/modules/m_httpd.cpp b/src/modules/m_httpd.cpp index 2606f77ad..dc1785af5 100644 --- a/src/modules/m_httpd.cpp +++ b/src/modules/m_httpd.cpp @@ -18,9 +18,9 @@ /* $ModDesc: Provides HTTP serving facilities to modules */ -class ModuleHttp; +class ModuleHttpServer; -static ModuleHttp* HttpModule; +static ModuleHttpServer* HttpModule; static bool claimed; /** HTTP socket states @@ -33,23 +33,23 @@ enum HttpState HTTP_SERVE_SEND_DATA = 3 }; -class HttpSocket; +class HttpServerSocket; /** This class is used to handle HTTP socket timeouts */ -class HTTPTimeout : public InspTimer +class HttpServerTimeout : public InspTimer { private: - /** HttpSocket we are attached to + /** HttpServerSocket we are attached to */ - HttpSocket* s; + HttpServerSocket* s; /** Socketengine the file descriptor is in */ SocketEngine* SE; public: - /** Attach timeout to HttpSocket + /** Attach timeout to HttpServerSocket */ - HTTPTimeout(HttpSocket* sock, SocketEngine* engine); + HttpServerTimeout(HttpServerSocket* sock, SocketEngine* engine); /** Handle timer tick */ void Tick(time_t TIME); @@ -57,7 +57,7 @@ class HTTPTimeout : public InspTimer /** A socket used for HTTP transport */ -class HttpSocket : public InspSocket +class HttpServerSocket : public InspSocket { FileReader* index; HttpState InternalState; @@ -67,21 +67,21 @@ class HttpSocket : public InspSocket std::string uri; std::string http_version; unsigned int postsize; - HTTPTimeout* Timeout; + HttpServerTimeout* Timeout; public: - HttpSocket(InspIRCd* SI, std::string host, int port, bool listening, unsigned long maxtime, FileReader* index_page) : InspSocket(SI, host, port, listening, maxtime), index(index_page), postsize(0) + HttpServerSocket(InspIRCd* SI, std::string host, int port, bool listening, unsigned long maxtime, FileReader* index_page) : InspSocket(SI, host, port, listening, maxtime), index(index_page), postsize(0) { - SI->Log(DEBUG,"HttpSocket constructor"); + SI->Log(DEBUG,"HttpServerSocket constructor"); InternalState = HTTP_LISTEN; Timeout = NULL; } - HttpSocket(InspIRCd* SI, int newfd, char* ip, FileReader* ind) : InspSocket(SI, newfd, ip), index(ind), postsize(0) + HttpServerSocket(InspIRCd* SI, int newfd, char* ip, FileReader* ind) : InspSocket(SI, newfd, ip), index(ind), postsize(0) { InternalState = HTTP_SERVE_WAIT_REQUEST; - Timeout = new HTTPTimeout(this, Instance->SE); + Timeout = new HttpServerTimeout(this, Instance->SE); Instance->Timers->AddTimer(Timeout); } @@ -90,7 +90,7 @@ class HttpSocket : public InspSocket return index; } - ~HttpSocket() + ~HttpServerSocket() { if (Timeout) { @@ -104,7 +104,7 @@ class HttpSocket : public InspSocket { if (InternalState == HTTP_LISTEN) { - HttpSocket* s = new HttpSocket(this->Instance, newsock, ip, index); + HttpServerSocket* s = new HttpServerSocket(this->Instance, newsock, ip, index); s = s; /* Stop GCC whining */ } return true; @@ -262,7 +262,7 @@ class HttpSocket : public InspSocket { InternalState = HTTP_SERVE_SEND_DATA; SendHeaders(0, 400, ""); - Timeout = new HTTPTimeout(this, Instance->SE); + Timeout = new HttpServerTimeout(this, Instance->SE); Instance->Timers->AddTimer(Timeout); } else @@ -329,7 +329,7 @@ class HttpSocket : public InspSocket } } } - Timeout = new HTTPTimeout(this, Instance->SE); + Timeout = new HttpServerTimeout(this, Instance->SE); Instance->Timers->AddTimer(Timeout); } @@ -341,20 +341,20 @@ class HttpSocket : public InspSocket } }; -HTTPTimeout::HTTPTimeout(HttpSocket* sock, SocketEngine* engine) : InspTimer(60, time(NULL)), s(sock), SE(engine) +HttpServerTimeout::HttpServerTimeout(HttpServerSocket* sock, SocketEngine* engine) : InspTimer(60, time(NULL)), s(sock), SE(engine) { } -void HTTPTimeout::Tick(time_t TIME) +void HttpServerTimeout::Tick(time_t TIME) { SE->DelFd(s); s->Close(); delete s; } -class ModuleHttp : public Module +class ModuleHttpServer : public Module { - std::vector<HttpSocket*> httpsocks; + std::vector<HttpServerSocket*> httpsocks; public: void ReadConfig() @@ -364,7 +364,7 @@ class ModuleHttp : public Module std::string bindip; std::string indexfile; FileReader* index; - HttpSocket* http; + HttpServerSocket* http; ConfigReader c(ServerInstance); httpsocks.clear(); @@ -376,12 +376,12 @@ class ModuleHttp : public Module port = c.ReadInteger("http", "port", i, true); indexfile = c.ReadValue("http", "index", i); index = new FileReader(ServerInstance, indexfile); - http = new HttpSocket(ServerInstance, bindip, port, true, 0, index); + http = new HttpServerSocket(ServerInstance, bindip, port, true, 0, index); httpsocks.push_back(http); } } - ModuleHttp(InspIRCd* Me) : Module::Module(Me) + ModuleHttpServer(InspIRCd* Me) : Module::Module(Me) { ReadConfig(); } @@ -395,7 +395,7 @@ class ModuleHttp : public Module ServerInstance->Log(DEBUG,"Got HTTPDocument object"); claimed = true; HTTPDocument* doc = (HTTPDocument*)request->GetData(); - HttpSocket* sock = (HttpSocket*)doc->sock; + HttpServerSocket* sock = (HttpServerSocket*)doc->sock; sock->Page(doc->GetDocument(), doc->GetResponseCode(), doc->GetExtraHeaders()); return NULL; } @@ -405,7 +405,7 @@ class ModuleHttp : public Module List[I_OnEvent] = List[I_OnRequest] = 1; } - virtual ~ModuleHttp() + virtual ~ModuleHttpServer() { for (size_t i = 0; i < httpsocks.size(); i++) { @@ -422,20 +422,20 @@ class ModuleHttp : public Module }; -class ModuleHttpFactory : public ModuleFactory +class ModuleHttpServerFactory : public ModuleFactory { public: - ModuleHttpFactory() + ModuleHttpServerFactory() { } - ~ModuleHttpFactory() + ~ModuleHttpServerFactory() { } virtual Module * CreateModule(InspIRCd* Me) { - HttpModule = new ModuleHttp(Me); + HttpModule = new ModuleHttpServer(Me); return HttpModule; } }; @@ -443,5 +443,5 @@ class ModuleHttpFactory : public ModuleFactory extern "C" void * init_module( void ) { - return new ModuleHttpFactory; + return new ModuleHttpServerFactory; } |