diff options
author | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2006-07-10 21:23:21 +0000 |
---|---|---|
committer | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2006-07-10 21:23:21 +0000 |
commit | 184b6220255ec89c221bff152a62450f1a137340 (patch) | |
tree | 42e093e301b7c376623d2c2286f70a7540b9c25a /src | |
parent | 02d9fc3279bf5b09256f535d9c2c873526a619fd (diff) |
Try to make this serve some static content
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@4308 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src')
-rw-r--r-- | src/modules/m_http.cpp | 73 |
1 files changed, 65 insertions, 8 deletions
diff --git a/src/modules/m_http.cpp b/src/modules/m_http.cpp index b4f77903a..59293e7a9 100644 --- a/src/modules/m_http.cpp +++ b/src/modules/m_http.cpp @@ -21,42 +21,100 @@ using namespace std; #include "channels.h" #include "modules.h" -/* $ModDesc: Povides a proof-of-concept test /WOOT command */ +/* $ModDesc: Provides HTTP serving facilities to modules */ static Server *Srv; enum HttpState { HTTP_LISTEN = 0, - HTTP_SERVE = 1 + HTTP_SERVE_WAIT_REQUEST = 1, + HTTP_SERVE_SEND_DATA = 2 }; class HttpSocket : public InspSocket { + FileReader* index; + HttpState InternalState; + std::stringstream headers; + public: - HttpSocket(std::string host, int port, bool listening, unsigned long maxtime) : InspSocket(host, port, listening, maxtime) + HttpSocket(std::string host, int port, bool listening, unsigned long maxtime, FileReader* index_page) : InspSocket(host, port, listening, maxtime), index(index_page) { + InternalState = HTTP_LISTEN; } HttpSocket(int newfd, char* ip) : InspSocket(newfd, ip) { + InternalState = HTTP_SERVE_WAIT_REQUEST; + } + + virtual int OnIncomingConnection(int newsock, char* ip) + { + if (InternalState == HTTP_LISTEN) + { + HttpSocket* s = new HttpSocket(newsock, ip); + Srv->AddSocket(s); + } + } + + virtual void OnClose() + { + } + + virtual bool OnDataReady() + { + char* data = this->Read(); + /* Check that the data read is a valid pointer and it has some content */ + if (data && *data) + { + headers << data; + + if (headers.str().find("\r\n\r\n")) + { + /* Headers are complete */ + InternalState = HTTP_SERVE_SEND_DATA; + this->Write("<HTML><H1>COWS.</H1></HTML>"); + } + } } }; class ModuleHttp : public Module { + int port; + std::string host; + std::string bindip; + std::string indexfile; + + FileReader index; + + HttpSocket* http; + public: void ReadConfig() { ConfigReader c; + 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); + + index.LoadFile(this->indexfile); + } + + void CreateListener() + { + http = new HttpSocket(this->host, this->port, true, 0, &index); + Srv->AddSocket(http); } - ModuleHttp(Server* Me) - : Module::Module(Me) + ModuleHttp(Server* Me) : Module::Module(Me) { ReadConfig(); + CreateListener(); } void Implements(char* List) @@ -66,8 +124,9 @@ class ModuleHttp : public Module virtual ~ModuleHttp() { + Srv->DelSocket(http); } - + virtual Version GetVersion() { return Version(1,0,0,0,VF_STATIC|VF_VENDOR); @@ -90,7 +149,6 @@ class ModuleHttpFactory : public ModuleFactory { return new ModuleHttp(Me); } - }; @@ -98,4 +156,3 @@ extern "C" void * init_module( void ) { return new ModuleHttpFactory; } - |