예제 #1
0
        public Task Invoke(IDictionary<string, object> env)
        {
            var opaqueUpgrade = env.Get<OpaqueUpgrade>("opaque.Upgrade");
            var webSocketAccept = env.Get<WebSocketAccept>(Constants.WebSocketAcceptKey);

            if (opaqueUpgrade != null
                && webSocketAccept == null
                && IsWebSocketRequest(env))
            {
                // Add websocket support
                env[Constants.WebSocketAcceptKey] = new WebSocketAccept(
                    (options, callback) =>
                    {
                        if (callback == null)
                        {
                            throw new ArgumentNullException("callback");
                        }

                        env[Constants.ResponseStatusCodeKey] = 101;

                        SetWebSocketResponseHeaders(env, options);

                        opaqueUpgrade(options,
                            opaqueEnv =>
                            {
                                var webSocket = new WebSocketLayer(opaqueEnv);
                                return callback(webSocket.Environment)
                                    .Then(() => webSocket.CleanupAsync());
                            });
                    });
            }

            return _next(env);
        }
예제 #2
0
        public Task Invoke(IDictionary <string, object> env)
        {
            var opaqueUpgrade   = env.Get <OpaqueUpgrade>("opaque.Upgrade");
            var webSocketAccept = env.Get <WebSocketAccept>(Constants.WebSocketAcceptKey);

            if (opaqueUpgrade != null &&
                webSocketAccept == null &&
                IsWebSocketRequest(env))
            {
                // Add websocket support
                env[Constants.WebSocketAcceptKey] = new WebSocketAccept(
                    (options, callback) =>
                {
                    if (callback == null)
                    {
                        throw new ArgumentNullException("callback");
                    }

                    env[Constants.ResponseStatusCodeKey] = 101;

                    SetWebSocketResponseHeaders(env, options);

                    opaqueUpgrade(options,
                                  opaqueEnv =>
                    {
                        var webSocket = new WebSocketLayer(opaqueEnv);
                        return(callback(webSocket.Environment)
                               .Then(() => webSocket.CleanupAsync()));
                    });
                });
            }

            return(_next(env));
        }