1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System.Collections.Generic;
using System.Net.Security;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Threading;
using System.Threading.Tasks;
namespace System.Net.Http
{
public partial class HttpClientHandler : HttpMessageHandler
{
readonly IMonoHttpClientHandler _delegatingHandler;
ClientCertificateOption _clientCertificateOptions;
public HttpClientHandler () : this (CreateDefaultHandler ()) { }
internal HttpClientHandler (IMonoHttpClientHandler handler)
{
_delegatingHandler = handler;
ClientCertificateOptions = ClientCertificateOption.Manual;
}
protected override void Dispose (bool disposing)
{
if (disposing) {
_delegatingHandler.Dispose ();
}
base.Dispose (disposing);
}
public virtual bool SupportsAutomaticDecompression => _delegatingHandler.SupportsAutomaticDecompression;
public virtual bool SupportsProxy => true;
public virtual bool SupportsRedirectConfiguration => true;
public bool UseCookies {
get => _delegatingHandler.UseCookies;
set => _delegatingHandler.UseCookies = value;
}
public CookieContainer CookieContainer {
get => _delegatingHandler.CookieContainer;
set => _delegatingHandler.CookieContainer = value;
}
void ThrowForModifiedManagedSslOptionsIfStarted ()
{
// Hack to trigger an InvalidOperationException if a property that's stored on
// SslOptions is changed, since SslOptions itself does not do any such checks.
_delegatingHandler.SslOptions = _delegatingHandler.SslOptions;
}
public ClientCertificateOption ClientCertificateOptions {
get {
return _clientCertificateOptions;
}
set {
switch (value) {
case ClientCertificateOption.Manual:
ThrowForModifiedManagedSslOptionsIfStarted ();
_clientCertificateOptions = value;
_delegatingHandler.SslOptions.LocalCertificateSelectionCallback = (sender, targetHost, localCertificates, remoteCertificate, acceptableIssuers) => CertificateHelper.GetEligibleClientCertificate (ClientCertificates);
break;
case ClientCertificateOption.Automatic:
ThrowForModifiedManagedSslOptionsIfStarted ();
_clientCertificateOptions = value;
_delegatingHandler.SslOptions.LocalCertificateSelectionCallback = (sender, targetHost, localCertificates, remoteCertificate, acceptableIssuers) => CertificateHelper.GetEligibleClientCertificate ();
break;
default:
throw new ArgumentOutOfRangeException (nameof (value));
}
}
}
public X509CertificateCollection ClientCertificates {
get {
if (ClientCertificateOptions != ClientCertificateOption.Manual) {
throw new InvalidOperationException (SR.Format (SR.net_http_invalid_enable_first, nameof (ClientCertificateOptions), nameof (ClientCertificateOption.Manual)));
}
return _delegatingHandler.SslOptions.ClientCertificates ??
(_delegatingHandler.SslOptions.ClientCertificates = new X509CertificateCollection ());
}
}
public Func<HttpRequestMessage, X509Certificate2, X509Chain, SslPolicyErrors, bool> ServerCertificateCustomValidationCallback {
get => (_delegatingHandler.SslOptions.RemoteCertificateValidationCallback?.Target as ConnectHelper.CertificateCallbackMapper)?.FromHttpClientHandler;
set {
ThrowForModifiedManagedSslOptionsIfStarted ();
_delegatingHandler.SslOptions.RemoteCertificateValidationCallback = value != null ?
new ConnectHelper.CertificateCallbackMapper (value).ForSocketsHttpHandler :
null;
}
}
public bool CheckCertificateRevocationList {
get => _delegatingHandler.SslOptions.CertificateRevocationCheckMode == X509RevocationMode.Online;
set {
ThrowForModifiedManagedSslOptionsIfStarted ();
_delegatingHandler.SslOptions.CertificateRevocationCheckMode = value ? X509RevocationMode.Online : X509RevocationMode.NoCheck;
}
}
public SslProtocols SslProtocols {
get => _delegatingHandler.SslOptions.EnabledSslProtocols;
set {
ThrowForModifiedManagedSslOptionsIfStarted ();
_delegatingHandler.SslOptions.EnabledSslProtocols = value;
}
}
public DecompressionMethods AutomaticDecompression {
get => _delegatingHandler.AutomaticDecompression;
set => _delegatingHandler.AutomaticDecompression = value;
}
public bool UseProxy {
get => _delegatingHandler.UseProxy;
set => _delegatingHandler.UseProxy = value;
}
public IWebProxy Proxy {
get => _delegatingHandler.Proxy;
set => _delegatingHandler.Proxy = value;
}
public ICredentials DefaultProxyCredentials {
get => _delegatingHandler.DefaultProxyCredentials;
set => _delegatingHandler.DefaultProxyCredentials = value;
}
public bool PreAuthenticate {
get => _delegatingHandler.PreAuthenticate;
set => _delegatingHandler.PreAuthenticate = value;
}
public bool UseDefaultCredentials {
// Either read variable from curlHandler or compare .Credentials as socketsHttpHandler does not have separate prop.
get => _delegatingHandler.Credentials == CredentialCache.DefaultCredentials;
set {
if (value) {
_delegatingHandler.Credentials = CredentialCache.DefaultCredentials;
} else {
if (_delegatingHandler.Credentials == CredentialCache.DefaultCredentials) {
// Only clear out the Credentials property if it was a DefaultCredentials.
_delegatingHandler.Credentials = null;
}
}
}
}
public ICredentials Credentials {
get => _delegatingHandler.Credentials;
set => _delegatingHandler.Credentials = value;
}
public bool AllowAutoRedirect {
get => _delegatingHandler.AllowAutoRedirect;
set => _delegatingHandler.AllowAutoRedirect = value;
}
public int MaxAutomaticRedirections {
get => _delegatingHandler.MaxAutomaticRedirections;
set => _delegatingHandler.MaxAutomaticRedirections = value;
}
public int MaxConnectionsPerServer {
get => _delegatingHandler.MaxConnectionsPerServer;
set => _delegatingHandler.MaxConnectionsPerServer = value;
}
public int MaxResponseHeadersLength {
get => _delegatingHandler.MaxResponseHeadersLength;
set => _delegatingHandler.MaxResponseHeadersLength = value;
}
public long MaxRequestContentBufferSize {
get => _delegatingHandler.MaxRequestContentBufferSize;
set => _delegatingHandler.MaxRequestContentBufferSize = value;
}
public IDictionary<string, object> Properties => _delegatingHandler.Properties;
// Only used in MonoWebRequestHandler and ignored by the other handlers.
internal void SetWebRequestTimeout (TimeSpan timeout)
{
_delegatingHandler.SetWebRequestTimeout (timeout);
}
protected internal override Task<HttpResponseMessage> SendAsync (HttpRequestMessage request, CancellationToken cancellationToken) =>
_delegatingHandler.SendAsync (request, cancellationToken);
}
}
|