#include <lib/network/httpd.h>
#include <sys/socket.h>
+#include <lib/base/smartptr.h>
+#include <lib/base/estring.h>
#include <error.h>
#include <errno.h>
#include <time.h>
#include <ctype.h>
+#include <lib/network/http_dyn.h>
+#include <lib/network/http_file.h>
+
eHTTPDataSource::eHTTPDataSource(eHTTPConnection *c): connection(c)
{
}
return 0;
}
+DEFINE_REF(eHTTPError);
+
eHTTPError::eHTTPError(eHTTPConnection *c, int errcode): eHTTPDataSource(c), errcode(errcode)
{
- eString error="unknown error";
+ std::string error="unknown error";
switch (errcode)
{
case 400: error="Bad Request"; break;
int eHTTPError::doWrite(int w)
{
- eString html;
- html+="<html><head><title>Error "+eString().setNum(connection->code)+"</title></head>"+
- "<body><h1>Error "+eString().setNum(errcode)+": "+connection->code_descr+"</h1></body></html>\n";
+ std::string html;
+ html+="<html><head><title>Error " + getNum(connection->code) + "</title></head>"+
+ "<body><h1>Error " + getNum(errcode) + ": " + connection->code_descr + "</h1></body></html>\n";
connection->writeBlock(html.c_str(), html.length());
return -1;
}
void eHTTPConnection::destruct()
{
+ eDebug("destruct, this %p!", this);
gotHangup();
delete this;
}
{
if (data && remotestate == stateData)
data->haveData(0, 0);
- if (data)
- {
- delete data;
- data=0;
- }
+ data = 0;
transferDone(0);
localstate=stateWait;
#ifdef DEBUG_HTTPD
eDebug("local request");
#endif
- eString req=request+" "+requestpath+" "+httpversion+"\r\n";
+ std::string req=request+" "+requestpath+" "+httpversion+"\r\n";
writeBlock(req.c_str(), req.length());
localstate=stateHeader;
remotestate=stateResponse;
#ifdef DEBUG_HTTPD
eDebug("local Response");
#endif
- writeString( (httpversion + " " + eString().setNum(code)+" " + code_descr + "\r\n").c_str() );
+ writeString( (httpversion + " " + getNum(code) + " " + code_descr + "\r\n").c_str() );
localstate=stateHeader;
local_header["Connection"]="close";
break;
// move to stateClose
if (remote_header.find("Connection") != remote_header.end())
{
- eString &connection=remote_header["Connection"];
+ std::string &connection=remote_header["Connection"];
if (connection == "keep-alive")
localstate=stateWait;
else
#endif
if (persistent)
{
- if (data)
- delete data;
- data=0;
- localstate=stateWait;
+ data = 0;
+ localstate = stateWait;
} else
close(); // bye, bye, remote
return 1;
#ifdef DEBUG_HTTPD
eDebug("stateRequest");
#endif
- eString line;
+ std::string line;
if (!getLine(line))
{
done=1;
del[1]=line.find(" ", del[0]+1);
if (del[0]==-1)
{
- if (data)
- delete data;
+ data = 0;
eDebug("request buggy");
httpversion="HTTP/1.0";
data=new eHTTPError(this, 400);
return -1;
break;
}
- request=line.left(del[0]);
- requestpath=line.mid(del[0]+1, (del[1]==-1)?-1:(del[1]-del[0]-1));
+ request=line.substr(0, del[0]);
+ requestpath=line.substr(del[0]+1, (del[1]==-1)?-1:(del[1]-del[0]-1));
if (del[1]!=-1)
{
is09=0;
- httpversion=line.mid(del[1]+1);
+ httpversion=line.substr(del[1]+1);
} else
is09=1;
- if (is09 || (httpversion.left(7) != "HTTP/1.") || httpversion.size()!=8)
+ if (is09 || (httpversion.substr(0, 7) != "HTTP/1.") || httpversion.size()!=8)
{
remotestate=stateData;
done=0;
#ifdef DEBUG_HTTPD
eDebug("state response..");
#endif
- eString line;
+ std::string line;
if (!getLine(line))
{
done=1;
code=-1;
else
{
- httpversion=line.left(del[0]);
- code=atoi(line.mid(del[0]+1, (del[1]==-1)?-1:(del[1]-del[0]-1)).c_str());
+ httpversion=line.substr(0, del[0]);
+ code=atoi(line.substr(del[0]+1, (del[1]==-1)?-1:(del[1]-del[0]-1)).c_str());
if (del[1] != -1)
- code_descr=line.mid(del[1]+1);
+ code_descr=line.substr(del[1]+1);
else
code_descr="";
}
#ifdef DEBUG_HTTPD
eDebug("remote stateHeader");
#endif
- eString line;
+ std::string line;
if (!getLine(line))
{
done=1;
if (parent)
{
- for (ePtrList<eHTTPPathResolver>::iterator i(parent->resolver); i != parent->resolver.end(); ++i)
- {
- if ((data=i->getDataSource(request, requestpath, this)))
+ for (eSmartPtrList<iHTTPPathResolver>::iterator i(parent->resolver); i != parent->resolver.end(); ++i)
+ if (!(i->getDataSource(data, request, requestpath, this)))
break;
- }
localstate=stateResponse; // can be overridden by dataSource
} else
data=createDataSource(this);
if (!data)
{
- if (data)
- delete data;
- data=new eHTTPError(this, 404);
+ data = 0;
+ data = new eHTTPError(this, 404);
}
if (content_length || // if content-length is set, we have content
} else
{
int del=line.find(":");
- eString name=line.left(del), value=line.mid(del+1);
+ std::string name=line.substr(0, del), value=line.substr(del+1);
if (value[0]==' ')
- value=value.mid(1);
+ value=value.substr(1);
remote_header[std::string(name)]=std::string(value);
}
done=1;
writeBlock(data, strlen(data));
}
-int eHTTPConnection::getLine(eString &line)
+int eHTTPConnection::getLine(std::string &line)
{
if (!canReadLine())
return 0;
void eHTTPConnection::gotError(int err)
{
- if (data)
- {
- delete data;
- data=0;
- }
+ data = 0;
transferDone(err);
delete this;
}
eDebug("[NET] httpd server FAILED on port %d", port);
else
eDebug("[NET] httpd server started on port %d", port);
-#warning resolver autodelete removed
}
eHTTPConnection::~eHTTPConnection()
{
+ eDebug("HTTP connection destruct");
if ((!persistent) && (state()!=Idle))
eWarning("~eHTTPConnection, status still %d", state());
- if (data)
- delete data;
}
void eHTTPD::newConnection(int socket)