示例#1
0
        /// <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());
            }
        }
示例#2
0
            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;
                //    }
                //}
            }
示例#3
0
 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]);
         }
     }
 }
示例#4
0
        /// <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);
        }
示例#5
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
        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);
        }
示例#8
0
 public static void InitializeEGPCSForConsole(PhpArray globals, ref Superglobals superglobals)
 {
     AddVariables(globals, superglobals.env);
 }
示例#9
0
        /// <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);
        }