//
        // internal constructor; inherit from parent
        //
        internal HttpCapabilitiesEvaluator(HttpCapabilitiesEvaluator parent)
        {
            int id = Interlocked.Increment(ref _idCounter);

            // don't do id.ToString() on every request, do it here
            _cacheKeyPrefix = _capabilitieskey + id.ToString() + "\n";

            if (parent == null)
            {
                ClearParent();
            }
            else
            {
                _rule = parent._rule;

                if (parent._variables == null)
                {
                    _variables = null;
                }
                else
                {
                    _variables = new Hashtable(parent._variables);
                }

                _cachetime  = parent._cachetime;
                _resultType = parent._resultType;
                _useCache   = parent._useCache;
            }
        }
        /// <include file='doc\HttpCapabilitiesBase.uex' path='docs/doc[@for="HttpCapabilitiesBase.GetConfigCapabilities"]/*' />
        /// <devdoc>
        ///    <para>[To be supplied.]</para>
        /// </devdoc>
        public static HttpCapabilitiesBase GetConfigCapabilities(string configKey, HttpRequest request)
        {
            HttpCapabilitiesEvaluator capsbuilder = (HttpCapabilitiesEvaluator)request.Context.GetConfig(configKey);

            if (capsbuilder == null)
            {
                return(null);
            }
            else
            {
                return(capsbuilder.Evaluate(request));
            }
        }
        internal virtual String ResolveServerVariable(String varname)
        {
            String result;

            if (varname.Length == 0 || varname == "HTTP_USER_AGENT")
            {
                return(HttpCapabilitiesEvaluator.GetUserAgent(_request));
            }

            if (EvaluateOnlyUserAgent)
            {
                return("");
            }

            InternalSecurityPermissions.AspNetHostingPermissionLevelLow.Assert();
            result = _request.ServerVariables[varname];

            if (result == null)
            {
                return("");
            }

            return(result);
        }
        //
        // Handle the <result> tag
        //
        static void ProcessResult(HttpCapabilitiesEvaluator capabilitiesEvaluator, XmlNode node)
        {
            bool inherit = true;

            HandlerBase.GetAndRemoveBooleanAttribute(node, "inherit", ref inherit);
            if (inherit == false)
            {
                capabilitiesEvaluator.ClearParent();
            }

            Type    resultType = null;
            XmlNode attribute  = HandlerBase.GetAndRemoveTypeAttribute(node, "type", ref resultType);

            if (attribute != null)
            {
                if (resultType.Equals(capabilitiesEvaluator._resultType) == false)
                {
                    // be sure the new type is assignable to the parent type
                    HandlerBase.CheckAssignableType(attribute, capabilitiesEvaluator._resultType, resultType);
                    capabilitiesEvaluator._resultType = resultType;
                }
            }

            int cacheTime = 0;

            attribute = HandlerBase.GetAndRemovePositiveIntegerAttribute(node, "cacheTime", ref cacheTime);
            if (attribute != null)
            {
                capabilitiesEvaluator.SetCacheTime(cacheTime);
            }

            HandlerBase.GetAndRemoveBooleanAttribute(node, "cache", ref capabilitiesEvaluator._useCache);

            HandlerBase.CheckForUnrecognizedAttributes(node);
            HandlerBase.CheckForChildNodes(node);
        }