コード例 #1
0
        public void Handle()
        {
            try
            {
                if (_context.Request.Headers.ContainsKey("Connection") == false)
                {
                    _context.Response.Headers["Connection"] = "Keep-Alive";
                }
                else
                {
                    _context.Response.Headers["Connection"] = _context.Request.Headers["Connection"];
                }
                //访问ts脚本
                if (_context.Request.Headers["GET"].ToSafeString().EndsWith("/WayScriptRemoting", StringComparison.CurrentCultureIgnoreCase))
                {
                    outputFile(null, HttpServer.ScriptFilePath);
                }
                else if (_context.Request.Headers["POST"].ToSafeString().StartsWith("/wayscriptremoting_invoke?a=", StringComparison.CurrentCultureIgnoreCase))
                {
                    _context.Request.urlRequestHandler();
                    string json = _context.Request.Form["m"];
                    RemotingClientHandler rs = new ScriptRemoting.RemotingClientHandler((string data) =>
                    {
                        _context.Response.WriteStringBody(data);
                    }, null, _context.Request.RemoteEndPoint.ToString().Split(':')[0], (string)_context.Request.Headers["Referer"],
                                                                                        (key) =>
                    {
                        return(_context.Request.Headers[key]);
                    });
                    rs.OnReceived(json);
                }
                else if (_context.Request.Headers["POST"].ToSafeString().StartsWith("/wayscriptremoting_recreatersa?a=", StringComparison.CurrentCultureIgnoreCase))
                {
                    _context.Request.urlRequestHandler();
                    string json = _context.Request.Form["m"];
                    RemotingClientHandler rs = new ScriptRemoting.RemotingClientHandler((string data) =>
                    {
                        _context.Response.WriteStringBody(data);
                    }, null, _context.Request.RemoteEndPoint.ToString().Split(':')[0], (string)_context.Request.Headers["Referer"],
                                                                                        (key) =>
                    {
                        return(_context.Request.Headers[key]);
                    });
                    rs.handleReCreateRSA(json.FromJson <MessageBag>());
                }
                else if (_context.Request.Headers["POST"].ToSafeString().EndsWith("?WayVirtualWebSocket=1", StringComparison.CurrentCultureIgnoreCase) ||
                         _context.Request.Headers["POST"].ToSafeString().EndsWith("&WayVirtualWebSocket=1", StringComparison.CurrentCultureIgnoreCase))
                {
                    _context.Request.urlRequestHandler();
                    new VirtualWebSocketHandler(_context.Request.Form, (data) =>
                    {
                        _context.Response.WriteStringBody(data);
                    }, () =>
                    {
                        _context.Response.End();

                        return(0);
                    }, () =>
                    {
                        _context.Response.CloseSocket();
                        return(0);
                    }, _context.Request.RemoteEndPoint.ToString().Split(':')[0], (string)_context.Request.Headers["Referer"],
                                                (key) =>
                    {
                        return(_context.Request.Headers[key]);
                    }

                                                ).Handle();

                    return;
                }
                else
                {
                    string url = (_context.Request.Headers["GET"] == null ? _context.Request.Headers["POST"] : _context.Request.Headers["GET"]).ToSafeString();

                    if (url.Contains("?"))
                    {
                        MatchCollection matches = Regex.Matches(url, @"(?<n>(\w)+)\=(?<v>([^\=\&])+)");
                        foreach (Match m in matches)
                        {
                            _context.Request.Query[m.Groups["n"].Value] = WebUtility.UrlDecode(m.Groups["v"].Value);
                        }
                        url = url.Substring(0, url.IndexOf("?"));
                    }


                    string ext = Path.GetExtension(url).ToLower();
                    if (NotAllowDownloadFiles.Contains(ext))
                    {
                        //不能访问dll exe等文件
                        throw new Exception("not allow");
                    }


                    try
                    {
                        _context.Request.urlRequestHandler();
                    }
                    catch (Exception ex)
                    {
                    }

                    if ((_context.Server.Routers.Count > 0 || _context.Server.Handlers.Count > 0) && _currentHttpConnectInformation == null)
                    {
                        _currentHttpConnectInformation = new HttpConnectInformation(_context.Request, _context.Response);
                        //先设一个默认controller,后面具体controller可以替换
                        _context.Controller = new RemotingController()
                        {
                            Session = _currentHttpConnectInformation.Session
                        };
                    }

                    url = getUrl(url);

                    checkHandlers(url);
                    if (_context.Response.mClient == null)
                    {
                        throw new Exception("ended");
                    }

                    var controllerConfig = ControllerUrlConfig.FirstOrDefault(m => url.StartsWith(m.Key, StringComparison.CurrentCultureIgnoreCase) && url.Substring(m.Key.Length).Contains("/") == false);
                    if (controllerConfig.Value != null)
                    {
                        RemotingClientHandler rs = new ScriptRemoting.RemotingClientHandler(null, null, _context.Request.RemoteEndPoint.ToString().Split(':')[0], null, null);
                        rs.handleUrlMethod(controllerConfig.Value, url.Substring(controllerConfig.Key.Length));
                    }
                    else
                    {
                        if (url.Length == 0 || url == "/")
                        {
                            url = _context.Server.WebPathManger.GetFileUrl("/index.html");
                        }
                        if (Path.GetExtension(url).IsNullOrEmpty())//访问的路径如果没有扩展名,默认指向.html文件
                        {
                            url = _context.Server.WebPathManger.GetFileUrl($"{url}.html");
                        }
                        else
                        {
                            url = _context.Server.WebPathManger.GetFileUrl(url);
                        }

                        if (_context.Response.mClient != null)
                        {
                            string filepath = url;
                            if (filepath.StartsWith("/"))
                            {
                                filepath = filepath.Substring(1);
                            }
                            filepath = Path.GetFullPath(_context.Server.Root + filepath);
                            if (filepath.ToLower().Contains(_context.Server.Root.ToLower()) == false)
                            {
                                //访问了Root范围外文件
                                _context.Response.SendFileNotFound();
                            }
                            else
                            {
                                outputFile(url, filepath);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
            }

            _context.Request.Dispose();
            _context.Response.End();
        }