Пример #1
0
        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);
            }
        }
Пример #2
0
 private void ExtractBody(Body resp)
 {
     if (null != resp)
     {
         foreach (var element in resp.Elements())
         {
             _manager.Events.NewTag(this, Tag.Get(element));
         }
     }
 }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
            }
        }
Пример #6
0
        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;
                        }
                    }
                }
            }
        }
Пример #7
0
        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();
                        }
                    }
                }
            }
        }