Exemple #1
0
        private void OnBeginRequest(object sender, EventArgs e)

        {
            HttpContext context = ((HttpApplication)sender).Context;
            Uri         uri     = context.Request.Url;
            string      wap     = Settings.Instance.WapDomain;
            string      url     = context.Request.AppRelativeCurrentExecutionFilePath.Substring(1);
            bool        isWap   = UrlParse.EqualsDomain(uri.DnsSafeHost, wap);

            if (!RedirectToWap(context, isWap, wap) || "POST".Equals(context.Request.HttpMethod))
            {
                UrlParse    parse = new UrlParse(url);
                Application app   = new Application(context, isWap);
                if (Settings.Instance.UrlMode == Configuration.SiteUrlMode.Static)
                {
                    RenderStatic(app, parse, uri);
                }
                else
                {
                    RenderRewrite(app, parse, uri);
                }
            }
            else
            {
                url = string.Concat(uri.Scheme, "://", wap, uri.Port != 80 ? string.Concat(":", uri.Port.ToString()) : string.Empty, url);
                try { context.Response.Redirect(url, true); }
                catch { }
            }
        }
Exemple #2
0
 private void RenderResource(Application app, UrlParse parse, ExtensionType type, Uri url)
 {
     if (parse.ExtensionType == type)
     {
         RenderResource(app, parse, url);
     }
     else
     {
         app.RenderError(404);
     }
 }
Exemple #3
0
 private void RenderResource(Application app, UrlParse parse, Uri url)
 {
     if (parse.IsDirectory)
     {
         if (url != null && url.Query.StartsWith("??"))
         {
             try
             {
                 string          path;
                 ResourceHandler handler = null;
                 string[]        array   = url.Query.Substring(2).Split(',');
                 string[]        paths   = new string[array.Length];
                 for (int i = 0; i < array.Length; ++i)
                 {
                     path = array[i];
                     if (i == 0)
                     {
                         UrlParse p = new UrlParse(path);
                         handler = ResourceHandler.Parse(p.ExtensionType, p.Extension, false);
                         if (handler == null)
                         {
                             throw new Exception();
                         }
                     }
                     paths[i] = app.Context.Server.MapPath(string.Concat(parse.Url, path));
                 }
                 handler.ProcessRequest(app.Context, paths);
             }
             catch (Exception)
             {
                 app.RenderError(404);
             }
         }
         else
         {
             app.RenderError(404);
         }
     }
     else
     {
         ResourceHandler handler = ResourceHandler.Parse(parse.ExtensionType, parse.Extension, false);
         if (handler != null && File.Exists(app.Context.Request.PhysicalPath))
         {
             handler.ProcessRequest(app.Context, app.Context.Request.PhysicalPath);
         }
         else
         {
             app.RenderError(404);
         }
     }
 }
Exemple #4
0
        internal static void RenderResource(string ns, string name, ExtensionType extType, string ext, Arguments args, Application app, Type type, Version version, bool html)
        {
            for (int i = 0; i < args.Count; ++i)
            {
                name = string.Concat(name, '.', args[i]);
            }
            string query = app.Context.Request.Url.Query;

            if (!string.IsNullOrEmpty(query) && query.StartsWith("??"))
            {
                if (query.Length > 2)
                {
                    string          path;
                    ResourceHandler handler = null;
                    string[]        array   = query.Substring(2).Split(',');
                    string[]        names   = new string[array.Length];
                    for (int i = 0; i < array.Length; ++i)
                    {
                        path = array[i];
                        if (i == 0)
                        {
                            UrlParse p = new UrlParse(path);
                            handler = ResourceHandler.Parse(p.ExtensionType, p.Extension, false);
                            if (handler == null)
                            {
                                app.RenderError(404);
                                return;
                            }
                        }
                        names[i] = FormatName(ns, string.Concat(name, '.', path));
                    }
                    RenderResource(names, handler.ContentType, app, type, version);
                }
                else
                {
                    app.RenderError(404);
                }
            }
            else
            {
                ResourceHandler hander = ResourceHandler.Parse(extType, ext, html);
                if (hander != null)
                {
                    RenderResource(FormatName(ns, name), hander.ContentType, app, type, version);
                }
                else
                {
                    app.RenderError(404);
                }
            }
        }
Exemple #5
0
        private void RenderStatic(Application app, UrlParse parse, Uri url)
        {
            if (parse.IsDirectory)
            {
                if (parse.Segments.Count == 0 && parse.Extension == null)
                {
                    ResourceHandler.Html.ProcessRequest(app.Context, app.Context.Server.MapPath(string.Concat(app.IsWap ? Utility.StaticWapDirF : Utility.StaticWwwDirF, Utility.DefaultController, Utility.DefaultExt)));
                }
                else
                {
                    if (parse.Segments.Count > 0 && parse.Extension == null)
                    {
                        switch (parse.SegmentType)
                        {
                        case SegmentType.Themes:
                            RenderResource(app, parse, url);
                            break;

                        case SegmentType.Resource:
                            app.Run(parse);
                            break;

                        default:
                            app.RenderError(404);
                            break;
                        }
                    }
                    else
                    {
                        app.RenderError(404);
                    }
                }
            }
            else
            {
                if (parse.Segments.Count > 0)
                {
                    if (parse.Extension != null)
                    {
                        switch (parse.SegmentType)
                        {
                        case SegmentType.Resource:
                            parse.AppendExtension();
                            app.Run(parse);
                            break;

                        case SegmentType.Themes:
                        case SegmentType.Uploads:
                            RenderResource(app, parse, url);
                            break;

                        case SegmentType.Favicon:
                            if (parse.Segments.Count == 1)
                            {
                                RenderResource(app, parse, ExtensionType.Ico, null);
                            }
                            break;

                        case SegmentType.Robots:
                            if (parse.Segments.Count == 1)
                            {
                                RenderResource(app, parse, ExtensionType.Txt, null);
                            }
                            break;

                        case SegmentType.Sitemap:
                        case SegmentType.CrossDomain:
                            if (parse.Segments.Count == 1)
                            {
                                RenderResource(app, parse, ExtensionType.Xml, null);
                            }
                            break;

                        case SegmentType.Caches:
                        case SegmentType.Runtime:
                        case SegmentType.Management:
                            app.RenderError(404);
                            break;

                        case SegmentType.Admin:
                            if (parse.ExtensionType != ExtensionType.Html)
                            {
                                parse.AppendExtension();
                            }
                            parse.FormatManagement();
                            app.Run(parse);
                            break;

                        case SegmentType.Install:
                            if (parse.ExtensionType != ExtensionType.Html)
                            {
                                parse.AppendExtension();
                            }
                            app.Run(parse);
                            break;

                        default:
                            if (parse.ExtensionType == ExtensionType.Html)
                            {
                                ResourceHandler.Html.ProcessRequest(app.Context, app.Context.Server.MapPath(string.Concat(app.IsWap ? Utility.StaticWapDir : Utility.StaticWwwDir, parse.Url)));
                            }
                            else
                            {
                                if (parse.Segments.Count > 3 && Utility.StaticString.Equals(parse.Segments[1], StringComparison.OrdinalIgnoreCase))
                                {
                                    parse.AppendExtension();
                                    app.Run(parse);
                                }
                                else
                                {
                                    app.RenderError(404);
                                }
                            }
                            break;
                        }
                    }
                    else
                    {
                        if (parse.SegmentType == SegmentType.Admin && parse.Segments.Count == 1)
                        {
                            parse.FormatManagement();
                            app.Run(parse);
                        }
                        else
                        {
                            app.RenderError(404);
                        }
                    }
                }
                else
                {
                    app.RenderError(404);
                }
            }
        }
Exemple #6
0
        //private void RenderResource(Application app, UrlParse parse, params ExtensionType[] types)
        //{
        //    if (Array.BinarySearch<ExtensionType>(types, parse.ExtensionType) >= 0)
        //        RenderResource(app, parse);
        //    else
        //        app.RenderError(404);
        //}

        private void RenderRewrite(Application app, UrlParse parse, Uri url)
        {
            if (parse.IsDirectory)
            {
                if (parse.Segments.Count == 0 && parse.Extension == null)
                {
                    app.Run(parse);
                }
                else
                {
                    if (parse.Segments.Count > 0 && parse.Extension == null)
                    {
                        switch (parse.SegmentType)
                        {
                        case SegmentType.Themes:
                            RenderResource(app, parse, url);
                            break;

                        case SegmentType.Resource:
                            app.Run(parse);
                            break;

                        default:
                            app.RenderError(404);
                            break;
                        }
                    }
                    else
                    {
                        app.RenderError(404);
                    }
                }
            }
            else
            {
                if (parse.Segments.Count > 0)
                {
                    if (parse.Extension != null)
                    {
                        switch (parse.SegmentType)
                        {
                        case SegmentType.Resource:
                            parse.AppendExtension();
                            app.Run(parse);
                            break;

                        case SegmentType.Themes:
                        case SegmentType.Uploads:
                            RenderResource(app, parse, url);
                            break;

                        case SegmentType.Favicon:
                            if (parse.Segments.Count == 1)
                            {
                                RenderResource(app, parse, ExtensionType.Ico, null);
                            }
                            break;

                        case SegmentType.Robots:
                            if (parse.Segments.Count == 1)
                            {
                                RenderResource(app, parse, ExtensionType.Txt, null);
                            }
                            break;

                        case SegmentType.Sitemap:
                        case SegmentType.CrossDomain:
                            if (parse.Segments.Count == 1)
                            {
                                RenderResource(app, parse, ExtensionType.Xml, null);
                            }
                            break;

                        case SegmentType.Caches:
                        case SegmentType.Runtime:
                        case SegmentType.Management:
                            app.RenderError(404);
                            break;

                        case SegmentType.Admin:
                            if (parse.ExtensionType != ExtensionType.Html)
                            {
                                parse.AppendExtension();
                            }
                            parse.FormatManagement();
                            app.Run(parse);
                            break;

                        case SegmentType.Install:
                            if (parse.ExtensionType != ExtensionType.Html)
                            {
                                parse.AppendExtension();
                            }
                            app.Run(parse);
                            break;

                        default:
                            if (parse.ExtensionType == ExtensionType.Html)
                            {
                                app.Run(parse);
                            }
                            else
                            {
                                if (parse.Segments.Count > 3 && Utility.StaticString.Equals(parse.Segments[1], StringComparison.OrdinalIgnoreCase))
                                {
                                    parse.AppendExtension();
                                    app.Run(parse);
                                }
                                else
                                {
                                    app.RenderError(404);
                                }
                            }
                            break;
                        }
                    }
                    else
                    {
                        if (parse.SegmentType == SegmentType.Admin && parse.Segments.Count == 1)
                        {
                            parse.FormatManagement();
                            app.Run(parse);
                        }
                        else
                        {
                            app.RenderError(404);
                        }
                    }
                }
                else
                {
                    app.RenderError(404);
                }
            }
        }
Exemple #7
0
        internal void Run(UrlParse parse)
        {
            Reset();

            if (parse.Segments.Count > 0)
            {
                _ctlName = parse.Segments[0];
            }
            else
            {
                _ctlName = Utility.DefaultController;
            }
            _controller = CreateController(_ctlName);
            if (_controller == null)
            {
                throw new DebugException(string.Concat("Controller \"", _ctlName, "\" can not defined"));
            }

            try
            {
                _controller.InitController(this, parse.Url, parse.ExtensionType, parse.Extension);

                if (parse.Segments.Count > 1)
                {
                    _actName = parse.Segments[1];
                }
                else
                {
                    _actName = Utility.DefaultAction;
                }

                bool       isDefault = false;
                MethodInfo method    = _controller.GetType().GetMethod(_actName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.IgnoreCase);
                if (method == null)
                {
                    method = _controller.GetType().GetMethod(Utility.NormalAction, BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.IgnoreCase);
                    if (method != null)
                    {
                        isDefault = true;
                    }
                    else
                    {
                        throw new DebugException(string.Concat("Action \"", _ctlName, ".", _actName, "\" can not defined"));
                    }
                }

                Type     type;
                object[] attrs = method.GetCustomAttributes(true);
                foreach (object attr in attrs)
                {
                    if (attr != null)
                    {
                        type = attr.GetType();
                        if (TType <ActionMethodSelectorAttribute> .Type.IsAssignableFrom(type))
                        {
                            ActionMethodSelectorAttribute selector = (ActionMethodSelectorAttribute)attr;
                            if (!selector.IsValidForRequest(_controller, method))
                            {
                                if (TType <AuthorizeAttribute> .Type.IsAssignableFrom(type))
                                {
                                    _controller.Unauthorized(((AuthorizeAttribute)attr).Redirect);
                                }
                                else
                                {
                                    _controller.NotFound();
                                }
                                goto EndLine;
                            }
                        }
                    }
                }

                int             argsn = 0;
                object[]        args  = null;
                ParameterInfo[] ps    = method.GetParameters();
                if (ps != null)
                {
                    argsn = ps.Length;
                }
                bool hasArgs = (ps.Length > 0 && ps[ps.Length - 1].ParameterType == TType <Arguments> .Type);
                if (!isDefault && (parse.Segments.Count - 2) > argsn && !hasArgs)
                {
                    StringBuilder sb = new StringBuilder(string.Concat("Action \"", _ctlName, ".", _actName, "("));
                    for (int i = 0; i < ps.Length; ++i)
                    {
                        if (i > 0)
                        {
                            sb.Append(", ");
                        }
                        sb.Append(ps[i].ParameterType.Name);
                    }
                    sb.Append(")\" 参数不匹配");
                    throw new DebugException(sb.ToString());
                }
                if (argsn > 0)
                {
                    int    x;
                    string s;
                    int    setp  = 2;
                    int    begin = 0;
                    args = new object[argsn];
                    if (isDefault)
                    {
                        setp    = 1;
                        begin   = 1;
                        args[0] = _actName;
                    }
                    for (int i = begin; i < argsn; ++i)
                    {
                        x = i + setp;
                        if (hasArgs && i == (argsn - 1))
                        {
                            args[i] = new Arguments(parse.Segments, x);
                        }
                        else
                        {
                            if (x < parse.Segments.Count)
                            {
                                s = parse.Segments[x];
                            }
                            else
                            {
                                s = null;
                            }
                            args[i] = FormatParameter(ps[i], s);
                        }
                    }
                }
                _action = string.Concat(_ctlName, ".", _actName).ToLower();
                method.Invoke(_controller, args);
EndLine:
                _controller.End();
            }
            finally
            {
                ReleaseController();
            }
        }