/// <summary>Initialize $_REQUEST global variable.</summary> protected PhpArray InitRequestVariable(PhpArray get, PhpArray post, PhpArray cookie, string gpcOrder) { Debug.Assert(get != null && post != null && cookie != null && gpcOrder != null); if (IsWebApplication) { var requestArray = new PhpArray(get.Count + post.Count + cookie.Count); // adds items from GET, POST, COOKIE arrays in the order specified by RegisteringOrder config option: for (int i = 0; i < gpcOrder.Length; i++) { switch (char.ToUpperInvariant(gpcOrder[i])) { case 'G': Superglobals.AddVariables(requestArray, get); break; case 'P': Superglobals.AddVariables(requestArray, post); break; case 'C': Superglobals.AddVariables(requestArray, cookie); break; } } return(requestArray); } else { return(PhpArray.NewEmpty()); } }
public static void InitializeEGPCSForWeb(PhpArray globals, ref Superglobals superglobals, string registering_order = null) { // deprecated: //// adds EGPCS variables as globals: //if (registering_order == null) //{ // return; //} //// adds items in the order specified by RegisteringOrder config option (overwrites existing): //for (int i = 0; i < registering_order.Length; i++) //{ // switch (registering_order[i]) // { // case 'E': AddVariables(globals, superglobals.env); break; // case 'G': AddVariables(globals, superglobals.get); break; // case 'P': // AddVariables(globals, superglobals.post); // AddFileVariablesToGlobals(globals, superglobals.files); // break; // case 'C': AddVariables(globals, superglobals.cookie); break; // case 'S': AddVariables(globals, superglobals.server); break; // } //} }
static void AddVariables(PhpArray target, IEnumerable <KeyValuePair <string, StringValues> > values) { foreach (var pair in values) { var strs = pair.Value; for (int i = 0; i < strs.Count; i++) { Superglobals.AddVariable(target, pair.Key, strs[i]); } } }
/// <summary> /// Initializes <c>_GLOBALS</c> array. /// </summary> /// <param name="registering_order"><c>EGPCS</c> or <c>null</c> if register globals is disabled (default).</param> protected virtual PhpArray InitGlobals(string registering_order = null) { Debug.Assert(_superglobals.request != null && _superglobals.env != null && _superglobals.server != null && _superglobals.files != null); var globals = new PhpArray(128); // estimates the initial capacity of $GLOBALS array: // adds EGPCS variables as globals: if (registering_order != null) { if (IsWebApplication) { Superglobals.InitializeEGPCSForWeb(globals, ref _superglobals); } else { Superglobals.InitializeEGPCSForConsole(globals, ref _superglobals); } } // adds auto-global variables (overwrites potential existing variables in $GLOBALS): globals["GLOBALS"] = PhpValue.Create(new PhpAlias(PhpValue.Create(globals))); // &$_GLOBALS globals["_ENV"] = PhpValue.Create(_superglobals.env); globals["_GET"] = PhpValue.Create(_superglobals.get); globals["_POST"] = PhpValue.Create(_superglobals.post); globals["_COOKIE"] = PhpValue.Create(_superglobals.cookie); globals["_REQUEST"] = PhpValue.Create(_superglobals.request); globals["_SERVER"] = PhpValue.Create(_superglobals.server); globals["_FILES"] = PhpValue.Create(_superglobals.files); globals["_SESSION"] = PhpValue.Create(_superglobals.session); //globals["HTTP_RAW_POST_DATA"] = HttpRawPostData; //// adds long arrays: //if (Configuration.Global.GlobalVariables.RegisterLongArrays) //{ // globals.Add("HTTP_ENV_VARS", new PhpReference(((PhpArray)Env.Value).DeepCopy())); // globals.Add("HTTP_GET_VARS", new PhpReference(((PhpArray)Get.Value).DeepCopy())); // globals.Add("HTTP_POST_VARS", new PhpReference(((PhpArray)Post.Value).DeepCopy())); // globals.Add("HTTP_COOKIE_VARS", new PhpReference(((PhpArray)Cookie.Value).DeepCopy())); // globals.Add("HTTP_SERVER_VARS", new PhpReference(((PhpArray)Server.Value).DeepCopy())); // globals.Add("HTTP_POST_FILES", new PhpReference(((PhpArray)Files.Value).DeepCopy())); // // both session array references the same array: // globals.Add("HTTP_SESSION_VARS", Session); //} // return(globals); }
void InitSuperglobals(ref Superglobals superglobals) { var var_order = this.Configuration.Core.VariablesOrder; // TODO var egpcs = this.Configuration.Core.RegisteringOrder; superglobals.env = Superglobals.StaticEnv.DeepCopy(); superglobals.get = InitGetVariable(); superglobals.post = InitPostVariable(); superglobals.cookie = InitCookieVariable(); superglobals.server = InitServerVariable(); superglobals.files = InitFilesVariable(); superglobals.session = new PhpArray(); superglobals.request = InitRequestVariable(superglobals.get, superglobals.post, superglobals.cookie, egpcs); // after get, post, cookie superglobals.globals = InitGlobals(egpcs); }
void InitSuperglobals(ref Superglobals superglobals) { //var var_order = DefaultPhpConfigurationService.Instance.Core.VariablesOrder; // TODO var egpcs = DefaultPhpConfigurationService.Instance.Core?.RegisteringOrder; superglobals.env = Superglobals.CreateEnvArray(); superglobals.get = InitGetVariable(); superglobals.post = InitPostVariable(); superglobals.cookie = InitCookieVariable(); superglobals.server = InitServerVariable(); superglobals.files = InitFilesVariable(); superglobals.session = null; // $_SESSION is NULL if it is not initialized superglobals.request = InitRequestVariable(superglobals.get, superglobals.post, superglobals.cookie, egpcs); // after get, post, cookie superglobals.globals = InitGlobals(egpcs); }
protected override PhpArray InitCookieVariable() { var result = PhpArray.NewEmpty(); var cookies = _httpctx.Request.Cookies; if (cookies.Count != 0) { foreach (var c in cookies) { Superglobals.AddVariable(result, c.Key, System.Net.WebUtility.UrlDecode(c.Value)); } } // return(result); }
public static void InitializeEGPCSForConsole(PhpArray globals, ref Superglobals superglobals) { AddVariables(globals, superglobals.env); }
/// <summary> /// Loads $_SERVER from <see cref="HttpRequest.ServerVariables"/>. /// </summary> protected override PhpArray InitServerVariable() { var array = new PhpArray(32); var request = _httpctx.Request; var serverVariables = request.ServerVariables; // adds variables defined by ASP.NET and IIS: foreach (string name in serverVariables) { // gets all values associated with the name: string[] values = serverVariables.GetValues(name); if (values == null) { continue; // http://phalanger.codeplex.com/workitem/30132 } // adds all items: if (name != null) { foreach (string value in values) { Superglobals.AddVariable(array, name, value, null); } } else { // if name is null, only name of the variable is stated: // e.g. for GET variables, URL looks like this: ...&test&... // we add the name of the variable and an emtpy string to get what PHP gets: foreach (string value in values) { Superglobals.AddVariable(array, value, string.Empty, null); } } } //// adds argv, argc variables: //if (RegisterArgcArgv) //{ // array["argv"] = PhpValue.Create(new PhpArray(1) { request.QueryString }); // array["argc"] = PhpValue.Create(0); //} // additional variables defined in PHP manual: array["PHP_SELF"] = (PhpValue)request.Path; try { array["DOCUMENT_ROOT"] = (PhpValue)request.MapPath("/"); // throws exception under mod_aspdotnet } catch { array["DOCUMENT_ROOT"] = PhpValue.Null; } array["SERVER_ADDR"] = (PhpValue)serverVariables["LOCAL_ADDR"]; array["REQUEST_URI"] = (PhpValue)request.RawUrl; array["REQUEST_TIME"] = (PhpValue)Utilities.DateTimeUtils.UtcToUnixTimeStamp(_httpctx.Timestamp.ToUniversalTime()); array["SCRIPT_FILENAME"] = (PhpValue)request.PhysicalPath; //IPv6 is the default in IIS7, convert to an IPv4 address (store the IPv6 as well) if (request.UserHostAddress.Contains(":")) { array["REMOTE_ADDR_IPV6"] = (PhpValue)request.UserHostAddress; if (request.UserHostAddress == "::1") { array["REMOTE_ADDR"] = array["SERVER_ADDR"] = (PhpValue)"127.0.0.1"; } else { foreach (IPAddress IPA in Dns.GetHostAddresses(request.UserHostAddress)) { if (IPA.AddressFamily.ToString() == "InterNetwork") { array["REMOTE_ADDR"] = (PhpValue)IPA.ToString(); break; } } } } // PATH_INFO // should contain partial path information only // note: IIS has AllowPathInfoForScriptMappings property that do the thing ... but ISAPI does not work then // hence it must be done here manually if (array.ContainsKey("PATH_INFO")) { string path_info = array["PATH_INFO"].AsString(); string script_name = array["SCRIPT_NAME"].AsString(); // 'ORIG_PATH_INFO' // Original version of 'PATH_INFO' before processed by PHP. array["ORIG_PATH_INFO"] = (PhpValue)path_info; // 'PHP_INFO' // Contains any client-provided pathname information trailing the actual script filename // but preceding the query string, if available. For instance, if the current script was // accessed via the URL http://www.example.com/php/path_info.php/some/stuff?foo=bar, // then $_SERVER['PATH_INFO'] would contain /some/stuff. // php-5.3.2\sapi\isapi\php5isapi.c: // // strncpy(path_info_buf, static_variable_buf + scriptname_len - 1, sizeof(path_info_buf) - 1); // PATH_INFO = PATH_INFO.SubString(SCRIPT_NAME.Length); array["PATH_INFO"] = (PhpValue)((script_name.Length <= path_info.Length) ? path_info.Substring(script_name.Length) : string.Empty); } // return(array); }