コード例 #1
0
        public void Handle()
        {
            try
            {
                string mode = mRequestForms["mode"];
                if (mode == "init")
                {
                    this.mSendFunc(Guid.NewGuid().ToString());
                }
                else if (mode == "heart")
                {
                    string id = mRequestForms["id"];
                    if (ActivedVirtualWebSocketHandler.ContainsKey(id))
                    {
                        var remotingHandler = (RemotingClientHandler)ActivedVirtualWebSocketHandler[id];
                        if (remotingHandler != null)
                        {
                            remotingHandler._heartTime = DateTime.Now;
                        }
                    }
                }
                else if (mode == "receive")
                {
                    string id         = mRequestForms["id"];
                    string binaryType = mRequestForms["binaryType"];

                    RemotingClientHandler remotingHandler;

                    if (ActivedVirtualWebSocketHandler.ContainsKey(id))
                    {
                        remotingHandler = (RemotingClientHandler)ActivedVirtualWebSocketHandler[id];
                    }
                    else
                    {
                        remotingHandler = new ScriptRemoting.RemotingClientHandler(null, null, mClientIP, _Referer, _GetHeaderValueHandler);

                        ActivedVirtualWebSocketHandler.Add(id, remotingHandler);
                    }
                    remotingHandler.Tag2 = true;
                    if (remotingHandler.mSendDataFunc == null)
                    {
                        remotingHandler.mSendDataFunc = (data) =>
                        {
                            try
                            {
                                int count = 0;
                                while (remotingHandler.Tag1 == null && count < 2000)
                                {
                                    System.Threading.Thread.Sleep(10);
                                    count++;
                                }

                                RemotingClientHandler.SendDataHandler func = remotingHandler.Tag1 as RemotingClientHandler.SendDataHandler;
                                if (func == null)
                                {
                                    if (ActivedVirtualWebSocketHandler.ContainsKey(id))
                                    {
                                        remotingHandler.OnDisconnected();
                                        ActivedVirtualWebSocketHandler.Remove(id);
                                    }
                                    remotingHandler.mCloseStreamHandler.Invoke();
                                    return;
                                }
                                remotingHandler.Tag2 = false;
                                remotingHandler.Tag1 = null;
                                func.Invoke(data);
                            }
                            catch
                            {
                            }
                        };
                    }
                    remotingHandler.mCloseStreamHandler = () =>
                    {
                        try
                        {
                            remotingHandler.OnDisconnected();
                            mCloseConnectionFunc();
                            ActivedVirtualWebSocketHandler.Remove(id);
                        }
                        catch
                        {
                        }
                    };
                    remotingHandler.Tag1 = mSendFunc;

                    if (mWaitForCloseFunc() == 0)//如果不是0,表示是mvc结构,无法检测socket的断开状态
                    {
                        if ((bool)remotingHandler.Tag2)
                        {
                            remotingHandler.OnDisconnected();
                            if (ActivedVirtualWebSocketHandler.ContainsKey(id))
                            {
                                ActivedVirtualWebSocketHandler.Remove(id);
                            }
                        }
                    }
                    return;
                }
                else if (mode == "send")
                {
                    string data       = mRequestForms["data"];
                    string id         = mRequestForms["id"];
                    string binaryType = mRequestForms["binaryType"];
                    int    count      = 0;
                    while (!ActivedVirtualWebSocketHandler.ContainsKey(id) && count < 300)
                    {
                        System.Threading.Thread.Sleep(10);
                        count++;
                    }
                    if (ActivedVirtualWebSocketHandler.ContainsKey(id))
                    {
                        RemotingClientHandler handler = (RemotingClientHandler)ActivedVirtualWebSocketHandler[id];
                        try
                        {
                            if (binaryType == "arraybuffer")
                            {
                                string[] strArr = data.Split('%');
                                byte[]   bs     = new byte[strArr.Length - 1];
                                for (int i = 1; i < strArr.Length; i++)
                                {
                                    bs[i - 1] = (byte)Convert.ToInt32(strArr[i], 16);
                                }
                                handler.OnReceived(bs);
                            }
                            else
                            {
                                handler.OnReceived(data);
                            }
                        }
                        catch
                        {
                        }
                    }
                    mSendFunc("");
                }
            }
            catch
            {
            }
            //wait for close
            mWaitForCloseFunc();
        }
コード例 #2
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();
        }