Exemplo n.º 1
0
        /// <summary>
        /// Discovers topic and hub URLs based on publisher's content URL and performs subscription request.
        /// </summary>
        /// <param name="parameters">The parameters.</param>
        /// <param name="cancellationToken">The cancellation token to cancel operation.</param>
        /// <returns>The task object representing the asynchronous operation.</returns>
        public async Task <WebSubSubscribedUrls> SubscribeAsync(WebSubSubscribeParameters parameters, CancellationToken cancellationToken)
        {
            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }

            WebSubDiscoveredUrls discovery = await _webSubDiscoverer.DiscoverAsync(parameters.ContentUrl, cancellationToken);

            await CallOnDiscovered(parameters, discovery, cancellationToken);

            string subscriptionHubUrl = null;
            Dictionary <string, HttpResponseMessage> hubsResponses = new Dictionary <string, HttpResponseMessage>();

            FormUrlEncodedContent subscribeRequestContent = PrepareSubscribeRequestContent(discovery.Topic, parameters);

            foreach (string hubUrl in discovery.Hubs)
            {
                HttpResponseMessage hubResponse = await _httpClient.PostAsync(hubUrl, subscribeRequestContent, cancellationToken);

                if (hubResponse.StatusCode == HttpStatusCode.Accepted)
                {
                    subscriptionHubUrl = hubUrl;
                    break;
                }
                hubsResponses.Add(hubUrl, hubResponse);
            }

            if (String.IsNullOrWhiteSpace(subscriptionHubUrl))
            {
                throw new WebSubSubscriptionException("None of discovered hubs have accepted the request.", hubsResponses);
            }

            return(new WebSubSubscribedUrls(discovery.Topic, subscriptionHubUrl));
        }
Exemplo n.º 2
0
        private static async Task CallOnDiscovered(WebSubSubscribeParameters parameters, WebSubDiscoveredUrls discovery, CancellationToken cancellationToken)
        {
            parameters.OnDiscovered?.Invoke(discovery);

            if (parameters.OnDiscoveredAsync != null)
            {
                await parameters.OnDiscoveredAsync(discovery, cancellationToken);
            }
        }
Exemplo n.º 3
0
 /// <summary>
 /// Discovers topic and hub URLs based on publisher's content URL and performs subscription request.
 /// </summary>
 /// <param name="parameters">The parameters.</param>
 /// <returns>The task object representing the asynchronous operation. The result is URLs to which the subscription has been made.</returns>
 public Task <WebSubSubscribedUrls> SubscribeAsync(WebSubSubscribeParameters parameters)
 {
     return(SubscribeAsync(parameters, CancellationToken.None));
 }
Exemplo n.º 4
0
        private static FormUrlEncodedContent PrepareSubscribeRequestContent(string topicUrl, WebSubSubscribeParameters parameters)
        {
            List <KeyValuePair <string, string> > subscribeParameters = new List <KeyValuePair <string, string> >
            {
                new KeyValuePair <string, string>(HUB_MODE_PARAMETER_NAME, HUB_MODE_SUBCRIBE),
                new KeyValuePair <string, string>(HUB_TOPIC_PARAMETER_NAME, topicUrl),
                new KeyValuePair <string, string>(HUB_CALLBACK_PARAMETER_NAME, parameters.CallbackUrl)
            };

            if (parameters.LeaseSeconds.HasValue)
            {
                subscribeParameters.Add(new KeyValuePair <string, string>(HUB_LEASE_SECONDS_PARAMETER_NAME, parameters.LeaseSeconds.Value.ToString(CultureInfo.InvariantCulture)));
            }

            if (!String.IsNullOrWhiteSpace(parameters.Secret))
            {
                subscribeParameters.Add(new KeyValuePair <string, string>(HUB_SECRET_PARAMETER_NAME, parameters.Secret));
            }

            return(new FormUrlEncodedContent(subscribeParameters));
        }