/// <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)); }
private static async Task CallOnDiscovered(WebSubSubscribeParameters parameters, WebSubDiscoveredUrls discovery, CancellationToken cancellationToken) { parameters.OnDiscovered?.Invoke(discovery); if (parameters.OnDiscoveredAsync != null) { await parameters.OnDiscoveredAsync(discovery, cancellationToken); } }
/// <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)); }
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)); }