コード例 #1
0
        public override Task Invoke(IOwinContext context)
        {
            if (context.Request.Method == "POST")
            {
                context.Response.StatusCode = ( int )System.Net.HttpStatusCode.MethodNotAllowed;
                return(context.Response.WriteAsync("Not Found ==> {0}"));
            }
            string  req     = context.Request.Path.Value;
            IUrlReq request = Util.GetRequest(context.Request.Path.Value);

            if (request == null)
            {
                context.Response.StatusCode = ( int )System.Net.HttpStatusCode.NotFound;
                return(context.Response.WriteAsync(string.Format("Not Found ==> {0}", req)));
            }
            var orgin = context.Request.Headers.Get("Origin");

            if (orgin != null)
            {
                var uri = new Uri(orgin);
                if (context.Request.Host.Value != uri.Host)
                {
                    if (!Hubs.HubConfig.EnableCrossDomain)
                    {
                        context.Response.StatusCode = ( int )System.Net.HttpStatusCode.Forbidden;
                        return(context.Response.WriteAsync(string.Format("Not Allowed for Orgin ==> {0}", orgin)));
                    }

                    if (Hubs.HubConfig.CrossDomains != null)
                    {
                        var item = Hubs.HubConfig.CrossDomains.FirstOrDefault(a => a == uri.Host);
                        if (item == null)
                        {
                            context.Response.StatusCode = ( int )System.Net.HttpStatusCode.Forbidden;
                            return(context.Response.WriteAsync(string.Format("Not Allowed for Orgin ==> {0}", orgin)));
                        }
                    }
                    if (request.M == "connect")
                    {
                        context.Response.Headers.Add("Access-Control-Allow-Origin", new string[] { "*" });
                    }
                    else
                    {
                        context.Response.Headers.Add("Access-Control-Allow-Origin", new string[] { orgin });
                    }
                    context.Response.Headers.Add("Access-Control-Allow-Credentials", new string[] { "true" });
                    context.Response.Headers.Add("Access-Control-Allow-Methods", new string[] { "GET" });
                    context.Response.Headers.Add("Access-Control-Max-Age", new string[] { "3600" });
                    context.Response.Headers.Add("Access-Control-Allow-Headers", new string[] { "Content-Type, Accept, X-Requested-With, remember-me" });
                }
            }
            if (request.M != "proxy")
            {
                if (request.M != "connect")
                {
                    if (request.M != "__internal__")
                    {
                        if (request.M == "heart")
                        {
                            context.Response.ContentType = "application/json";
                            return(context.Response.WriteAsync(new JavaScriptSerializer( ).Serialize(new {
                                beat = "Yes"
                            })));
                        }
                        context.Response.StatusCode = ( int )System.Net.HttpStatusCode.NotFound;
                        return(context.Response.WriteAsync(string.Format("Not Found ==> {0}", req)));
                    }
                }
            }
            T socketConnection = Activator.CreateInstance <T>( );

            if (request.M == "proxy")
            {
                if (!Hubs.HubConfig.EnableJavaScriptProxies)
                {
                    context.Response.StatusCode = ( int )System.Net.HttpStatusCode.NotFound;
                    return(context.Response.WriteAsync(string.Format("Not Found ==> {0}", req)));
                }
                Type type;
                type = Util.GetType(request.H, socketConnection.GetType( ));
                if (type == null)
                {
                    context.Response.StatusCode = ( int )System.Net.HttpStatusCode.NotFound;
                    return(context.Response.WriteAsync(string.Format("Not Found ==> {0}", req)));
                }
                MethodInfo[]   methodInfoArray = type.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public);
                IList <string> serverProxy     = new List <string>( );
                (
                    from a in (IEnumerable <MethodInfo>)methodInfoArray
                    where (a.IsAbstract ? false : !a.IsVirtual)
                    select a).Select <MethodInfo, MethodInfo>(( MethodInfo a ) => {
                    serverProxy.Add(a.Name);
                    return(a);
                }).ToList <MethodInfo>( );
                IList <string> clientProxy = new List <string>( );

                context.Response.ContentType = "text/javascript";
                return(context.Response.WriteAsync(string.Concat(new string[] { "/*[\r\n* Sow.Api.Hub==> Server Proxy\r\n* System Generated==>" + DateTime.Now.ToString( ) + "\r\n]*/\r\n( function () {\r\n\tif ( typeof ( Sow ) !== 'object' )\r\n\t\tthrow new Error( 'sow.framework.js required.' );\r\n\tif ( typeof ( Sow.define ) !== 'function' )\r\n\t\tthrow new Error( 'sow.framework.js required.' );\r\n\tSow.define( 'Sow.Api.Hub.", request.H, "', function ( ) {\r\n\t\treturn {\r\n\t\t\tgetServerProxy: function ( ) {\r\n\t\t\t\treturn ", socketConnection._jss.Serialize(serverProxy), ";\r\n\t\t\t}\r\n\t\t};\r\n\t} );\r\n}() );" })));
            }
            if (request.M == "__internal__")
            {
                if (!Hubs.HubConfig.AllowInternalRequest)
                {
                    context.Response.StatusCode = ( int )System.Net.HttpStatusCode.NotFound;
                    return(context.Response.WriteAsync(string.Format("Not Found ==> {0}", req)));
                }
                return(socketConnection.AcceptSocketAsync(request, false, context, null));
            }
            IDictionary <string, string> matches = new Dictionary <string, string>( );

            if (_mMatchPattern != null)
            {
                Match match = _mMatchPattern.Match(context.Request.Path.Value);
                if (!match.Success)
                {
                    return(Next?.Invoke(context) ?? completedTask);
                }
                for (int i = 1; i <= match.Groups.Count; i++)
                {
                    string name  = _mMatchPattern.GroupNameFromNumber(i);
                    Group  value = match.Groups[i];
                    matches.Add(name, value.Value);
                }
            }
            bool isReconnect = string.IsNullOrEmpty(context.Request.Query["r"]) == false;

            //socketConnection.is
            return(socketConnection.AcceptSocketAsync(request, isReconnect, context, matches));
        }
コード例 #2
0
ファイル: Hubs.cs プロジェクト: rajibchy/WebHub
        internal async Task AcceptSocketAsync(IUrlReq request, bool isReconnect, IOwinContext context, IDictionary <string, string> argumentMatches)
        {
            this.IsReconnect = isReconnect;
            if (context.Request.User != null)
            {
                if (context.Request.User.Identity != null)
                {
                    this.IsAuthenticated = context.Request.User.Identity.IsAuthenticated;
                    this.UserName        = context.Request.User.Identity.Name;
                }
            }
            string value = context.Request.Path.Value;

            if (request == null)
            {
                context.Response.StatusCode = ( int )System.Net.HttpStatusCode.NotFound;
                await context.Response.WriteAsync(string.Format("Not Found ==> {0}", value));

                return;
            }
            Type type;

            type = Util.GetType(request.H, this.GetType( ));
            if (type == null)
            {
                await context.Response.WriteAsync(string.Format("Not Found ==> {0}", value ?? "/"));

                context.Response.StatusCode = ( int )System.Net.HttpStatusCode.NotFound;
                return;
            }
            if (type.Name != request.H)
            {
                await context.Response.WriteAsync(string.Format("Not Found ==> {0}", value ?? "/"));

                context.Response.StatusCode = ( int )System.Net.HttpStatusCode.NotFound;
                return;
            }
            this.hubName = request.H;
            if (argumentMatches is null && request.M == "__internal__")
            {
                this._ConnectionId = Guid.NewGuid( ).ToString("N");
                this._Context      = context;
                await this.ProcessInternalRequest( );

                return;
            }
            var accept = context.Get <Action <IDictionary <string, object>, Func <IDictionary <string, object>, Task> > >("websocket.Accept");

            if (accept == null)
            {
                context.Response.StatusCode = ( int )System.Net.HttpStatusCode.BadRequest;
                context.Response.Write("Not a valid websocket request");
                return;
            }
            this._ConnectionId = Guid.NewGuid( ).ToString("N");

            Arguments = new Dictionary <string, string>(argumentMatches);

            context.Environment.Get <Action>("server.DisableResponseBuffering")?.Invoke( );

            context.Environment.Get <Action>("systemweb.DisableResponseCompression")?.Invoke( );

            context.Response.Headers.Set("X-Content-Type-Options", "nosniff");

            context.Response.Headers.Set("X-Content-Type-Options", "nosniff");
            context.Response.Headers.Set("X-Powered-By", "https://www.safeonlineworld.com");
            this._Context = context;
            if (this.AuthenticateRequest( ))
            {
                accept(null, new Func <IDictionary <string, object>, Task>(this.RunWebSocket));
                return;
            }
            if (!await this.AuthenticateRequestAsync( ))
            {
                bool flag = (context.Request.User == null ? false : context.Request.User.Identity.IsAuthenticated);
                if (!flag)
                {
                    context.Response.StatusCode = 401;
                    return;
                }
                context.Response.StatusCode = 403;
                return;
            }
            accept(null, new Func <IDictionary <string, object>, Task>(this.RunWebSocket));
            return;
        }