foundation2_fluffos_v1/
foundation2_fluffos_v1/bin/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/ChangeLog.old/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/Win32/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/compat/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/compat/simuls/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/include/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/clone/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/command/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/data/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/etc/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/include/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/inherit/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/inherit/master/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/log/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/single/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/single/tests/compiler/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/single/tests/efuns/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/single/tests/operators/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/u/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/tmp/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/windows/
foundation2_fluffos_v1/lib/cfg/
foundation2_fluffos_v1/lib/cmds/adm/
foundation2_fluffos_v1/lib/daemon/save/
foundation2_fluffos_v1/lib/daemon/services/
foundation2_fluffos_v1/lib/daemon/soul/
foundation2_fluffos_v1/lib/doc/build/
foundation2_fluffos_v1/lib/doc/classes/
foundation2_fluffos_v1/lib/doc/driver/
foundation2_fluffos_v1/lib/doc/driver/applies/
foundation2_fluffos_v1/lib/doc/driver/applies/interactive/
foundation2_fluffos_v1/lib/doc/driver/concepts/
foundation2_fluffos_v1/lib/doc/driver/driver/
foundation2_fluffos_v1/lib/doc/driver/efuns/arrays/
foundation2_fluffos_v1/lib/doc/driver/efuns/buffers/
foundation2_fluffos_v1/lib/doc/driver/efuns/calls/
foundation2_fluffos_v1/lib/doc/driver/efuns/compile/
foundation2_fluffos_v1/lib/doc/driver/efuns/filesystem/
foundation2_fluffos_v1/lib/doc/driver/efuns/floats/
foundation2_fluffos_v1/lib/doc/driver/efuns/functions/
foundation2_fluffos_v1/lib/doc/driver/efuns/general/
foundation2_fluffos_v1/lib/doc/driver/efuns/mappings/
foundation2_fluffos_v1/lib/doc/driver/efuns/numbers/
foundation2_fluffos_v1/lib/doc/driver/efuns/parsing/
foundation2_fluffos_v1/lib/doc/driver/lpc/constructs/
foundation2_fluffos_v1/lib/doc/driver/lpc/types/
foundation2_fluffos_v1/lib/doc/driver/platforms/
foundation2_fluffos_v1/lib/doc/efun/
foundation2_fluffos_v1/lib/doc/etc/
foundation2_fluffos_v1/lib/doc/faq/
foundation2_fluffos_v1/lib/doc/help/creator/
foundation2_fluffos_v1/lib/doc/help/player/
foundation2_fluffos_v1/lib/doc/lpc/basic/
foundation2_fluffos_v1/lib/doc/lpc/data_types/
foundation2_fluffos_v1/lib/doc/lpc/etc/
foundation2_fluffos_v1/lib/doc/lpc/intermediate/
foundation2_fluffos_v1/lib/doc/lpc/types/
foundation2_fluffos_v1/lib/doc/mudlib/
foundation2_fluffos_v1/lib/doc/mudlib/Features/
foundation2_fluffos_v1/lib/domains/Examples/armour/
foundation2_fluffos_v1/lib/domains/Examples/etc/
foundation2_fluffos_v1/lib/domains/Examples/npc/
foundation2_fluffos_v1/lib/domains/Examples/room/
foundation2_fluffos_v1/lib/domains/Examples/virtual/
foundation2_fluffos_v1/lib/domains/Examples/virtual/exaA/
foundation2_fluffos_v1/lib/domains/Examples/virtual/exaB/
foundation2_fluffos_v1/lib/domains/Examples/weapon/
foundation2_fluffos_v1/lib/domains/School/doc/
foundation2_fluffos_v1/lib/domains/School/room/
foundation2_fluffos_v1/lib/domains/School/room/Classes/
foundation2_fluffos_v1/lib/domains/School/room/Offices/
foundation2_fluffos_v1/lib/domains/Standard/
foundation2_fluffos_v1/lib/domains/Standard/pools/
foundation2_fluffos_v1/lib/domains/Standard/std/
foundation2_fluffos_v1/lib/domains/Standard/xtra/
foundation2_fluffos_v1/lib/include/
foundation2_fluffos_v1/lib/lib/obj/
foundation2_fluffos_v1/lib/news/
foundation2_fluffos_v1/lib/save/
foundation2_fluffos_v1/lib/secure/cfg/
foundation2_fluffos_v1/lib/secure/cmds/player/
foundation2_fluffos_v1/lib/secure/lib/
foundation2_fluffos_v1/old/
foundation2_fluffos_v1/win32/
/*    /daemon/http.c
 *    from the Nightmare IV LPC Library
 *    an http daemon for WWW interfacing
 *    created by Descartes of Borg 950429
 */

#ifndef __PACKAGE_SOCKETS__
#error You should not try to load the http daemon without the sockets package
#else

#include <lib.h>
#include <dirs.h>
#include <network.h>
#include "http.h"

#define FILE_BAD_CMD     DIR_WWW_ERRORS "/badcmd.html"
#define FILE_BAD_GATE    DIR_WWW_ERRORS "/badgate.html"
#define FILE_NOT_FOUND   DIR_WWW_ERRORS "/notfound.html"

inherit LIB_SERVER;

static void create() {
    server::create();
    SetNoClean(1);
    call_out( (: Setup :), 1);
}

static void Setup() {
    if( eventCreateSocket(PORT_HTTP) < 0 ) {
	if( this_object() ) Destruct();
	return;
    }
}

static void eventRead(int fd, string str) {
    string tmp, cmd, args;

    if( !str || str == "" ) {
	eventWrite(fd, (tmp = read_file(FILE_BAD_CMD) ? tmp : ""), 1);
	return;
    }
    tmp = explode(replace_string(str, "\r", ""), "\n")[0];
    sscanf(tmp, "%s %s", cmd, args);
    switch(lower_case(cmd)) {
        case "get": eventGetFile(fd, args); return;
	default: 
            eventWrite(fd, (tmp = read_file(FILE_BAD_CMD) ? tmp : ""), 1);
	    return;
    }
}

private static void eventGetFile(int fd, string file) {
    string *tmp, *parts;
    mixed str;
    string id, args;

    file = (tmp = explode(file, " "))[0];
    if( file[0] != '/' ) file = "/" + file;
    parts = explode(file = absolute_path("/", file), "/");
    if( !sizeof(parts) ) file = DIR_WWW "/index.html";
    else if( parts[0][0] == '~' ) {
	parts[0] = user_path(parts[0][1..]) + "/public_html";
	file = implode(parts, "/");
    }
    if( strsrch(file, DIR_WWW) && strsrch(file, REALMS_DIRS) )
      file = DIR_WWW + file;
    if( file_size(file) == -2 ) file = file + "/index.html";
    if( !strsrch(file, DIR_WWW_GATEWAYS) ) {
	if( sscanf(file, DIR_WWW_GATEWAYS "/%s/%s", id, args) != 2 ) {
	    args = 0;
	    sscanf(file, DIR_WWW_GATEWAYS "/%s", id);
	}
	if( catch(str = (string)(DIR_WWW_GATEWAYS "/"+id)->gateway(args)) ) {
	    eventWrite(fd, (str = read_file(FILE_BAD_GATE) ? str : ""), 1);
	    return;
	}
	str = strip_colours(str);
    }
    else if( file_size(file) < 1 ) {
	eventWrite(fd, (str = read_file(FILE_NOT_FOUND) ? str : ""), 1);
	return;
    }
    else str = read_buffer(file);
    eventWrite(fd, str, 1);
}

#endif /* __PACKAGE_SOCKETS__ */