Пример #1
0
        private WebSocketTransport(string transportUrl, string originalTransportUrl, ITransportOptions options)
        {
            if (!WebSocketTransport.IsEnabled)
            {
                throw new Exception("Transport created when disabled");
            }
            Log.Debug($"{nameof(WebSocketTransport)}: Constructor {transportUrl}");

            var url = new Uri(transportUrl).AddPath("/websocket");

            url = new UriBuilder(url)
            {
                Scheme = url.Scheme == "https" ? "wss" : "ws"
            }.Uri;

            this.Url = url;

            this.Ws = new WebSocketDriver(this.Url, Array.Empty <string>(), options);
            this.Ws.On("message", this.WebSocketOnMessage);

            /* NOT RUNNING IN BROWSER
             * // Firefox has an interesting bug. If a websocket connection is
             * // created after onunload, it stays alive even when user
             * // navigates away from the page. In such situation let's lie -
             * // let's not open the ws connection at all. See:
             * // https://github.com/sockjs/sockjs-client/issues/28
             * // https://bugzilla.mozilla.org/show_bug.cgi?id=696085
             * this.unloadRef = utils.unloadAdd(function() {
             * debug('unload');
             * self.ws.close();
             * });
             */
            this.Ws.On("close", this.WebSocketOnClose);
            this.Ws.On("error", this.WebSocketOnError);
        }
Пример #2
0
 public ITransport Build(string transportName, string transportUrl, string originalTransportUrl, ITransportOptions options)
 {
     return(new XhrPollingTransport(transportUrl));
 }
Пример #3
0
 public ITransport Build(string transportName, string transportUrl, string originalTransportUrl, ITransportOptions options)
 {
     return(new WebSocketTransport(transportUrl, originalTransportUrl, options));
 }
Пример #4
0
 private XhrCorsObject(string method, string url, string payload, ITransportOptions opts) : base(method, url, payload, opts)
 {
 }
Пример #5
0
        public static IAjaxObject Build(string method, string url, string payload, ITransportOptions opts = default)
        {
            var obj = new XhrCorsObject(method, url, payload, opts);

            return(obj);
        }
Пример #6
0
 public WebSocketDriver(Uri url, string[] protocols, ITransportOptions options)
 {
     this._url    = url;
     this._socket = new ClientWebSocket();
     this.Connect().Wait();
 }
Пример #7
0
        protected XhrDriver(string method, string url, string payload, ITransportOptions opts)
        {
            Log.Debug($"{nameof(XhrDriver)}: {method} {url} {payload}");
            var parsedUrl = new Uri(url);

            /* NOT USING NODE.JS
             * var options = {
             *  method: method
             * , hostname: parsedUrl.hostname.replace(/\[|\]/g, '')
             * , port: parsedUrl.port
             * , path: parsedUrl.pathname + (parsedUrl.query || '')
             * , headers: opts && opts.headers
             * , agent: false
             * };
             *
             * var protocol = parsedUrl.protocol === 'https:' ? https : http;
             */

            this._client = new HttpClient();
            var request = new HttpRequestMessage();

            if (opts?.Headers != null)
            {
                foreach (var header in opts.Headers)
                {
                    request.Headers.TryAddWithoutValidation(header.Key, header.Value);
                }
            }
            request.Method     = new HttpMethod(method);
            request.RequestUri = parsedUrl;
            if (!payload.IsNullOrEmpty())
            {
                request.Content = new StringContent(payload, Encoding.UTF8);
            }

            var response = this._client.SendAsync(request, this._cts.Token);

            response.ContinueWith(t => t.Result.EnsureSuccessStatusCode())
            .ContinueWith(t => t.Result.Content.ReadAsStreamAsync().Result)
            .ContinueWith(t =>
            {
                var builder = new StringBuilder();
                var buffer  = new byte[1024];
                var read    = buffer.Length;
                while (read == buffer.Length)
                {
                    read      = t.Result.ReadAsync(buffer, 0, buffer.Length, this._cts.Token).Result;
                    var chunk = Encoding.UTF8.GetString(buffer, 0, read);
                    Log.Debug($"{nameof(XhrDriver)}: Data {chunk}");
                    builder.Append(chunk);
                    this.Emit("chunk", 200, builder.ToString());
                }

                return(builder.ToString());
            })
            .ContinueWith(t =>
            {
                Log.Debug($"{nameof(XhrDriver)}: End");
                this.Emit("finish", (int)response.Result.StatusCode, t.Result);
                request.Dispose();
                request = null;
            })
            .ContinueWith(t =>
            {
                Log.Debug($"{nameof(XhrDriver)}: Error {t.Exception?.GetBaseException() ?? t.Exception}");
                this.Emit("finish", 0, (t.Exception?.GetBaseException() ?? t.Exception)?.Message);
            }, TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.NotOnCanceled);
        }