public static HttpWebRequestOptions Combine(IHttpWebRequestOptions options1, IHttpWebRequestOptions options2, bool copyIfNull = true) { HttpWebRequestOptions result = new HttpWebRequestOptions(options1); result.Combine(options2, copyIfNull); return(result); }
private IHttpWebRequestOptions GetOptions(Uri endpoint) { lock (webRequestOptions) { OptionsInfo optionsInfo = webRequestOptions.Where(pair => endpoint.AbsoluteUri.StartsWith(pair.Key.AbsoluteUri)) .OrderByDescending(pair => pair.Key.AbsoluteUri.Length) .Select(pair => pair.Value) .FirstOrDefault(); if (optionsInfo is null) { return(defaultWebRequestOptions); } return(HttpWebRequestOptions.Combine(defaultWebRequestOptions, optionsInfo.WebRequestOptions, optionsInfo.CopyIfNull)); } }
public IHttpWebRequestOptions GetOptions(Uri uri) { HttpWebRequestOptions options = new HttpWebRequestOptions(GetOptions()); IHttpWebRequestOptions uriOptions; lock (uriOptionsMutex) { uriOptions = FindOptionsByUri(uri.AbsoluteUri); } if (!(uriOptions is null)) { uriOptions.CopyTo(options); } return(options); }
// Protected members protected override IHttpWebResponse Send(IHttpWebRequest request, CancellationToken cancellationToken) { if (request is null) { throw new ArgumentNullException(nameof(request)); } // If redirects are not to be handled, simply pass down the request. if (!request.AllowAutoRedirect) { return(base.Send(request, cancellationToken)); } int maximumRedirections = request.MaximumAutomaticRedirections; request.AllowAutoRedirect = false; try { IHttpWebResponse response = null; for (int redirections = 0; redirections < maximumRedirections; ++redirections) { response = base.Send(request, cancellationToken); if (response is object && IsRedirectStatusCode(response.StatusCode)) { if (response.Headers.TryGetHeader(HttpResponseHeader.Location, out string locationValue) && !string.IsNullOrWhiteSpace(locationValue)) { try { // Follow the redirect to the new location. if (Uri.TryCreate(request.RequestUri, locationValue, out Uri locationUri) && (locationUri.Scheme == Uri.UriSchemeHttp || locationUri.Scheme == Uri.UriSchemeHttps)) { Uri originalUri = request.RequestUri; string originalMethod = request.Method; request = httpWebRequestFactory.Create(locationUri) .WithOptions(HttpWebRequestOptions.FromHttpWebRequest(request)); if (response.StatusCode == HttpStatusCode.RedirectKeepVerb) { request.Method = originalMethod; } // If the host is the same, use the full path as the referer. // However, if the hosts are different, we'll just use the root path as the referer (this is how Chrome handles it). if (Uri.Compare(originalUri, locationUri, UriComponents.Host, UriFormat.Unescaped, StringComparison.OrdinalIgnoreCase) == 0) { request.Referer = originalUri.AbsoluteUri; } else { request.Referer = originalUri.GetLeftPart(UriPartial.Authority) + "/"; } } else { // The location URI was malformed. throw new WebException(Properties.ExceptionMessages.CannotRedirectToDissimilarProtocols, null, WebExceptionStatus.ProtocolError, response as WebResponse); } } finally { response.Close(); } } else { // We did not receive a location header even though we were supposed to. response.Close(); throw new WebException(string.Format(Properties.ExceptionMessages.TheRemoteServerReturnedAnErrorWithStatusCode, response.StatusCode), null, WebExceptionStatus.ProtocolError, response as WebResponse); } } else { // We did not receive an HTTP redirection. return(response); } } // If we get here, we reached the maximum number of redirections. response?.Close(); throw new WebException(Properties.ExceptionMessages.TooManyAutomaticRedirections, null, WebExceptionStatus.ProtocolError, response as WebResponse); } finally { request.AllowAutoRedirect = true; } }