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); }
public ITransport Build(string transportName, string transportUrl, string originalTransportUrl, ITransportOptions options) { return(new XhrPollingTransport(transportUrl)); }
public ITransport Build(string transportName, string transportUrl, string originalTransportUrl, ITransportOptions options) { return(new WebSocketTransport(transportUrl, originalTransportUrl, options)); }
private XhrCorsObject(string method, string url, string payload, ITransportOptions opts) : base(method, url, payload, opts) { }
public static IAjaxObject Build(string method, string url, string payload, ITransportOptions opts = default) { var obj = new XhrCorsObject(method, url, payload, opts); return(obj); }
public WebSocketDriver(Uri url, string[] protocols, ITransportOptions options) { this._url = url; this._socket = new ClientWebSocket(); this.Connect().Wait(); }
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); }