private void SendSessionCreationRequest() { var body = new Body { VerAttr = "1.6", RidAttr = _rid, WaitAttr = Wait, HoldAttr = Hold, FromAttr = _manager.Settings.Id.Bare, ToAttr = _manager.Settings.Id.Server }; var resp = SendRequest(body); if (null != resp) { IsConnected = true; _manager.Events.Connected(this); _sid = resp.SidAttr; _requests = resp.RequestsAttr; _connectionsCounter = new SemaphoreSlim(_requests.Value, _requests.Value); var payload = resp.Element <Tags.Streams.Features>(Tags.Streams.Namespace.Features); _manager.SetAndExecState(new ServerFeaturesState(_manager), data: payload); } }
private void ExtractBody(Body resp) { if (null != resp) { foreach (var element in resp.Elements()) { _manager.Events.NewTag(this, Tag.Get(element)); } } }
private Body CombineBody() { var body = new Body { SidAttr = _sid, RidAttr = Interlocked.Increment(ref _rid), FromAttr = _manager.Settings.Id, ToAttr = _manager.Settings.Id.Server }; CombineBody(body); return(body); }
private void SendSessionTerminationRequest() { var body = new Body { SidAttr = _sid, RidAttr = Interlocked.Increment(ref _rid), TypeAttr = "terminate" }; body.Add(new Presence { TypeAttr = Presence.TypeEnum.unavailable }); SendRequest(body); }
private void SendRestartRequest() { var body = new Body { SidAttr = _sid, RidAttr = Interlocked.Increment(ref _rid), RestartAttr = true, ToAttr = _manager.Settings.Id.Server }; var resp = SendRequest(body); if (null != resp) { var payload = resp.Element <Tags.Streams.Features>(Tags.Streams.Namespace.Features); _manager.SetAndExecState(new ServerFeaturesState(_manager), data: payload); } }
private void CombineBody(Body body) { lock (_fetchSync) { int counter = _manager.Settings.QueryCount; while (!_tagQueue.IsEmpty) { XElement tag; if (_tagQueue.TryDequeue(out tag)) { body.Add(tag); if (--counter == 0) { break; } } } } }
private Body SendRequest(Body body) { using (var req = new HttpRequestMessage { RequestUri = new Uri(_manager.Settings.Hostname), Method = new HttpMethod("POST"), Content = new HttpStringContent(body, UnicodeEncoding.Utf8), }) { req.Content.Headers.ContentType = new HttpMediaTypeHeaderValue("text/xml") { CharSet = "utf-8", }; CancellationTokenSource cts = null; try { lock (_cancelationTokensSync) { _cancelationTokens.Add(cts = new CancellationTokenSource()); } cts.CancelAfter(TimeSpan.FromSeconds(Wait + 5)); var token = cts.Token; using (var resp = _client.SendRequestAsync(req, HttpCompletionOption.ResponseContentRead).AsTask(token).Result) { if (resp.IsSuccessStatusCode) { var data = resp.Content.ReadAsStringAsync().AsTask(token).Result; var respBody = Tag.Get(data) as Body; if (null == respBody) { ConnectionError( ErrorType.ConnectToServerFailed, ErrorPolicyType.Reconnect, string.Format("Invalid response: {0}.", data)); return(null); } if (respBody.TypeAttr == "terminate") { ConnectionError( ErrorType.ConnectToServerFailed, ErrorPolicyType.Reconnect, string.Format("Session was terminated. Reason: {0}", respBody.ConditionAttr)); return(null); } return(respBody); } ConnectionError( ErrorType.ConnectToServerFailed, ErrorPolicyType.Reconnect, string.Format( "Connection error: Status: {0}, Reason Phrase: {1}", resp.StatusCode, resp.ReasonPhrase)); return(null); } } catch (AggregateException e) { if (!(e.InnerException is TaskCanceledException)) { ConnectionError( ErrorType.ConnectToServerFailed, ErrorPolicyType.Reconnect, e.ToString()); } return(null); } catch (Exception e) { ConnectionError( ErrorType.ConnectToServerFailed, ErrorPolicyType.Reconnect, e.ToString()); return(null); } finally { lock (_cancelationTokensSync) { if (null != cts) { _cancelationTokens.Remove(cts); cts.Dispose(); } } } } }