コード例 #1
0
 /// <summary>
 /// 监听WebSocket
 /// </summary>
 /// <param name="context">HttpContext</param>
 /// <param name="userName">用户名称</param>
 public void Monitor(HttpContextBase context, string userName)
 {
     if (context.IsWebSocketRequest)
     {
         context.AcceptWebSocketRequest((c) => ProcessChat(c, userName));
     }
 }
コード例 #2
0
ファイル: RelayServer.cs プロジェクト: gfody/WebRelay
        private async Task ProcessRequestAsync(HttpContextBase context)
        {
            // block hosts with more than 10 bad requests in the last 10 seconds..
            // (item1 is last request time, item2 is count of previous requests)
            if (blockedHosts.TryGetValue(context.Request.UserHostAddress, out Tuple <DateTime, int> t) && DateTime.UtcNow.Subtract(t.Item1).TotalSeconds < 10 && t.Item2 > 10)
            {
                return;
            }

            if (context.IsWebSocketRequest)
            {
                if (AcceptSocketConnections)
                {
                    context.AcceptWebSocketRequest((Func <WebSocketContext, Task>)HandleWebsocketRequest);
                }

                return;
            }

            // get download code from querystring or subdomain..
            // (http://9fakr.mydomain.com or http://mydomain.com/9fakr or http://somedomain.dom/mysite/9fakr)
            string path            = context.Request.RawUrl.Substring(context.Request.ApplicationPath.Length).ToLower().Trim(new char[] { '/', '\\', ' ' });
            string code            = (string.IsNullOrEmpty(path) && context.Request.Url.Host.Split('.').Length == 3) ? context.Request.Url.Host.Split('.')[0].ToLower() : path;
            bool   validCode       = DownloadCode.Check(code);
            bool   mainpageRequest = (path == "") && !validCode;

            if (mainpageRequest && !(EnableBuiltinWebclient && AcceptSocketConnections))
            {
                return;
            }

            try
            {
                if (validCode)
                {
                    if (activeRelays.TryGetValue(code, out IRelay relay) && !botAgents.IsMatch(context.Request.UserAgent ?? ""))
                    {
                        await relay.HandleDownloadRequest(context);
                    }
                    else
                    {
                        context.Response.StatusCode = 410;
                    }
                }
                else if (!await staticContent.HandleRequest(context, path))
                {
                    context.Response.StatusCode = 404;
                    blockedHosts.AddOrUpdate(context.Request.UserHostAddress, new Tuple <DateTime, int>(DateTime.UtcNow, 1),
                                             (k, v) => new Tuple <DateTime, int>(DateTime.UtcNow, DateTime.UtcNow.Subtract(v.Item1).TotalSeconds < 10 ? v.Item2 + 1 : 1));
                }
            }
            finally
            {
                context.Response.OutputStream.Dispose();
            }
        }
コード例 #3
0
        public Func <Task> ProcessRequest(IConnection connection)
        {
            // Never time out for websocket requests
            connection.ReceiveTimeout = TimeSpan.FromTicks(Int32.MaxValue - 1);

            _context.AcceptWebSocketRequest(this);

            _connection = connection;

            return(() => Task.FromResult <object>(null));
        }
コード例 #4
0
ファイル: AspNetRequest.cs プロジェクト: kristineyu/SignalR
        public void AcceptWebSocketRequest(Func <IWebSocket, Task> callback)
        {
#if NET45
            _context.AcceptWebSocketRequest(ws =>
            {
                var handler = new AspNetWebSocketHandler();
                var task    = handler.ProcessWebSocketRequestAsync(ws);
                callback(handler).Then(h => h.CleanClose(), handler);
                return(task);
            });
#else
            throw new NotSupportedException();
#endif
        }
コード例 #5
0
        public Task AcceptWebSocketRequest(Func <IWebSocket, Task> callback)
        {
#if NET45
            _context.AcceptWebSocketRequest(ws =>
            {
                var handler = new SignalR.WebSockets.DefaultWebSocketHandler();
                var task    = handler.ProcessWebSocketRequestAsync(ws);
                callback(handler).Then(h => h.CleanClose(), handler);
                return(task);
            });

            return(TaskAsyncHelper.Empty);
#else
            throw new NotSupportedException();
#endif
        }
コード例 #6
0
ファイル: cdeWSockets.cs プロジェクト: TRUMPF-IoT/C-DEngine
 public void ProcessRequest(HttpContextBase context)
 {
     if (context.IsWebSocketRequest)
     {
         if (AccessCode == null)
         {
             AccessCode = TheBaseAssets.MySettings.GetSetting("WSTestCode");
         }
         if (!string.IsNullOrEmpty(AccessCode))
         {
             var RequestUri = HttpContext.Current.Request.Url;
             if (!RequestUri.PathAndQuery.Contains(AccessCode))
             {
                 return;
             }
         }
         context.AcceptWebSocketRequest(ProcessSocketRequest);
     }
 }
コード例 #7
0
 public override void AcceptWebSocketRequest(Func <AspNetWebSocketContext, Task> userFunc)
 {
     _inner.AcceptWebSocketRequest(userFunc);
 }
コード例 #8
0
        public IAsyncResult BeginProcessRequest(HttpContextBase context, AsyncCallback callback, object state)
        {
            var tcs = new TaskCompletionSource <Action>(state);

            if (callback != null)
            {
                tcs.Task.ContinueWith(task => callback(task), TaskContinuationOptions.ExecuteSynchronously);
            }

            var request  = context.Request;
            var response = context.Response;

            var pathBase = request.ApplicationPath;

            if (pathBase == "/" || pathBase == null)
            {
                pathBase = string.Empty;
            }

            if (root != null)
            {
                pathBase += root;
            }

            var path = request.Path;

            if (path.StartsWith(pathBase))
            {
                path = path.Substring(pathBase.Length);
            }

            var serverVarsToAddToEnv = request.ServerVariables.AllKeys
                                       .Where(key => !key.StartsWith("HTTP_") && !string.Equals(key, "ALL_HTTP") && !string.Equals(key, "ALL_RAW"))
                                       .Select(key => new KeyValuePair <string, object>(key, request.ServerVariables.Get(key)));

            var env = new Dictionary <string, object>();

            env[OwinConstants.Version]            = "1.0";
            env[OwinConstants.RequestMethod]      = request.HttpMethod;
            env[OwinConstants.RequestScheme]      = request.Url.Scheme;
            env[OwinConstants.RequestPathBase]    = pathBase;
            env[OwinConstants.RequestPath]        = path;
            env[OwinConstants.RequestQueryString] = request.ServerVariables["QUERY_STRING"];
            env[OwinConstants.RequestProtocol]    = request.ServerVariables["SERVER_PROTOCOL"];
            env[OwinConstants.RequestBody]        = request.InputStream;
            env[OwinConstants.RequestHeaders]     = request.Headers.AllKeys
                                                    .ToDictionary(x => x, x => request.Headers.GetValues(x), StringComparer.OrdinalIgnoreCase);

            if (request.ClientCertificate != null && request.ClientCertificate.Certificate.Length != 0)
            {
                env[OwinConstants.ClientCertificate] = new X509Certificate(request.ClientCertificate.Certificate);
            }

            env[OwinConstants.CallCancelled] = CancellationToken.None;

            env[OwinConstants.ResponseHeaders] = new Dictionary <string, string[]>(StringComparer.OrdinalIgnoreCase);

            int?responseStatusCode = null;

            env[OwinConstants.ResponseBody] =
                new TriggerStream(response.OutputStream)
            {
                OnFirstWrite = () =>
                {
                    responseStatusCode  = Get <int>(env, OwinConstants.ResponseStatusCode, 200);
                    response.StatusCode = responseStatusCode.Value;

                    object reasonPhrase;
                    if (env.TryGetValue(OwinConstants.ResponseReasonPhrase, out reasonPhrase))
                    {
                        response.StatusDescription = Convert.ToString(reasonPhrase);
                    }

                    var responseHeaders = Get <IDictionary <string, string[]> >(env, OwinConstants.ResponseHeaders, null);
                    if (responseHeaders != null)
                    {
                        foreach (var responseHeader in responseHeaders)
                        {
                            foreach (var headerValue in responseHeader.Value)
                            {
                                response.AddHeader(responseHeader.Key, headerValue);
                            }
                        }
                    }
                }
            };

            SetEnvironmentServerVariables(env, serverVarsToAddToEnv);

            env[OwinConstants.HttpContextBase] = context;

#if ASPNET_WEBSOCKETS
            if (context.IsWebSocketRequest)
            {
                env[OwinConstants.WebSocketVersion] = "1.0";
                env[OwinConstants.WebSocketSupport] = "WebSocketFunc";
            }
#endif

            response.BufferOutput = false;

            try
            {
                appFunc(env)
                .ContinueWith(t =>
                {
                    if (t.IsFaulted)
                    {
                        tcs.TrySetException(t.Exception.InnerExceptions);
                    }
                    else if (t.IsCanceled)
                    {
                        tcs.TrySetCanceled();
                    }
                    else
                    {
#if ASPNET_WEBSOCKETS
                        object tempWsBodyDelegate;

                        if (responseStatusCode == null)
                        {
                            responseStatusCode = Get <int>(env, OwinConstants.ResponseStatusCode, 200);
                        }

                        if (responseStatusCode.Value == 101 &&
                            env.TryGetValue(OwinConstants.WebSocketFunc, out tempWsBodyDelegate) &&
                            tempWsBodyDelegate != null)
                        {
                            var wsBodyDelegate = (WebSocketFunc)tempWsBodyDelegate;
                            context.AcceptWebSocketRequest(async websocketContext =>                       // todo: AcceptWebSocketRequest throws error
                            {
                                var webSocket = websocketContext.WebSocket;

                                var wsEnv = new Dictionary <string, object>(StringComparer.OrdinalIgnoreCase);
                                wsEnv[OwinConstants.WebSocketSendAsyncFunc]    = WebSocketSendAsync(webSocket);
                                wsEnv[OwinConstants.WebSocketReceiveAsyncFunc] = WebSocketReceiveAsync(webSocket);
                                wsEnv[OwinConstants.WebSocketCloseAsyncFunc]   = WebSocketCloseAsync(webSocket);
                                wsEnv[OwinConstants.WebSocketVersion]          = "1.0";
                                wsEnv[OwinConstants.WebSocketCallCancelled]    = CancellationToken.None;
                                wsEnv[OwinConstants.AspNetWebSocketContext]    = websocketContext;

                                await wsBodyDelegate(wsEnv);

                                switch (webSocket.State)
                                {
                                case WebSocketState.Closed:                            // closed gracefully, no action needed
                                case WebSocketState.Aborted:                           // closed abortively, no action needed
                                    break;

                                case WebSocketState.CloseReceived:
                                    await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
                                    break;

                                case WebSocketState.Open:
                                case WebSocketState.CloseSent:                           // No close received, abort so we don't have to drain the pipe.
                                    websocketContext.WebSocket.Abort();
                                    break;

                                default:
                                    throw new ArgumentOutOfRangeException("state", webSocket.State, string.Empty);
                                }

                                response.Close();
                            });
                        }
#endif
                        tcs.TrySetResult(() => { });
                    }
                });
            }
            catch (Exception ex)
            {
                tcs.TrySetException(ex);
            }

            return(tcs.Task);
        }