Imported Upstream version 4.3.2.467

Former-commit-id: 9c2cb47f45fa221e661ab616387c9cda183f283d
This commit is contained in:
Xamarin Public Jenkins
2016-02-22 11:00:01 -05:00
parent f302175246
commit f3e3aab35a
4097 changed files with 122406 additions and 82300 deletions

View File

@@ -0,0 +1,169 @@
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
using System;
using System.Collections.Generic;
namespace System
{
internal static partial class AppContextDefaultValues
{
public static void PopulateDefaultValues()
{
string platformIdentifier, profile;
int version;
ParseTargetFrameworkName(out platformIdentifier, out profile, out version);
// Call into each library to populate their default switches
PopulateDefaultValuesPartial(platformIdentifier, profile, version);
}
/// <summary>
/// We have this separate method for getting the parsed elements out of the TargetFrameworkName so we can
/// more easily support this on other platforms.
/// </summary>
private static void ParseTargetFrameworkName(out string identifier, out string profile, out int version)
{
string targetFrameworkMoniker = AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName;
// If we don't have a TFM then we should default to the 4.0 behavior where all quirks are turned on.
if (!TryParseFrameworkName(targetFrameworkMoniker, out identifier, out version, out profile))
{
#if FEATURE_CORECLR
if (CompatibilitySwitches.UseLatestBehaviorWhenTFMNotSpecified)
{
// If we want to use the latest behavior it is enough to set the value of the switch to string.Empty.
// When the get to the caller of this method (PopulateDefaultValuesPartial) we are going to use the
// identifier we just set to decide which switches to turn on. By having an empty string as the
// identifier we are simply saying -- don't turn on any switches, and we are going to get the latest
// behavior for all the switches
identifier = string.Empty;
}
else
#endif
{
identifier = ".NETFramework";
version = 40000;
profile = string.Empty;
}
}
}
// This code was a constructor copied from the FrameworkName class, which is located in System.dll.
// Parses strings in the following format: "<identifier>, Version=[v|V]<version>, Profile=<profile>"
// - The identifier and version is required, profile is optional
// - Only three components are allowed.
// - The version string must be in the System.Version format; an optional "v" or "V" prefix is allowed
private static bool TryParseFrameworkName(String frameworkName, out String identifier, out int version, out String profile)
{
// For parsing a target Framework moniker, from the FrameworkName class
const char c_componentSeparator = ',';
const char c_keyValueSeparator = '=';
const char c_versionValuePrefix = 'v';
const String c_versionKey = "Version";
const String c_profileKey = "Profile";
identifier = profile = string.Empty;
version = 0;
if (frameworkName == null || frameworkName.Length == 0)
{
return false;
}
String[] components = frameworkName.Split(c_componentSeparator);
version = 0;
// Identifer and Version are required, Profile is optional.
if (components.Length < 2 || components.Length > 3)
{
return false;
}
//
// 1) Parse the "Identifier", which must come first. Trim any whitespace
//
identifier = components[0].Trim();
if (identifier.Length == 0)
{
return false;
}
bool versionFound = false;
profile = null;
//
// The required "Version" and optional "Profile" component can be in any order
//
for (int i = 1; i < components.Length; i++)
{
// Get the key/value pair separated by '='
string[] keyValuePair = components[i].Split(c_keyValueSeparator);
if (keyValuePair.Length != 2)
{
return false;
}
// Get the key and value, trimming any whitespace
string key = keyValuePair[0].Trim();
string value = keyValuePair[1].Trim();
//
// 2) Parse the required "Version" key value
//
if (key.Equals(c_versionKey, StringComparison.OrdinalIgnoreCase))
{
versionFound = true;
// Allow the version to include a 'v' or 'V' prefix...
if (value.Length > 0 && (value[0] == c_versionValuePrefix || value[0] == 'V'))
{
value = value.Substring(1);
}
Version realVersion = new Version(value);
// The version class will represent some unset values as -1 internally (instead of 0).
version = realVersion.Major * 10000;
if (realVersion.Minor > 0)
version += realVersion.Minor * 100;
if (realVersion.Build > 0)
version += realVersion.Build;
}
//
// 3) Parse the optional "Profile" key value
//
else if (key.Equals(c_profileKey, StringComparison.OrdinalIgnoreCase))
{
if (!String.IsNullOrEmpty(value))
{
profile = value;
}
}
else
{
return false;
}
}
if (!versionFound)
{
return false;
}
return true;
}
// This is a partial method. Platforms (such as Desktop) can provide an implementation of it that will read override value
// from whatever mechanism is available on that platform. If no implementation is provided, the compiler is going to remove the calls
// to it from the code
static partial void TryGetSwitchOverridePartial(string switchName, ref bool overrideFound, ref bool overrideValue);
/// This is a partial method. This method is responsible for populating the default values based on a TFM.
/// It is partial because each library should define this method in their code to contain their defaults.
static partial void PopulateDefaultValuesPartial(string platformIdentifier, string profile, int version);
}
}

View File

@@ -0,0 +1,128 @@
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
// NOTE: This file should not be included in mscorlib. This should only be included in FX libraries that need to provide switches
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Threading;
namespace System
{
internal static partial class LocalAppContext
{
private delegate bool TryGetSwitchDelegate(string switchName, out bool value);
private static TryGetSwitchDelegate TryGetSwitchFromCentralAppContext;
private static bool s_canForwardCalls;
private static Dictionary<string, bool> s_switchMap = new Dictionary<string, bool>();
private static readonly object s_syncLock = new object();
private static bool DisableCaching { get; set; }
static LocalAppContext()
{
// Try to setup the callback into the central AppContext
s_canForwardCalls = SetupDelegate();
// Populate the default values of the local app context
AppContextDefaultValues.PopulateDefaultValues();
// Cache the value of the switch that help with testing
DisableCaching = IsSwitchEnabled(@"TestSwitch.LocalAppContext.DisableCaching");
}
public static bool IsSwitchEnabled(string switchName)
{
if (s_canForwardCalls)
{
bool isEnabledCentrally;
if (TryGetSwitchFromCentralAppContext(switchName, out isEnabledCentrally))
{
// we found the switch, so return whatever value it has
return isEnabledCentrally;
}
// if we could not get the value from the central authority, try the local storage.
}
return IsSwitchEnabledLocal(switchName);
}
private static bool IsSwitchEnabledLocal(string switchName)
{
// read the value from the set of local defaults
bool isEnabled, isPresent;
lock (s_switchMap)
{
isPresent = s_switchMap.TryGetValue(switchName, out isEnabled);
}
// If the value is in the set of local switches, reutrn the value
if (isPresent)
{
return isEnabled;
}
// if we could not find the switch name, we should return 'false'
// This will preserve the concept of switches been 'off' unless explicitly set to 'on'
return false;
}
private static bool SetupDelegate()
{
Type appContextType = typeof(object).Assembly.GetType("System.AppContext");
if (appContextType == null)
return false;
MethodInfo method = appContextType.GetMethod(
"TryGetSwitch", // the method name
BindingFlags.Static | BindingFlags.Public, // binding flags
null, // use the default binder
new Type[] { typeof(string), typeof(bool).MakeByRefType() },
null); // parameterModifiers - this is ignored by the default binder
if (method == null)
return false;
// Create delegate if we found the method.
TryGetSwitchFromCentralAppContext = (TryGetSwitchDelegate)Delegate.CreateDelegate(typeof(TryGetSwitchDelegate), method);
return true;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static bool GetCachedSwitchValue(string switchName, ref int switchValue)
{
if (switchValue < 0) return false;
if (switchValue > 0) return true;
return GetCachedSwitchValueInternal(switchName, ref switchValue);
}
private static bool GetCachedSwitchValueInternal(string switchName, ref int switchValue)
{
if (LocalAppContext.DisableCaching)
{
return LocalAppContext.IsSwitchEnabled(switchName);
}
bool isEnabled = LocalAppContext.IsSwitchEnabled(switchName);
switchValue = isEnabled ? 1 /*true*/ : -1 /*false*/;
return isEnabled;
}
/// <summary>
/// This method is going to be called from the AppContextDefaultValues class when setting up the
/// default values for the switches. !!!! This method is called during the static constructor so it does not
/// take a lock !!!! If you are planning to use this outside of that, please ensure proper locking.
/// </summary>
internal static void DefineSwitchDefault(string switchName, bool initialValue)
{
s_switchMap[switchName] = initialValue;
}
}
}

View File

@@ -120,7 +120,7 @@ namespace System.ServiceModel.Administration
{
Fx.Assert(null != endpoint, "");
Fx.Assert(null != instance, "");
instance.SetProperty(AdministrationStrings.CounterInstanceName, PerformanceCounters.PerformanceCountersEnabled ? EndpointPerformanceCounters.CreateFriendlyInstanceName(endpoint.ServiceName, endpoint.Contract.Name, endpoint.Address.AbsoluteUri.ToUpperInvariant()) : String.Empty);
instance.SetProperty(AdministrationStrings.CounterInstanceName, PerformanceCounters.PerformanceCountersEnabled ? EndpointPerformanceCounters.GetFriendlyInstanceName(endpoint.ServiceName, endpoint.Contract.Name, endpoint.Address.AbsoluteUri.ToUpperInvariant()) : String.Empty);
instance.SetProperty(AdministrationStrings.Name, endpoint.Name);
instance.SetProperty(AdministrationStrings.ContractName, endpoint.Contract.Name);
FillAddressInfo(endpoint, instance);
@@ -668,7 +668,7 @@ namespace System.ServiceModel.Administration
if (PerformanceCounters.PerformanceCountersEnabled && null != endpointInfo)
{
result = OperationPerformanceCounters.CreateFriendlyInstanceName(endpointInfo.ServiceName, endpointInfo.Contract.Name, operationName, endpointInfo.Address.AbsoluteUri.ToUpperInvariant());
result = OperationPerformanceCounters.GetFriendlyInstanceName(endpointInfo.ServiceName, endpointInfo.Contract.Name, operationName, endpointInfo.Address.AbsoluteUri.ToUpperInvariant());
}
return result;

View File

@@ -132,7 +132,7 @@ namespace System.ServiceModel.Administration
Fx.Assert(null != instance, "");
Fx.Assert(null != info, "");
ProviderBase.FillCollectionInfo(info.Service.BaseAddresses, instance, AdministrationStrings.BaseAddresses);
instance.SetProperty(AdministrationStrings.CounterInstanceName, PerformanceCounters.PerformanceCountersEnabled ? ServicePerformanceCounters.CreateFriendlyInstanceName(info.Service) : String.Empty);
instance.SetProperty(AdministrationStrings.CounterInstanceName, PerformanceCounters.PerformanceCountersEnabled ? ServicePerformanceCounters.GetFriendlyInstanceName(info.Service) : String.Empty);
instance.SetProperty(AdministrationStrings.ConfigurationName, info.ConfigurationName);
instance.SetProperty(AdministrationStrings.DistinguishedName, info.DistinguishedName);
instance.SetProperty(AdministrationStrings.Name, info.Name);

View File

@@ -0,0 +1,35 @@
// <copyright>
// Copyright (c) Microsoft Corporation. All rights reserved.
// </copyright>
namespace System
{
using System;
using System.ServiceModel;
internal static partial class AppContextDefaultValues
{
static partial void PopulateDefaultValuesPartial(string platformIdentifier, string profile, int version)
{
// When defining a new switch you should add it to the last known version.
// For instance, if you are adding a switch in .NET 4.6 (the release after 4.5.2) you should defined your switch
// like this:
// if (version <= 40502) ...
// This ensures that all previous versions of that platform (up-to 4.5.2) will get the old behavior by default
// NOTE: When adding a default value for a switch please make sure that the default value is added to ALL of the existing platforms!
// NOTE: When adding a new if statement for the version please ensure that ALL previous switches are enabled (ie. don't use else if)
switch (platformIdentifier)
{
case ".NETCore":
case ".NETFramework":
{
if (version <= 40502)
{
LocalAppContextSwitches.SetDefaultsLessOrEqual_452();
}
break;
}
}
}
}
}

View File

@@ -10,4 +10,4 @@ namespace System.ServiceModel
AlwaysOn,
AlwaysOff
}
}
}

View File

@@ -126,10 +126,19 @@ namespace System.ServiceModel.Channels
public override void Close()
{
this.FlushPendingBuffer();
stream.Close();
this.WaitForAllWritesToComplete();
this.closed = true;
try
{
if (!this.closed)
{
this.FlushPendingBuffer();
stream.Close();
this.WaitForAllWritesToComplete();
}
}
finally
{
this.closed = true;
}
}
public override void Flush()

View File

@@ -1 +1 @@
bf44d9efe557a80fed2c9fe79388602c857ecbfa
8187627a3c626ffd202a933cbf037c37879803d8

View File

@@ -26,4 +26,4 @@ namespace System.ServiceModel.Channels
// we estimate that implementors of a custom web socket factory will find it enough too.
public abstract WebSocket CreateWebSocket(Stream connection, WebSocketTransportSettings settings);
}
}
}

View File

@@ -35,6 +35,7 @@ namespace System.ServiceModel.Channels
{
static bool httpWebRequestWebPermissionDenied = false;
static RequestCachePolicy requestCachePolicy = new RequestCachePolicy(RequestCacheLevel.BypassCache);
static long connectionGroupNamePrefix = 0;
readonly ClientWebSocketFactory clientWebSocketFactory;
@@ -65,6 +66,7 @@ namespace System.ServiceModel.Channels
WebSocketTransportSettings webSocketSettings;
ConnectionBufferPool bufferPool;
Lazy<string> webSocketSoapContentType;
string uniqueConnectionGroupNamePrefix;
internal HttpChannelFactory(HttpTransportBindingElement bindingElement, BindingContext context)
: base(bindingElement, context, HttpTransportDefaults.GetDefaultMessageEncoderFactory())
@@ -183,6 +185,15 @@ namespace System.ServiceModel.Channels
}
this.webSocketSoapContentType = new Lazy<string>(() => { return this.MessageEncoderFactory.CreateSessionEncoder().ContentType; }, LazyThreadSafetyMode.ExecutionAndPublication);
if (ServiceModelAppSettings.HttpTransportPerFactoryConnectionPool)
{
this.uniqueConnectionGroupNamePrefix = Interlocked.Increment(ref connectionGroupNamePrefix).ToString();
}
else
{
this.uniqueConnectionGroupNamePrefix = string.Empty;
}
}
public bool AllowCookies
@@ -665,7 +676,7 @@ namespace System.ServiceModel.Channels
}
string prefix = this.OnGetConnectionGroupPrefix(httpWebRequest, clientCertificateToken);
inputString = string.Concat(prefix, inputString);
inputString = string.Concat(this.uniqueConnectionGroupNamePrefix, prefix, inputString);
string credentialHash = null;
@@ -1170,6 +1181,7 @@ namespace System.ServiceModel.Channels
ChannelBinding channelBinding;
int webRequestCompleted;
EventTraceActivity eventTraceActivity;
const string ConnectionGroupPrefixMessagePropertyName = "HttpTransportConnectionGroupNamePrefix";
public HttpChannelRequest(HttpRequestChannel channel, HttpChannelFactory<IRequestChannel> factory)
{
@@ -1179,11 +1191,27 @@ namespace System.ServiceModel.Channels
this.factory = factory;
}
private string GetConnectionGroupPrefix(Message message)
{
object property;
if (message.Properties.TryGetValue(ConnectionGroupPrefixMessagePropertyName, out property))
{
string prefix = property as string;
if (prefix != null)
{
return prefix;
}
}
return string.Empty;
}
public void SendRequest(Message message, TimeSpan timeout)
{
TimeoutHelper timeoutHelper = new TimeoutHelper(timeout);
factory.ApplyManualAddressing(ref this.to, ref this.via, message);
this.webRequest = channel.GetWebRequest(this.to, this.via, ref timeoutHelper);
this.webRequest.ConnectionGroupName = GetConnectionGroupPrefix(message) + this.webRequest.ConnectionGroupName;
Message request = message;

View File

@@ -1 +1 @@
d2389c42a4141d68294b289c4b94a4a6d24729a9
5df21319d3d6e9046fc229fc5459ad17a351de9b

View File

@@ -23,7 +23,7 @@ namespace System.ServiceModel.Channels
where TChannel : class, IChannel
{
readonly bool useCustomClientCertificateVerification;
readonly bool shouldValidateClientCertificate;
bool shouldValidateClientCertificate;
bool useHostedClientCertificateMapping;
bool requireClientCertificate;
SecurityTokenAuthenticator certificateAuthenticator;
@@ -125,6 +125,12 @@ namespace System.ServiceModel.Channels
{
base.ApplyHostedContext(virtualPath, isMetadataListener);
useHostedClientCertificateMapping = AspNetEnvironment.Current.ValidateHttpsSettings(virtualPath, ref this.requireClientCertificate);
// We want to validate the certificate if IIS is set to require a client certificate
if (this.requireClientCertificate)
{
this.shouldValidateClientCertificate = true;
}
}
internal override ITransportManagerRegistration CreateTransportManagerRegistration(Uri listenUri)

View File

@@ -14,4 +14,4 @@ namespace System.ServiceModel.Channels
IAsyncResult BeginWaitForChannel(TimeSpan timeout, AsyncCallback callback, object state);
bool EndWaitForChannel(IAsyncResult result);
}
}
}

View File

@@ -11,4 +11,4 @@ namespace System.ServiceModel.Channels
void EnableChannelBindingSupport();
bool IsChannelBindingSupportEnabled { get; }
}
}
}

View File

@@ -17,4 +17,4 @@ namespace System.ServiceModel.Channels
/// </summary>
CookieContainer CookieContainer { get; set; }
}
}
}

View File

@@ -25,4 +25,4 @@ namespace System.ServiceModel.Channels
TimeSpan SendTimeout { get; }
}
}
}

View File

@@ -11,4 +11,4 @@ namespace System.ServiceModel.Channels
ChannelBinding GetChannelBinding(StreamUpgradeInitiator upgradeInitiator, ChannelBindingKind kind);
ChannelBinding GetChannelBinding(StreamUpgradeAcceptor upgradeAcceptor, ChannelBindingKind kind);
}
}
}

View File

@@ -507,7 +507,7 @@ namespace System.ServiceModel.Channels
switch (header.HeaderType)
{
case HeaderType.BufferedMessageHeader:
AddHeader(new Header(header.HeaderKind, CaptureBufferedHeader(collection.bufferedMessageData,
AddHeader(new Header(header.HeaderKind, collection.CaptureBufferedHeader(collection.bufferedMessageData,
header.HeaderInfo, headerIndex), processing));
break;
case HeaderType.ReadableHeader:

View File

@@ -7,6 +7,7 @@ namespace System.ServiceModel.Channels
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using FILETIME = System.Runtime.InteropServices.ComTypes.FILETIME;
[SuppressUnmanagedCodeSecurity]
internal static class SafeNativeMethods
@@ -20,10 +21,19 @@ namespace System.ServiceModel.Channels
[Out] out uint increment,
[Out] out uint adjustmentDisabled
);
[DllImport(KERNEL32, SetLastError = true)]
[ResourceExposure(ResourceScope.None)]
public static extern void GetSystemTimeAsFileTime(out long time);
private static extern void GetSystemTimeAsFileTime([Out] out FILETIME time);
public static void GetSystemTimeAsFileTime(out long time) {
FILETIME fileTime;
GetSystemTimeAsFileTime(out fileTime);
time = 0;
time |= (uint)fileTime.dwHighDateTime;
time <<= sizeof(uint) * 8;
time |= (uint)fileTime.dwLowDateTime;
}
[Fx.Tag.SecurityNote(Critical = "Calls critical method GetSystemTimeAdjustment.",
Safe = "Method is a SafeNativeMethod.")]

View File

@@ -3,6 +3,7 @@
//-----------------------------------------------------------------------------
namespace System.ServiceModel.Channels
{
using System.Security.Authentication;
using System.ComponentModel;
using System.Collections.Generic;
using System.Net.Security;
@@ -16,10 +17,12 @@ namespace System.ServiceModel.Channels
{
IdentityVerifier identityVerifier;
bool requireClientCertificate;
SslProtocols sslProtocols;
public SslStreamSecurityBindingElement()
{
this.requireClientCertificate = TransportDefaults.RequireClientCertificate;
this.sslProtocols = TransportDefaults.SslProtocols;
}
protected SslStreamSecurityBindingElement(SslStreamSecurityBindingElement elementToBeCloned)
@@ -27,6 +30,7 @@ namespace System.ServiceModel.Channels
{
this.identityVerifier = elementToBeCloned.identityVerifier;
this.requireClientCertificate = elementToBeCloned.requireClientCertificate;
this.sslProtocols = elementToBeCloned.sslProtocols;
}
public IdentityVerifier IdentityVerifier
@@ -64,6 +68,20 @@ namespace System.ServiceModel.Channels
}
}
[DefaultValue(TransportDefaults.SslProtocols)]
public SslProtocols SslProtocols
{
get
{
return this.sslProtocols;
}
set
{
SslProtocolsHelper.Validate(value);
this.sslProtocols = value;
}
}
public override IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)
{
if (context == null)
@@ -218,7 +236,7 @@ namespace System.ServiceModel.Channels
return false;
}
return this.requireClientCertificate == ssl.requireClientCertificate;
return this.requireClientCertificate == ssl.requireClientCertificate && this.sslProtocols == ssl.sslProtocols;
}
[EditorBrowsable(EditorBrowsableState.Never)]

Some files were not shown because too many files have changed in this diff Show More