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]); } } }
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); }
/// <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); }