[bcl] Updates referencesource to 4.7.1
[mono-project.git] / mcs / class / referencesource / System.ServiceModel / System / ServiceModel / Channels / TransportDefaults.cs
blobc10c7f57b46d90a28857017fedf3bfddc90f57d6
1 //------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation. All rights reserved.
3 //------------------------------------------------------------
5 namespace System.ServiceModel.Channels
7 using System.Net;
8 using System.Net.Security;
9 using System.Net.WebSockets;
10 using System.Runtime;
11 using System.Security.Authentication;
12 using System.Security.Principal;
13 using System.ServiceModel;
14 using System.ServiceModel.Dispatcher;
15 using System.ServiceModel.Security;
16 using System.Text;
17 using System.Xml;
19 internal static class TransactionFlowDefaults
21 internal const TransactionFlowOption IssuedTokens = TransactionFlowOption.NotAllowed;
22 internal const bool Transactions = false;
23 internal static TransactionProtocol TransactionProtocol = System.ServiceModel.TransactionProtocol.OleTransactions;
24 internal const string TransactionProtocolString = System.ServiceModel.Configuration.ConfigurationStrings.OleTransactions;
27 static class EncoderDefaults
29 internal const int MaxReadPoolSize = 64;
30 internal const int MaxWritePoolSize = 16;
32 internal const int MaxDepth = 32;
33 internal const int MaxStringContentLength = 8192;
34 internal const int MaxArrayLength = 16384;
35 internal const int MaxBytesPerRead = 4096;
36 internal const int MaxNameTableCharCount = 16384;
38 internal const int BufferedReadDefaultMaxDepth = 128;
39 internal const int BufferedReadDefaultMaxStringContentLength = Int32.MaxValue;
40 internal const int BufferedReadDefaultMaxArrayLength = Int32.MaxValue;
41 internal const int BufferedReadDefaultMaxBytesPerRead = Int32.MaxValue;
42 internal const int BufferedReadDefaultMaxNameTableCharCount = Int32.MaxValue;
44 internal const CompressionFormat DefaultCompressionFormat = CompressionFormat.None;
46 internal static readonly XmlDictionaryReaderQuotas ReaderQuotas = new XmlDictionaryReaderQuotas();
48 internal static bool IsDefaultReaderQuotas(XmlDictionaryReaderQuotas quotas)
50 return quotas.ModifiedQuotas == 0x00;
54 static class TextEncoderDefaults
56 internal static readonly Encoding Encoding = Encoding.GetEncoding(TextEncoderDefaults.EncodingString, new EncoderExceptionFallback(), new DecoderExceptionFallback());
57 internal const string EncodingString = "utf-8";
58 internal static readonly Encoding[] SupportedEncodings = new Encoding[] { Encoding.UTF8, Encoding.Unicode, Encoding.BigEndianUnicode };
59 internal const string MessageVersionString = System.ServiceModel.Configuration.ConfigurationStrings.Soap12WSAddressing10;
60 internal static readonly CharSetEncoding[] CharSetEncodings = new CharSetEncoding[]
62 new CharSetEncoding("utf-8", Encoding.UTF8),
63 new CharSetEncoding("utf-16LE", Encoding.Unicode),
64 new CharSetEncoding("utf-16BE", Encoding.BigEndianUnicode),
65 new CharSetEncoding("utf-16", null), // Ignore. Ambiguous charSet, so autodetect.
66 new CharSetEncoding(null, null), // CharSet omitted, so autodetect.
69 internal static void ValidateEncoding(Encoding encoding)
71 string charSet = encoding.WebName;
72 Encoding[] supportedEncodings = SupportedEncodings;
73 for (int i = 0; i < supportedEncodings.Length; i++)
75 if (charSet == supportedEncodings[i].WebName)
76 return;
78 throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.MessageTextEncodingNotSupported, charSet), "encoding"));
81 internal static string EncodingToCharSet(Encoding encoding)
83 string webName = encoding.WebName;
84 CharSetEncoding[] charSetEncodings = CharSetEncodings;
85 for (int i = 0; i < charSetEncodings.Length; i++)
87 Encoding enc = charSetEncodings[i].Encoding;
88 if (enc == null)
89 continue;
91 if (enc.WebName == webName)
92 return charSetEncodings[i].CharSet;
94 return null;
97 internal static bool TryGetEncoding(string charSet, out Encoding encoding)
99 CharSetEncoding[] charSetEncodings = CharSetEncodings;
101 // Quick check for exact equality
102 for (int i = 0; i < charSetEncodings.Length; i++)
104 if (charSetEncodings[i].CharSet == charSet)
106 encoding = charSetEncodings[i].Encoding;
107 return true;
111 // Check for case insensative match
112 for (int i = 0; i < charSetEncodings.Length; i++)
114 string compare = charSetEncodings[i].CharSet;
115 if (compare == null)
116 continue;
118 if (compare.Equals(charSet, StringComparison.OrdinalIgnoreCase))
120 encoding = charSetEncodings[i].Encoding;
121 return true;
125 encoding = null;
126 return false;
129 internal class CharSetEncoding
131 internal string CharSet;
132 internal Encoding Encoding;
134 internal CharSetEncoding(string charSet, Encoding enc)
136 CharSet = charSet;
137 Encoding = enc;
142 static class MtomEncoderDefaults
144 internal const int MaxBufferSize = 65536;
147 static class BinaryEncoderDefaults
149 internal static EnvelopeVersion EnvelopeVersion { get { return EnvelopeVersion.Soap12; } }
150 internal static BinaryVersion BinaryVersion { get { return BinaryVersion.Version1; } }
151 internal const int MaxSessionSize = 2048;
154 static class MsmqDefaults
156 internal const MessageCredentialType DefaultClientCredentialType = MessageCredentialType.Windows;
157 internal const Uri CustomDeadLetterQueue = null;
158 internal const DeadLetterQueue DeadLetterQueue = System.ServiceModel.DeadLetterQueue.System;
159 internal const bool Durable = true;
160 internal const bool ExactlyOnce = true;
161 internal const bool ReceiveContextEnabled = true;
162 internal const int MaxRetryCycles = 2;
163 internal const int MaxPoolSize = 8;
164 internal const MsmqAuthenticationMode MsmqAuthenticationMode = System.ServiceModel.MsmqAuthenticationMode.WindowsDomain;
165 internal const MsmqEncryptionAlgorithm MsmqEncryptionAlgorithm = System.ServiceModel.MsmqEncryptionAlgorithm.RC4Stream;
166 internal const MsmqSecureHashAlgorithm DefaultMsmqSecureHashAlgorithm = System.ServiceModel.MsmqSecureHashAlgorithm.Sha256;
167 internal static MsmqSecureHashAlgorithm MsmqSecureHashAlgorithm { get { return LocalAppContextSwitches.UseSha1InMsmqEncryptionAlgorithm ? MsmqSecureHashAlgorithm.Sha1 : DefaultMsmqSecureHashAlgorithm; } }
168 internal const ProtectionLevel MsmqProtectionLevel = ProtectionLevel.Sign;
169 internal const ReceiveErrorHandling ReceiveErrorHandling = System.ServiceModel.ReceiveErrorHandling.Fault;
170 internal const int ReceiveRetryCount = 5;
171 internal const QueueTransferProtocol QueueTransferProtocol = System.ServiceModel.QueueTransferProtocol.Native;
172 internal static TimeSpan RetryCycleDelay { get { return TimeSpanHelper.FromMinutes(30, MsmqDefaults.RetryCycleDelayString); } }
173 internal const string RetryCycleDelayString = "00:30:00";
174 internal static TimeSpan TimeToLive { get { return TimeSpanHelper.FromDays(1, MsmqDefaults.TimeToLiveString); } }
175 internal const string TimeToLiveString = "1.00:00:00";
176 internal const bool UseActiveDirectory = false;
177 internal const bool UseSourceJournal = false;
178 internal const bool UseMsmqTracing = false;
179 internal static TimeSpan ValidityDuration { get { return TimeSpanHelper.FromMinutes(5, MsmqDefaults.ValidityDurationString); } }
180 internal const string ValidityDurationString = "00:05:00";
181 internal static SecurityAlgorithmSuite MessageSecurityAlgorithmSuite
183 get { return SecurityAlgorithmSuite.Default; }
187 static class MsmqIntegrationDefaults
189 internal const System.ServiceModel.MsmqIntegration.MsmqMessageSerializationFormat SerializationFormat =
190 System.ServiceModel.MsmqIntegration.MsmqMessageSerializationFormat.Xml;
193 static class TransportDefaults
195 internal const bool ExtractGroupsForWindowsAccounts = SspiSecurityTokenProvider.DefaultExtractWindowsGroupClaims;
196 internal const HostNameComparisonMode HostNameComparisonMode = System.ServiceModel.HostNameComparisonMode.Exact;
197 internal const TokenImpersonationLevel ImpersonationLevel = TokenImpersonationLevel.Identification;
198 internal const bool ManualAddressing = false;
199 internal const long MaxReceivedMessageSize = 65536;
200 internal const int MaxDrainSize = (int)MaxReceivedMessageSize;
201 internal const long MaxBufferPoolSize = 512 * 1024;
202 internal const int MaxBufferSize = (int)MaxReceivedMessageSize;
203 internal const bool RequireClientCertificate = false;
204 internal const int MaxFaultSize = MaxBufferSize;
205 internal const int MaxSecurityFaultSize = 16384;
207 internal const SslProtocols OldDefaultSslProtocols = System.Security.Authentication.SslProtocols.Tls |
208 System.Security.Authentication.SslProtocols.Tls11 |
209 System.Security.Authentication.SslProtocols.Tls12;
211 internal static SslProtocols SslProtocols
215 if (LocalAppContextSwitches.DontEnableSystemDefaultTlsVersions)
217 return OldDefaultSslProtocols;
219 else
221 // SslProtocols.None uses the default SSL protocol from the OS.
222 return System.Security.Authentication.SslProtocols.None;
227 // Calling CreateFault on an incoming message can expose some DoS-related security
228 // vulnerabilities when a service is in streaming mode. See MB 47592 for more details.
229 // The RM protocol service does not use streaming mode on any of its bindings, so the
230 // message we have in hand has already passed the binding’s MaxReceivedMessageSize check.
231 // Custom transports can use RM so int.MaxValue is dangerous.
232 internal const int MaxRMFaultSize = (int)MaxReceivedMessageSize;
234 internal static MessageEncoderFactory GetDefaultMessageEncoderFactory()
236 return new BinaryMessageEncodingBindingElement().CreateMessageEncoderFactory();
240 static class ConnectionOrientedTransportDefaults
242 internal const bool AllowNtlm = SspiSecurityTokenProvider.DefaultAllowNtlm;
243 internal const int ConnectionBufferSize = 8192;
244 internal const string ConnectionPoolGroupName = "default";
245 internal const HostNameComparisonMode HostNameComparisonMode = System.ServiceModel.HostNameComparisonMode.StrongWildcard;
246 internal static TimeSpan IdleTimeout { get { return TimeSpanHelper.FromMinutes(2, IdleTimeoutString); } }
247 internal const string IdleTimeoutString = "00:02:00";
248 internal static TimeSpan ChannelInitializationTimeout { get { return TimeSpanHelper.FromSeconds(30, ChannelInitializationTimeoutString); } }
249 internal const string ChannelInitializationTimeoutString = "00:00:30";
250 internal const int MaxContentTypeSize = 256;
251 internal const int MaxOutboundConnectionsPerEndpoint = 10;
252 internal const int MaxPendingConnectionsConst = 0;
253 internal static TimeSpan MaxOutputDelay { get { return TimeSpanHelper.FromMilliseconds(200, MaxOutputDelayString); } }
254 internal const string MaxOutputDelayString = "00:00:00.2";
255 internal const int MaxPendingAcceptsConst = 0;
256 internal const int MaxViaSize = 2048;
257 internal const ProtectionLevel ProtectionLevel = System.Net.Security.ProtectionLevel.EncryptAndSign;
258 internal const TransferMode TransferMode = System.ServiceModel.TransferMode.Buffered;
260 private const int MaxPendingConnectionsPre45 = 10;
261 private const int MaxPendingAcceptsPre45 = 1;
263 internal static int GetMaxConnections()
265 return GetMaxPendingConnections();
268 internal static int GetMaxPendingConnections()
270 // OSEnvironmentHelper.IsApplicationTargeting45 checks for whether target Fx version is >= 4.5 despite its name
271 if (OSEnvironmentHelper.IsApplicationTargeting45)
273 return 12 * OSEnvironmentHelper.ProcessorCount;
276 return MaxPendingConnectionsPre45;
279 internal static int GetMaxPendingAccepts()
281 // OSEnvironmentHelper.IsApplicationTargeting45 checks for whether target Fx version is >= 4.5 despite its name
282 if (OSEnvironmentHelper.IsApplicationTargeting45)
284 return 2 * OSEnvironmentHelper.ProcessorCount;
287 return MaxPendingAcceptsPre45;
291 static class TcpTransportDefaults
293 internal const int ListenBacklogConst = 0;
294 internal static TimeSpan ConnectionLeaseTimeout { get { return TimeSpanHelper.FromMinutes(5, TcpTransportDefaults.ConnectionLeaseTimeoutString); } }
295 internal const string ConnectionLeaseTimeoutString = "00:05:00";
296 internal const bool PortSharingEnabled = false;
297 internal const bool TeredoEnabled = false;
299 private const int ListenBacklogPre45 = 10;
301 internal static int GetListenBacklog()
303 // OSEnvironmentHelper.IsApplicationTargeting45 checks for whether target Fx version is >= 4.5 despite its name
304 if (OSEnvironmentHelper.IsApplicationTargeting45)
306 return 12 * OSEnvironmentHelper.ProcessorCount;
309 return ListenBacklogPre45;
313 static class ApplicationContainerSettingsDefaults
315 internal const string CurrentUserSessionDefaultString = "CurrentSession";
316 internal const string Session0ServiceSessionString = "ServiceSession";
317 internal const string PackageFullNameDefaultString = null;
319 /// <summary>
320 /// The current session will be used for resource lookup.
321 /// </summary>
322 internal const int CurrentSession = -1;
324 /// <summary>
325 /// Session 0 is the NT Service session
326 /// </summary>
327 internal const int ServiceSession = 0;
330 static class HttpTransportDefaults
332 internal const bool AllowCookies = false;
333 internal const AuthenticationSchemes AuthenticationScheme = AuthenticationSchemes.Anonymous;
334 internal const bool BypassProxyOnLocal = false;
335 internal const bool DecompressionEnabled = true;
336 internal const HostNameComparisonMode HostNameComparisonMode = System.ServiceModel.HostNameComparisonMode.StrongWildcard;
337 internal const bool KeepAliveEnabled = true;
338 internal const Uri ProxyAddress = null;
339 internal const AuthenticationSchemes ProxyAuthenticationScheme = AuthenticationSchemes.Anonymous;
340 internal const string Realm = "";
341 internal const TransferMode TransferMode = System.ServiceModel.TransferMode.Buffered;
342 internal const bool UnsafeConnectionNtlmAuthentication = false;
343 internal const bool UseDefaultWebProxy = true;
344 internal const string UpgradeHeader = "Upgrade";
345 internal const string ConnectionHeader = "Connection";
346 internal const HttpMessageHandlerFactory MessageHandlerFactory = null;
348 internal static TimeSpan RequestInitializationTimeout { get { return TimeSpanHelper.FromMilliseconds(0, RequestInitializationTimeoutString); } }
349 internal const string RequestInitializationTimeoutString = "00:00:00";
351 // We use 0 as the default value of the MaxPendingAccepts property on HttpTransportBindingElement. In 4.5 we always
352 // use 10 under the hood if the default value is picked. In future releases, we could adjust the underlying default
353 // value when we have the dynamic expending pattern of BeginGetContext call implemented and the heap fragmentation issue
354 // from NCL layer solved.
355 const int PendingAcceptsConstant = 10;
356 internal const int DefaultMaxPendingAccepts = 0;
357 internal const int MaxPendingAcceptsUpperLimit = 100000;
358 internal static int GetEffectiveMaxPendingAccepts(int maxPendingAccepts)
360 return maxPendingAccepts == HttpTransportDefaults.DefaultMaxPendingAccepts ?
361 PendingAcceptsConstant :
362 maxPendingAccepts;
366 internal static WebSocketTransportSettings GetDefaultWebSocketTransportSettings()
368 return new WebSocketTransportSettings();
371 internal static MessageEncoderFactory GetDefaultMessageEncoderFactory()
373 return new TextMessageEncoderFactory(MessageVersion.Default, TextEncoderDefaults.Encoding, EncoderDefaults.MaxReadPoolSize, EncoderDefaults.MaxWritePoolSize, EncoderDefaults.ReaderQuotas);
376 internal static SecurityAlgorithmSuite MessageSecurityAlgorithmSuite
378 get { return SecurityAlgorithmSuite.Default; }
382 static class NetTcpDefaults
384 internal const MessageCredentialType MessageSecurityClientCredentialType = MessageCredentialType.Windows;
385 internal const bool TransactionsEnabled = false;
387 internal static TransactionProtocol TransactionProtocol
389 get { return TransactionProtocol.Default; }
392 internal static SecurityAlgorithmSuite MessageSecurityAlgorithmSuite
394 get { return SecurityAlgorithmSuite.Default; }
398 static class NetHttpDefaults
400 internal static TransactionProtocol TransactionProtocol
402 get { return TransactionProtocol.Default; }
406 static class PeerTransportDefaults
408 internal const IPAddress ListenIPAddress = null;
409 internal const int Port = 0;
410 internal const string ResolverTypeString = null;
411 internal const PeerAuthenticationMode PeerNodeAuthenticationMode = PeerAuthenticationMode.Password;
412 internal const bool MessageAuthentication = false;
414 internal static bool ResolverAvailable
416 get { return PnrpPeerResolver.IsPnrpAvailable; }
419 internal static bool ResolverInstalled
421 get { return PnrpPeerResolver.IsPnrpInstalled; }
424 internal static Type ResolverType
426 get { return typeof(PnrpPeerResolver); }
429 internal static Type ResolverBindingElementType
431 get { return typeof(PnrpPeerResolverBindingElement); }
434 internal static PeerResolver CreateResolver()
436 return new PnrpPeerResolver();
441 static class OneWayDefaults
443 internal static TimeSpan IdleTimeout { get { return TimeSpanHelper.FromMinutes(2, IdleTimeoutString); } }
444 internal const string IdleTimeoutString = "00:02:00";
445 internal const int MaxOutboundChannelsPerEndpoint = 10;
446 internal static TimeSpan LeaseTimeout { get { return TimeSpanHelper.FromMinutes(10, LeaseTimeoutString); } }
447 internal const string LeaseTimeoutString = "00:10:00";
448 internal const int MaxAcceptedChannels = 10;
449 internal const bool PacketRoutable = false;
452 static class ReliableSessionDefaults
454 internal const string AcknowledgementIntervalString = "00:00:00.2";
455 internal static TimeSpan AcknowledgementInterval { get { return TimeSpanHelper.FromMilliseconds(200, AcknowledgementIntervalString); } }
456 internal const bool Enabled = false;
457 internal const bool FlowControlEnabled = true;
458 internal const string InactivityTimeoutString = "00:10:00";
459 internal static TimeSpan InactivityTimeout { get { return TimeSpanHelper.FromMinutes(10, InactivityTimeoutString); } }
460 internal const int MaxPendingChannels = 4;
461 internal const int MaxRetryCount = 8;
462 internal const int MaxTransferWindowSize = 8;
463 internal const bool Ordered = true;
464 internal static ReliableMessagingVersion ReliableMessagingVersion { get { return System.ServiceModel.ReliableMessagingVersion.WSReliableMessagingFebruary2005; } }
465 internal const string ReliableMessagingVersionString = System.ServiceModel.Configuration.ConfigurationStrings.WSReliableMessagingFebruary2005;
468 static class BasicHttpBindingDefaults
470 internal const BasicHttpMessageCredentialType MessageSecurityClientCredentialType = BasicHttpMessageCredentialType.UserName;
471 internal const WSMessageEncoding MessageEncoding = WSMessageEncoding.Text;
472 internal const TransferMode TransferMode = System.ServiceModel.TransferMode.Buffered;
473 internal static Encoding TextEncoding
475 get { return TextEncoderDefaults.Encoding; }
479 static class WSHttpBindingDefaults
481 internal const WSMessageEncoding MessageEncoding = WSMessageEncoding.Text;
484 static class WSDualHttpBindingDefaults
486 internal const WSMessageEncoding MessageEncoding = WSMessageEncoding.Text;
489 static class WebSocketDefaults
491 internal const WebSocketTransportUsage TransportUsage = WebSocketTransportUsage.Never;
492 internal const bool CreateNotificationOnConnection = false;
493 internal const string DefaultKeepAliveIntervalString = "00:00:00";
494 internal static readonly TimeSpan DefaultKeepAliveInterval = TimeSpanHelper.FromSeconds(0, DefaultKeepAliveIntervalString);
496 internal const int BufferSize = 16 * 1024;
497 internal const int MinReceiveBufferSize = 256;
498 internal const int MinSendBufferSize = 16;
499 internal const bool DisablePayloadMasking = false;
500 internal const WebSocketMessageType DefaultWebSocketMessageType = WebSocketMessageType.Binary;
501 internal const string SubProtocol = null;
503 internal const int DefaultMaxPendingConnections = 0;
504 // We set this number larger than that in TCP transport because in WebSocket cases, the connection is already authenticated
505 // after we create the half-open channel. The default value is set as the default one as MaxConcurrentSessions to make it work
506 // well in burst scenarios.
507 internal static readonly int MaxPendingConnectionsCpuCount = ServiceThrottle.DefaultMaxConcurrentSessionsCpuCount;
509 internal const string WebSocketConnectionHeaderValue = "Upgrade";
510 internal const string WebSocketUpgradeHeaderValue = "websocket";
512 [System.Diagnostics.CodeAnalysis.SuppressMessage(FxCop.Category.Globalization, "CA1303",
513 Justification = "These strings don't need to be localized.")]
514 static WebSocketDefaults()
519 static class NetHttpBindingDefaults
521 internal const NetHttpMessageEncoding MessageEncoding = NetHttpMessageEncoding.Binary;
522 internal const WebSocketTransportUsage TransportUsage = WebSocketTransportUsage.WhenDuplex;