]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_remoteinclude_http.cpp
Add comments
[user/henk/code/inspircd.git] / src / modules / m_remoteinclude_http.cpp
index 1aa2ba7b4daf5ac1472b5c3f501828b4d191a0db..d55b4a251aa7ff9d0692fcdb2218ba19f4f21e7d 100644 (file)
@@ -2,7 +2,7 @@
  *        | Inspire Internet Relay Chat Daemon |
  *        +------------------------------------+
  *
- *  InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ *  InspIRCd: (C) 2002-2008 InspIRCd Development Team
  * See: http://www.inspircd.org/wiki/index.php/Credits
  *
  * This program is free but copyrighted software; see
@@ -37,42 +37,83 @@ class ModuleRemoteIncludeHttp : public Module
 
        virtual int OnDownloadFile(const std::string &filename, std::istream* &filedata)
        {
+#ifdef WIN32
+               return 0;
+#else
+               std::stringstream* gotfile = (std::stringstream*)filedata;
                ServerInstance->Log(DEBUG,"OnDownloadFile in m_remoteinclude_http");
                int sockfd, portno, n;
                struct sockaddr_in serv_addr;
                struct hostent *server;
                char buffer[65536];
 
+               /* Ours? */
+               if (filename.substr(0, 7) != "http://")
+                       return 0;
+
                portno = 80;
                server = gethostbyname("neuron.brainbox.winbot.co.uk");
 
                sockfd = socket(AF_INET, SOCK_STREAM, 0);
-               if (sockfd < 0) 
+               if (sockfd < 0)
+               {
+                       ServerInstance->Log(DEBUG,"Failed to socket()");
                        return 0;
+               }
 
                if (server == NULL) 
+               {
+                       ServerInstance->Log(DEBUG,"No such host");
                        return 0;
+               }
 
                memset(&serv_addr, sizeof(serv_addr), 0);
 
                serv_addr.sin_family = AF_INET;
 
-               memcpy(server->h_addr, &serv_addr.sin_addr.s_addr, server->h_length);
+               memcpy(&serv_addr.sin_addr.s_addr, server->h_addr, server->h_length);
                serv_addr.sin_port = htons(portno);
 
                if (connect(sockfd, (const sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) 
+               {
+                       ServerInstance->Log(DEBUG,"Failed to connect()");
                        return 0;
+               }
+
+               ServerInstance->Log(DEBUG,"Connected to brainbox");
 
-               n = send(sockfd, "GET / HTTP/1.0\r\n", 16, 0);
+               n = this->SockSend(sockfd, "GET / HTTP/1.1\r\nConnection: close\r\nHost: neuron.brainbox.winbot.co.uk\r\n\r\n");
                if (n < 0) 
+               {
+                       ServerInstance->Log(DEBUG,"Failed to send()");
                        return 0;
+               }
 
-               n = read(sockfd,buffer,255);
+               ServerInstance->Log(DEBUG,"Sent GET request");
 
-               if (n < 1) 
-                       return 0;
+               while (((n = read(sockfd,buffer,65535)) > 0))
+               {
+                       std::string output(buffer, 0, n);
+                       (*(gotfile)) << output;
+               }
+
+               ServerInstance->Log(DEBUG,"Read page");
+
+               std::string version, result;
+               (*(gotfile)) >> version;
+               (*(gotfile)) >> result;
 
-               return 1;
+               /* HTTP/1.1 200 OK */
+
+               ServerInstance->Log(DEBUG,"Result: %s", result.c_str());
+
+               return (result == "200");
+#endif
+       }
+
+       int SockSend(int sock, const std::string &data)
+       {
+               return send(sock, data.data(), data.length(), 0);
        }
 
        virtual Version GetVersion()