]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_httpd.cpp
Tidy up strlens which are not required
[user/henk/code/inspircd.git] / src / modules / m_httpd.cpp
index 301e77e1659b04b4519a6b1ab43877fd026ed7dc..189a80b8971788c203ea9a371f2f655dbb94fec2 100644 (file)
 
 using namespace std;
 
-#include <stdio.h>
-#include "users.h"
-#include "channels.h"
+#include <algorithm>
 #include "modules.h"
-#include "inspsocket.h"
 #include "inspircd.h"
 #include "httpd.h"
 
@@ -43,13 +40,23 @@ enum HttpState
 
 class HttpSocket;
 
+/** This class is used to handle HTTP socket timeouts
+ */
 class HTTPTimeout : public InspTimer
 {
  private:
+       /** HttpSocket we are attached to
+        */
        HttpSocket* s;
+       /** Socketengine the file descriptor is in
+        */
        SocketEngine* SE;
  public:
+       /** Attach timeout to HttpSocket
+        */
        HTTPTimeout(HttpSocket* sock, SocketEngine* engine);
+       /** Handle timer tick
+        */
        void Tick(time_t TIME);
 };
 
@@ -65,7 +72,6 @@ class HttpSocket : public InspSocket
        std::string uri;
        std::string http_version;
        unsigned int postsize;
-       unsigned int amount;
        HTTPTimeout* Timeout;
 
  public:
@@ -84,11 +90,19 @@ class HttpSocket : public InspSocket
                Instance->Timers->AddTimer(Timeout);
        }
 
+       FileReader* GetIndex()
+       {
+               return index;
+       }
+
        ~HttpSocket()
        {
-               if (Timeout)
-                       Instance->Timers->DelTimer(Timeout);
-               Timeout = NULL;
+               if (Instance->Time() < Timeout->GetTimer())
+               {
+                       if (Timeout)
+                               Instance->Timers->DelTimer(Timeout);
+                       Timeout = NULL;
+               }
        }
 
        virtual int OnIncomingConnection(int newsock, char* ip)
@@ -230,13 +244,15 @@ class HttpSocket : public InspSocket
                                        headers >> request_type;
                                        headers >> uri;
                                        headers >> http_version;
+
+                                       std::transform(request_type.begin(), request_type.end(), request_type.begin(), ::toupper);
+                                       std::transform(http_version.begin(), http_version.end(), http_version.begin(), ::toupper);
                                }
 
                                if ((InternalState == HTTP_SERVE_WAIT_REQUEST) && (request_type == "POST"))
                                {
                                        /* Do we need to fetch postdata? */
                                        postdata = "";
-                                       amount = 0;
                                        InternalState = HTTP_SERVE_RECV_POSTDATA;
                                        std::string header_item;
                                        while (headers >> header_item)
@@ -268,9 +284,8 @@ class HttpSocket : public InspSocket
                                else if (InternalState == HTTP_SERVE_RECV_POSTDATA)
                                {
                                        /* Add postdata, once we have it all, send the event */
-                                       amount += strlen(data);
                                        postdata.append(data);
-                                       if (amount >= postsize)
+                                       if (postdata.length() >= postsize)
                                                ServeData();
                                }
                                else
@@ -344,43 +359,36 @@ void HTTPTimeout::Tick(time_t TIME)
 
 class ModuleHttp : public Module
 {
-       int port;
-       std::string host;
-       std::string bindip;
-       std::string indexfile;
-
-       FileReader* index;
-
-       HttpSocket* http;
-
+       std::vector<HttpSocket*> httpsocks;
  public:
 
        void ReadConfig()
        {
+               int port;
+               std::string host;
+               std::string bindip;
+               std::string indexfile;
+               FileReader* index;
+               HttpSocket* http;
                ConfigReader c(ServerInstance);
-               this->host = c.ReadValue("http", "host", 0);
-               this->bindip = c.ReadValue("http", "ip", 0);
-               this->port = c.ReadInteger("http", "port", 0, true);
-               this->indexfile = c.ReadValue("http", "index", 0);
 
-               if (index)
+               httpsocks.clear();
+
+               for (int i = 0; i < c.Enumerate("http"); i++)
                {
-                       delete index;
-                       index = NULL;
+                       host = c.ReadValue("http", "host", i);
+                       bindip = c.ReadValue("http", "ip", i);
+                       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);
+                       httpsocks.push_back(http);
                }
-               index = new FileReader(ServerInstance, this->indexfile);
-       }
-
-       void CreateListener()
-       {
-               http = new HttpSocket(ServerInstance, this->bindip, this->port, true, 0, index);
        }
 
        ModuleHttp(InspIRCd* Me) : Module::Module(Me)
        {
-               index = NULL;
                ReadConfig();
-               CreateListener();
        }
 
        void OnEvent(Event* event)
@@ -404,12 +412,17 @@ class ModuleHttp : public Module
 
        virtual ~ModuleHttp()
        {
-               ServerInstance->SE->DelFd(http);
+               for (size_t i = 0; i < httpsocks.size(); i++)
+               {
+                       ServerInstance->SE->DelFd(httpsocks[i]);
+                       delete httpsocks[i]->GetIndex();
+                       delete httpsocks[i];
+               }
        }
 
        virtual Version GetVersion()
        {
-               return Version(1,0,0,0,VF_STATIC|VF_VENDOR|VF_SERVICEPROVIDER);
+               return Version(1,0,0,0,VF_VENDOR|VF_SERVICEPROVIDER,API_VERSION);
        }
 };