/// <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)); }
public async Task Discover_HttpHeaderDiscoveryUrl_DiscoversCorrectTopic() { WebSubDiscoverer webSubRocksWebSubDiscoverer = PrepareWebSubRocksWebSubDiscoverer(); WebSubDiscoveredUrls webSubRocksWebSubDiscovery = await webSubRocksWebSubDiscoverer.DiscoverAsync(WebSubRocksConstants.HTTP_HEADER_DISCOVERY_URL, CancellationToken.None); Assert.Equal(WebSubRocksConstants.HTTP_HEADER_DISCOVERY_TOPIC_URL, webSubRocksWebSubDiscovery.Topic); }
public async Task Discover_HttpHeaderDiscoveryUrl_DiscoversCorrectHub() { WebSubDiscoverer webSubRocksWebSubDiscoverer = PrepareWebSubRocksWebSubDiscoverer(); WebSubDiscoveredUrls webSubRocksWebSubDiscovery = await webSubRocksWebSubDiscoverer.DiscoverAsync(WebSubRocksConstants.HTTP_HEADER_DISCOVERY_URL, CancellationToken.None); Assert.Contains(WebSubRocksConstants.HTTP_HEADER_DISCOVERY_HUB_URL, webSubRocksWebSubDiscovery.Hubs); }
public async void Discover_HttpHeaderDiscoveryUrl_DiscoversSingleHub() { WebSubDiscoverer webSubRocksWebSubDiscoverer = PrepareWebSubRocksWebSubDiscoverer(); WebSubDiscoveredUrls webSubRocksWebSubDiscovery = await webSubRocksWebSubDiscoverer.DiscoverAsync(WebSubRocksConstants.HTTP_HEADER_DISCOVERY_URL, CancellationToken.None); Assert.Single(webSubRocksWebSubDiscovery.Hubs); }
private static Task <WebSubDiscoveredUrls> GetHttpHeaderWebSubDiscovery() { WebSubDiscoveredUrls webSubDiscovery = new WebSubDiscoveredUrls { Topic = WebSubRocksConstants.HTTP_HEADER_DISCOVERY_TOPIC_URL }; webSubDiscovery.AddHub(WebSubRocksConstants.HTTP_HEADER_DISCOVERY_HUB_URL); return(Task.FromResult(webSubDiscovery)); }
private static async Task CallOnDiscovered(WebSubSubscribeParameters parameters, WebSubDiscoveredUrls discovery, CancellationToken cancellationToken) { parameters.OnDiscovered?.Invoke(discovery); if (parameters.OnDiscoveredAsync != null) { await parameters.OnDiscoveredAsync(discovery, cancellationToken); } }