Ejemplo n.º 1
0
        public void GetResponse(Action<Exception, WebSocketResponse> callback)
        {
            //------------------------------------------
            // create method
            //------------------------------------------

            string http = string.Format("{0} {1} HTTP/1.1", this.Method.ToUpper(), this.Uri.PathAndQuery);

            //------------------------------------------
            // create header
            //------------------------------------------

            this.Headers["Cache-Control"]            = "no-cache";

            this.Headers["Connection"]               = "upgrade";

            this.Headers["Host"]                     = this.Uri.Authority;

            this.Headers["Pragma"]                   = "no-cache";

            this.Headers["Sec-WebSocket-Extensions"] = "permessage-deflate";

            this.Headers["Sec-WebSocket-Key"]        = this.CreateSecWebSocketKey();

            this.Headers["Sec-WebSocket-Version"]    = "13";

            this.Headers["Upgrade"]                  = "websocket";

            this.Headers["User-Agent"]               = "Reactor.Web.Sockets.WebSocket";

            //------------------------------------------
            // build request
            //------------------------------------------

            var buffer = Reactor.Buffer.Create();

            buffer.Write(http + "\r\n");

            foreach (var pair in this.Headers)
            {
                buffer.Write("{0}: {1}\r\n", pair.Key, pair.Value);
            }

            buffer.Write("\r\n");

            //------------------------------------------
            // resolve port
            //------------------------------------------

            var port = this.Uri.Port;

            if (port == -1)
            {
                switch(this.Uri.Scheme)
                {
                    case "ws" : port = 80; break;

                    case "wss": port = 443; break;

                    default: break;
                }
            }

            //------------------------------------------
            // send request
            //------------------------------------------

            this.socket = Reactor.Tcp.Socket.Create(this.Uri.DnsSafeHost, port);

            this.socket.OnConnect += () =>
            {
                this.socket.Write(buffer, (exception) =>
                {
                    if (exception != null)
                    {
                        callback(exception, null);

                        return;
                    }

                    Reactor.Action<Buffer> ondata = null;

                    ondata = (data) => {

                        this.socket.OnData -= ondata;

                        var response = new Reactor.Web.Socket.WebSocketResponse(this.socket, data);

                        callback(null, response);
                    };

                    this.socket.OnData += ondata;
                });
            };

            this.socket.OnError += (exception) =>
            {
                callback(exception, null);
            };
        }
Ejemplo n.º 2
0
        public void GetResponse(Action <Exception, WebSocketResponse> callback)
        {
            //------------------------------------------
            // create method
            //------------------------------------------

            string http = string.Format("{0} {1} HTTP/1.1", this.Method.ToUpper(), this.Uri.PathAndQuery);

            //------------------------------------------
            // create header
            //------------------------------------------

            this.Headers["Cache-Control"] = "no-cache";

            this.Headers["Connection"] = "upgrade";

            this.Headers["Host"] = this.Uri.Authority;

            this.Headers["Pragma"] = "no-cache";

            this.Headers["Sec-WebSocket-Extensions"] = "permessage-deflate";

            this.Headers["Sec-WebSocket-Key"] = this.CreateSecWebSocketKey();

            this.Headers["Sec-WebSocket-Version"] = "13";

            this.Headers["Upgrade"] = "websocket";

            this.Headers["User-Agent"] = "Reactor.Web.Sockets.WebSocket";

            //------------------------------------------
            // build request
            //------------------------------------------

            var buffer = Reactor.Buffer.Create();

            buffer.Write(http + "\r\n");

            foreach (var pair in this.Headers)
            {
                buffer.Write("{0}: {1}\r\n", pair.Key, pair.Value);
            }

            buffer.Write("\r\n");

            //------------------------------------------
            // resolve port
            //------------------------------------------

            var port = this.Uri.Port;

            if (port == -1)
            {
                switch (this.Uri.Scheme)
                {
                case "ws": port = 80; break;

                case "wss": port = 443; break;

                default: break;
                }
            }

            //------------------------------------------
            // send request
            //------------------------------------------

            this.socket = Reactor.Tcp.Socket.Create(this.Uri.DnsSafeHost, port);

            this.socket.OnConnect += () =>
            {
                this.socket.Write(buffer, (exception) =>
                {
                    if (exception != null)
                    {
                        callback(exception, null);

                        return;
                    }

                    Reactor.Action <Buffer> ondata = null;

                    ondata = (data) => {
                        this.socket.OnData -= ondata;

                        var response = new Reactor.Web.Socket.WebSocketResponse(this.socket, data);

                        callback(null, response);
                    };

                    this.socket.OnData += ondata;
                });
            };

            this.socket.OnError += (exception) =>
            {
                callback(exception, null);
            };
        }