#include "channels.h"
#include "modules.h"
#include "inspsocket.h"
-#include "helperfuncs.h"
+
+#include "inspircd.h"
#include "httpd.h"
/* $ModDesc: Provides HTTP serving facilities to modules */
class ModuleHttp;
-static Server *Srv;
+
+
static ModuleHttp* HttpModule;
-extern time_t TIME;
static bool claimed;
enum HttpState
public:
- HttpSocket(std::string host, int port, bool listening, unsigned long maxtime, FileReader* index_page) : InspSocket(host, port, listening, maxtime), index(index_page)
+ 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)
{
- log(DEBUG,"HttpSocket constructor");
+ SI->Log(DEBUG,"HttpSocket constructor");
InternalState = HTTP_LISTEN;
}
- HttpSocket(int newfd, char* ip, FileReader* ind) : InspSocket(newfd, ip), index(ind)
+ HttpSocket(InspIRCd* SI, int newfd, char* ip, FileReader* ind) : InspSocket(SI, newfd, ip), index(ind)
{
InternalState = HTTP_SERVE_WAIT_REQUEST;
}
{
if (InternalState == HTTP_LISTEN)
{
- HttpSocket* s = new HttpSocket(newsock, ip, index);
- Srv->AddSocket(s);
+ HttpSocket* s = new HttpSocket(this->Instance, newsock, ip, index);
+ this->Instance->AddSocket(s);
}
return true;
}
}
}
- void SendHeaders(unsigned long size, int response)
+ void SendHeaders(unsigned long size, int response, const std::string &extraheaders)
{
- struct tm *timeinfo = localtime(&TIME);
+ time_t local = this->Instance->Time();
+ struct tm *timeinfo = localtime(&local);
this->Write("HTTP/1.1 "+ConvToStr(response)+" "+Response(response)+"\r\nDate: ");
this->Write(asctime(timeinfo));
+ if (extraheaders.empty())
+ {
+ this->Write("Content-Type: text/html\r\n");
+ }
+ else
+ {
+ this->Write(extraheaders);
+ }
this->Write("Server: InspIRCd/m_httpd.so/1.1\r\nContent-Length: "+ConvToStr(size)+
- "\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n");
+ "\r\nConnection: close\r\n\r\n");
}
virtual bool OnDataReady()
if ((http_version != "HTTP/1.1") && (http_version != "HTTP/1.0"))
{
- SendHeaders(0, 505);
+ SendHeaders(0, 505, "");
}
else
{
if ((request_type == "GET") && (uri == "/"))
{
- SendHeaders(index->ContentSize(),200);
+ SendHeaders(index->ContentSize(), 200, "");
this->Write(index->Contents());
}
else
claimed = false;
HTTPRequest httpr(request_type,uri,&headers,this,this->GetIP());
Event e((char*)&httpr, (Module*)HttpModule, "httpd_url");
- e.Send();
+ e.Send(this->Instance);
if (!claimed)
{
- SendHeaders(0, 404);
- log(DEBUG,"Page not claimed, 404");
+ SendHeaders(0, 404, "");
+ Instance->Log(DEBUG,"Page not claimed, 404");
}
}
}
}
}
- void Page(std::stringstream* n, int response)
+ void Page(std::stringstream* n, int response, std::string& extraheaders)
{
- log(DEBUG,"Sending page");
- SendHeaders(n->str().length(),response);
+ Instance->Log(DEBUG,"Sending page");
+ SendHeaders(n->str().length(), response, extraheaders);
this->Write(n->str());
}
};
std::string bindip;
std::string indexfile;
- FileReader index;
+ FileReader* index;
HttpSocket* http;
void ReadConfig()
{
- ConfigReader c;
+ 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);
- index.LoadFile(this->indexfile);
+ if (index)
+ {
+ delete index;
+ index = NULL;
+ }
+ index = new FileReader(ServerInstance, this->indexfile);
}
void CreateListener()
{
- http = new HttpSocket(this->bindip, this->port, true, 0, &index);
+ http = new HttpSocket(ServerInstance, this->bindip, this->port, true, 0, index);
if ((http) && (http->GetState() == I_LISTENING))
{
- Srv->AddSocket(http);
+ ServerInstance->AddSocket(http);
}
}
- ModuleHttp(Server* Me) : Module::Module(Me)
+ ModuleHttp(InspIRCd* Me) : Module::Module(Me)
{
- Srv = Me;
+ index = NULL;
ReadConfig();
CreateListener();
}
char* OnRequest(Request* request)
{
- log(DEBUG,"Got HTTPDocument object");
+ ServerInstance->Log(DEBUG,"Got HTTPDocument object");
claimed = true;
HTTPDocument* doc = (HTTPDocument*)request->GetData();
HttpSocket* sock = (HttpSocket*)doc->sock;
- sock->Page(doc->GetDocument(), doc->GetResponseCode());
+ sock->Page(doc->GetDocument(), doc->GetResponseCode(), doc->GetExtraHeaders());
return NULL;
}
virtual ~ModuleHttp()
{
- Srv->DelSocket(http);
+ ServerInstance->DelSocket(http);
}
virtual Version GetVersion()
{
- return Version(1,0,0,0,VF_STATIC|VF_VENDOR);
+ return Version(1,0,0,0,VF_STATIC|VF_VENDOR|VF_SERVICEPROVIDER);
}
};
{
}
- virtual Module * CreateModule(Server* Me)
+ virtual Module * CreateModule(InspIRCd* Me)
{
HttpModule = new ModuleHttp(Me);
return HttpModule;