/+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Mallard 0.1 An object-oriented CGI platform. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Getting/setting environment variables via the Environment singleton. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/ module mallard.environment; /+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Imports +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/ // standard imports private import std.string ; private import std.c.stdlib ; // for getenv() /+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Aliases +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/ alias std.string.toString stdToString; /+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Externs +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/ private extern(C) int putenv(char*); /+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Constants +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/ // CGI environment variable names - useful to make typos compile-time errors public const char[] DOCUMENT_ROOT = `DOCUMENT_ROOT` , GATEWAY_INTERFACE = `GATEWAY_INTERFACE` , HTTP_ACCEPT = `HTTP_ACCEPT` , HTTP_ACCEPT_CHARSET = `HTTP_ACCEPT_CHARSET` , HTTP_ACCEPT_ENCODING = `HTTP_ACCEPT_ENCODING` , HTTP_ACCEPT_LANGUAGE = `HTTP_ACCEPT_LANGUAGE` , HTTP_CONNECTION = `HTTP_CONNECTION` , HTTP_HOST = `HTTP_HOST` , HTTP_KEEP_ALIVE = `HTTP_KEEP_ALIVE` , HTTP_USER_AGENT = `HTTP_USER_AGENT` , PATH_INFO = `PATH_INFO` , PATH_TRANSLATED = `PATH_TRANSLATED` , QUERY_STRING = `QUERY_STRING` , REDIRECT_QUERY_STRING = `REDIRECT_QUERY_STRING` , REDIRECT_STATUS = `REDIRECT_STATUS` , REDIRECT_URL = `REDIRECT_URL` , REMOTE_ADDR = `REMOTE_ADDR` , REMOTE_PORT = `REMOTE_PORT` , REQUEST_METHOD = `REQUEST_METHOD` , REQUEST_URI = `REQUEST_URI` , SCRIPT_FILENAME = `SCRIPT_FILENAME` , SCRIPT_NAME = `SCRIPT_NAME` , SERVER_ADDR = `SERVER_ADDR` , SERVER_ADMIN = `SERVER_ADMIN` , SERVER_NAME = `SERVER_NAME` , SERVER_PORT = `SERVER_PORT` , SERVER_PROTOCOL = `SERVER_PROTOCOL` , SERVER_SIGNATURE = `SERVER_SIGNATURE` , SERVER_SOFTWARE = `SERVER_SOFTWARE` ; /+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Singleton Environment TODO: Implement a method to enumerate the entire environment (or a least its keys). +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/ public abstract class Environment { static: /+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Getting environment variable values. NOTE: Defaults to an empty string. USAGE: char[] var; var = Environment.get("some key"); var = Environment["some key"]; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/ public char[] get (in char[] key) { return stdToString(getenv(toStringz(key))); } public alias get opIndex; /+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Setting environment variable values. USAGE: char[] key = "some key", value = "some value"; Environment.set(key, value); Environment[key] = value; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/ public int set (in char[] key, in char[] value) { return putenv(toStringz(format("%s=%s", key, value))); } // can't use alias because the params are backward to support variable-length keysets public int opIndexAssign (in char[] value, in char[] key) { return set(key, value); } /+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ An array of the CGI keys. Can be useful for stepping through them all easily. For an example, see the opApply overload below. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/ public const char[][] STD_CGI_KEYS = [ DOCUMENT_ROOT , GATEWAY_INTERFACE , HTTP_ACCEPT , HTTP_ACCEPT_CHARSET , HTTP_ACCEPT_ENCODING , HTTP_ACCEPT_LANGUAGE , HTTP_CONNECTION , HTTP_HOST , HTTP_KEEP_ALIVE , HTTP_USER_AGENT , PATH_INFO , PATH_TRANSLATED , QUERY_STRING , REDIRECT_QUERY_STRING , REDIRECT_STATUS , REDIRECT_URL , REMOTE_ADDR , REMOTE_PORT , REQUEST_METHOD , REQUEST_URI , SCRIPT_FILENAME , SCRIPT_NAME , SERVER_ADDR , SERVER_ADMIN , SERVER_NAME , SERVER_PORT , SERVER_PROTOCOL , SERVER_SIGNATURE , SERVER_SOFTWARE ]; // For array-like syntax. Some people like that. public alias STD_CGI_KEYS keys; /+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Make the Environment foreach'able. Just steps through the standard CGI keys. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/ // for just keys public int opApply(int delegate(inout char[]) dg) { int result ; foreach (char[] key; STD_CGI_KEYS) { result = dg(key); if (result) break; } return result; } // for key->value pairs public int opApply(int delegate(inout char[], inout char[]) dg) { int result ; char[] key , value ; foreach (char[] key; STD_CGI_KEYS) { value = get (key ) ; result = dg (key, value) ; if (result) break; } return result; } } // end singleton Environment /+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/