loving.
function createWebServer(%name,%htdocs)
{
if(isObject(nametoid("web_" @ %name)))
return;
%obj = new TCPObject()
{
class = webServerAPI_server;
name = %name;
htdocs = %htdocs;
isWEBAPI = 1;
};
%obj.setName("web_" @ %name);
return %obj;
}
function TCPObject::serve(%this,%port)
{
%this.listen(%port);
}
function TCPObject::enableModule(%this,%mod)
{
%dir = filePath(expandFilename("./main.cs")) @ "/modules/" @ %mod @ "/";
echo(%dir);
if(!isFile(%dir @ "main.cs"))
return 0;
exec(%dir @ "main.cs");
if(strLen(%this.mods) < 1)
%this.mods = 0;
%this.mod[%this.mods] = %mod;
%this.mods++;
}
package webServers
{
function TCPObject::onConnectRequest(%this,%ip,%socket)
{
if(!%this.isWEBAPI)
{
Parent::onConnectRequest(%this,%ip,%socket);
return;
}
if(isObject(%this.connection[%ip]))
{
if(%this.debug)
echo("["@%this.name@"] duplicated_connect:" SPC %ip);
%this.connection[%ip].disconnect();
%this.connection[%ip].delete();
}
if(%this.debug)
echo("["@%this.name@"] connect::" SPC %ip);
%this.connection[%ip] = new TCPObject(webServerAPI_client,%socket)
{
ip = %ip;
parent = %this;
};
}
};
activatePackage(webServers);
function webServerAPI_client::handleRequestOptions(%this,%data)
{
deleteVariables("$_SERVER*");
deleteVariables("$_ISSET*");
deleteVariables("$_POST*");
deleteVariables("$_GET*");
$_SERVER["REMOTE_IP"] = %this.ip;
$_SERVER["SERVING"] = %this;
for(%i=0;%i<getLineCount(%data);%i++)
{
%line = getLine(%data,%i);
if(firstWord(%line) $= "GET" || firstWord(%line) $= "POST")
{
//if(%this.parent.debug)
// echo("["@%this.parent.name@"]" SPC "Handling request: "@%line);
%type = getWord(%line,0);
%path = getWord(%line,1);
%http = getWord(%line,2);
$_SERVER["RQST_TYPE"] = %type;
$_SERVER["FILE_PATH"] = %path;
$_SERVER["HTTP_VERSION"] = %http;
}
else
{
//if(%this.parent.debug)
// echo("["@%this.parent.name@"]" SPC "Handling header: "@%line);
%opt_t = getSubStr(%line,0,strPos(%line,": "));
%opt_v = getSubStr(%line,strPos(%line,": ")+2,strLen(%line));
$_SERVER[%opt_t] = %opt_v;
}
}
if((%qPos = strPos(%path,"?")) >= 0)
{
%post_data = strReplace(getSubStr(%path,%qPos+1,strLen(%path)),"&","\t");
//%post_data = strReplace(getSubStr(%path,strPos(%path,"?")+1,strLen(%path)),"&","\t");
%path = getSubStr(%path,0,%qPos);
for(%i=0;%i<getFieldCount(%post_data);%i++)
{
%ld = getField(%post_data,%i);
%ps = strPos(%ld,"=");
if(%ps < 0)
$_ISSET[%ld] = true;
else
{
%l_vr = getSubStr(%ld,0,%ps);
%l_vl = getSubStr(%ld,%ps+1,strLen(%ld));
$_ISSET[%l_vr] = true;
$_GET[%l_vr] = %l_vl;
$_POST[%l_vr] = %l_vl;
}
}
}
%this.handleRequest(%path);
}
function webServerAPI_client::handleRequest(%this,%file)
{
%file = strReplace(%file,"..","");
if(getSubStr(%file,0,1) $= "/")
%file = %this.parent.htdocs @ %file;
else
%file = %this.parent.htdocs @ "/" @ %file;
if(%this.parent.debug)
echo("["@%this.parent.name@"]" SPC "Sending output: "@%file);
if(!isFile(%file))
{
%oldFile = %file;
if(isFile(%file @ "/index.html")) %file = %file @ "/index.html";
if(isFile(%file @ "/index.htm")) %file = %file @ "/index.htm";
if(isFile(%file @ "/index.tqs")) %file = %file @ "/index.tqs";
if(isFile(%file @ "index.html")) %file = %file @ "index.html";
if(isFile(%file @ "index.htm")) %file = %file @ "index.htm";
if(isFile(%file @ "index.tqs")) %file = %file @ "index.tqs";
if(%file !$= %oldFile && %this.parent.debug)
echo("["@%this.parent.name@"]" SPC "File changed to: "@%file);
}
if(!isFile(%file))
{
%exceptionCaught = true;
if(!isFile(%this.parent.htdocs @ %this.parent.page[404]))
%errorOccured = true;
else
%file = %this.parent.htdocs @ %this.parent.page[404];
%code = 404;
%msg = "File Not Found";
if(%this.parent.debug)
echo("["@%this.parent.name@"]" SPC "404, solution: "@(%errorOccured ? "error" : "404 page"));
}
if(!%exceptionCaught && isFile(filePath(%file) @ "/.htaccess") && strLen($_SERVER["Authenticate"]) < 1)
{
%exceptionCaught = true;
%errorOccured = true;
%fo = new FileObject();
%fo.openForRead(filePath(%file) @ "/.htaccess");
%realm = %fo.readLine();
%fo.close();
%fo.delete();
%code = 401;
%msg = "Authorization Required";
%headAdd = "WWW-Authenticate: Basic realm=\""@%realm@"\"";
}
if(!%exceptionCaught && isFile(filePath(%file) @ "/.htaccess") && strLen($_SERVER["Authenticate"]) > 0)
{
%authType = firstWord($_SERVER["Authenticate"]);
%authData = restWords($_SERVER["Authenticate"]);
if(%authType !$= "Basic")
{
%exceptionCaught = true;
if(!isFile(%this.parent.htdocs @ %this.parent.page[403]))
%errorOccured = true;
else
%file = %this.parent.htdocs @ %this.parent.page[403];
%code = 403;
%msg = "Permission Denied";
}
else
{
%isValid = false;
%fo = new FileObject();
%fo.openForRead(filePath(%file) @ "/.htaccess");
while(!%fo.isEOF())
if(%fo.readLine() $= %authData)
%isValid = true;
%fo.close();
%fo.delete();
if(!%isValid)
{
%exceptionCaught = true;
if(!isFile(%this.parent.htdocs @ %this.parent.page[403]))
%errorOccured = true;
else
%file = %this.parent.htdocs @ %this.parent.page[403];
%code = 403;
%msg = "Permission Denied";
}
}
}
if(!%errorOccured)
{
%fo = new FileObject();
%fo.openForRead(%file);
while(!%fo.isEOF())
%filedat = %filedat @ %fo.readLine() NL "";
%filedat = trim(%filedat);
%fo.close();
%fo.delete();
if(!%exceptionCaught)
{
%code = 200;
%msg = "OK";
}
}
$_SERVER["FILEDATA"] = %filedat;
for(%i=0;%i<%this.parent.mods;%i++)
{
%m = %this.parent.mod[%i] @ "_changeData";
if(isFunction(%m))
call(%m,%filedat);
}
if(strLen($_SERVER["FILEDATA"]) < 1)
$_SERVER["FILEDATA"] = "No Content";
%header = %header @ "HTTP/1.1" SPC %code SPC %msg @ "\n\r";
%header = %header @ "Server: " @ %this.parent.name @ "\n\r";
%header = %header @ "Date: " @ getDateTime() @ "\n\r";
%header = %header @ (strLen(%headAdd) < 1 ? "" : %headAdd @ "\n\r");
%header = %header @ "Content-Type: text/html" @ "\n\r";
%header = %header @ "Content-Length: " @ strLen($_SERVER["FILEDATA"]) @ "\n\r";
%data = %header @ "\n\r" @ $_SERVER["FILEDATA"];
if(%this.parent.debug)
{
echo("["@%this.parent.name@"]" SPC "SERVER PROCESSING FINISHED, TRANSMITTING:");
echo(%data);
}
%this.send(%data);
}
function fileDataCLEAR()
{
$_SERVER["FILEDATA"] = "";
}
function fileDataAPPEND(%str)
{
$_SERVER["FILEDATA"] = $_SERVER["FILEDATA"] @ %str NL "";
}
function webServerAPI_client::onLine(%this,%line)
{
if(%this.parent.debug)
echo("["@%this.parent.name@"]" SPC %this.ip SPC "sent: "@%line);
if(strLen(%line) < 1)
%this.handleRequestOptions(rtrim(%this.lineData));
else
%this.lineData = %this.lineData @ %line NL "";
return;
deleteVariables("$_SERVER*");
$_SERVER[REMOTE_IP] = %this.ip;
%cmd = firstWord(%line);
%arg = restWords(%line);
if(%this.parent.debug)
echo("["@%this.parent.name@"] recieve: "@%line);
switch$ (%cmd)
{
case GET:
%file_path = %this.parent.htdocs @ strReplace(firstWord(%arg),"..","");
%http_version = getWord(%arg,1);
if(isFile(%file_path @ "index.tqs") && !isFile(%file_path))
%file_path = %file_path @ "index.tqs";
echo("["@%this.parent.name@"] "@%this.ip@" requested: "@%file_path);
if(!isFile(%file_path))
{
%this.send("404 File Not Found");
%this.disconnect();
%this.schedule(10,delete);
return;
}
%this.transmitFile(%file_path);
case POST:
deleteVariables("$_GET*");
deleteVariables("$_POST*");
deleteVariables("$_ARG*");
%data = firstWord(%arg);
%q_pos = strPos(%data,"?");
if(%q_pos >= 0)
{
%args = strReplace(getSubStr(%data,%q_pos+1,strLen(%data)),"&","\t");
for(%i=0;%i<getFieldCount(%args);%i++)
{
%tArg = getField(%args,%i);
%l_pos = strPos(%tArg,"=");
if(%l_pos < 0)
{
$_ARG[%tArg] = true;
$_GET[%tArg] = true;
$_POST[%tArg] = true;
}
else
{
%tArgN = getSubStr(%tArg,0,%l_pos);
%tArgD = getSubStr(%tArg,%l_pos+1,strLen(%tArg));
$_ARG[%tArgN] = true;
$_GET[%tArgN] = %tArgD;
$_POST[%tArgN] = %tArgD;
}
}
}
%file_path = %this.parent.htdocs @ strReplace(getSubStr(%data,0,(%q_pos < 0 ? strLen(%data) : %q_pos)),"..","");
%http_version = getWord(%arg,1);
if(isFile(%file_path @ "index.tqs") && !isFile(%file_path))
%file_path = %file_path @ "index.tqs";
echo("["@%this.parent.name@"] "@%this.ip@" requested: "@%file_path);
if(!isFile(%file_path))
{
%this.send("404 File Not Found");
%this.disconnect();
%this.schedule(10,delete);
return;
}
%this.transmitFile(%file_path);
}
}
function webServerAPI_client::transmitFile(%this,%f)
{
%read = new FileObject();
%read.openForRead(%f);
while(!%read.isEOF())
{
%line = %read.readLine();
if(!%inTQS)
{
if(%line $= "<?tqs")
%inTQS = true;
else
%this.send(%line @ "\n\r");
}
else
{
if(%line $= "?>")
{
%inTQS = false;
%correct = false;
eval(rtrim(%tqsCODE) SPC "%correct = true;");
if(!%correct)
%this.send("A syntax error was accountered in the server-sided script files.\n\r");
%tqsCODE = "";
}
else
{
%dat = strReplace(%line,"transmit",%this @ ".send");
%tqsCODE = %tqsCODE @ %dat NL "";
}
}
}
%read.close();
%read.delete();
%this.disconnect();
%this.schedule(10,delete);
}
And yes, know that syntax is crappy. Did this long time ago.