/// <summary> /// Checks for known redirects and alters the request url if required, passes the request on to the next handler in the pipeline, then handles any redirect responses until a non-redirect response is received. /// </summary> /// <param name="request">The <see cref="HttpRequestMessage"/> to send.</param> /// <returns></returns> public IAsyncOperationWithProgress <HttpResponseMessage, HttpProgress> SendRequestAsync(HttpRequestMessage request) { return(AsyncInfo.Run <HttpResponseMessage, HttpProgress>(async(cancellationToken, progress) => { request.RequestUri = _RedirectCache.GetFinalUri(request.RequestUri); cancellationToken.ThrowIfCancellationRequested(); var result = await _InnerFilter.SendRequestAsync(request).AsTask().ConfigureAwait(false); int redirects = 0; while (redirects < MaxRedirects) { if (result.StatusCode.IsRedirect()) { if (String.Compare(request.Method.Method, "GET", StringComparison.OrdinalIgnoreCase) == 0 && result.Headers.Location != null) { if (result.StatusCode.IsPermanentRedirect()) { _RedirectCache.AddOrUpdateRedirect(request.RequestUri, result.Headers.Location); } var request2 = new HttpRequestMessage(request.Method, result.Headers.Location); WebHttpHeaderExtensions.CopyHeadersTo(request.Headers, request2.Headers); result = await _InnerFilter.SendRequestAsync(request2).AsTask().ConfigureAwait(false); } redirects++; } else { break; } cancellationToken.ThrowIfCancellationRequested(); } return result; })); }
/// <summary> /// Applies the configured dynamic headers and passes the request on. /// </summary> /// <remarks> /// <para>Does not modify headers that already have a value.</para> /// <para>Does not create/apply headers where the function returning the value returns null.</para> /// </remarks> /// <param name="request">The <see cref="Windows.Web.Http.HttpRequestMessage"/> to process and pass on.</param> /// <returns>An asynchronous operation whose result is a <see cref="HttpResponseMessage"/> from the server.</returns> public IAsyncOperationWithProgress <HttpResponseMessage, HttpProgress> SendRequestAsync(HttpRequestMessage request) { return(AsyncInfo.Run <HttpResponseMessage, HttpProgress>(async(cancellationToken, progress) => { if (_ApplyHeadersCondition?.ShouldProcess(request) ?? true) { foreach (var kvp in _DynamicHeaders) { var value = kvp.Value(); if (value != null) { request.Headers.Add(kvp.Key, value); } cancellationToken.ThrowIfCancellationRequested(); } } return await _InnerFilter.SendRequestAsync(request).AsTask().ConfigureAwait(false); })); }