Merge pull request #747 from spicypixel/hotfix/object-disable-com
[mono.git] / mcs / class / System.ServiceModel / System.ServiceModel / BasicHttpBinding.cs
index e805b0fc0a63f73f12957ea3a10e97e57f7eda79..4feebc7a115d7a98ceb6ef70cefc67d83f62c679 100644 (file)
@@ -1,10 +1,14 @@
 //
 // BasicHttpBinding.cs
 //
+// See BasicHttpBinding_4_5.cs and HttpBindingBase.cs for the .NET 4.5
+// version of this class.
+//
 // Author:
 //     Atsushi Enomoto <atsushi@ximian.com>
 //
 // Copyright (C) 2005-2006 Novell, Inc.  http://www.novell.com
+// Copyright 2011 Xamarin Inc (http://www.xamarin.com).
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -25,6 +29,7 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
+#if !NET_4_5 && !MOBILE
 using System;
 using System.Collections.Generic;
 using System.Net;
@@ -52,7 +57,8 @@ namespace System.ServiceModel
                XmlDictionaryReaderQuotas reader_quotas
                        = new XmlDictionaryReaderQuotas ();
                EnvelopeVersion env_version = EnvelopeVersion.Soap11;
-               Encoding text_encoding = new UTF8Encoding ();
+               static readonly Encoding default_text_encoding = new UTF8Encoding ();
+               Encoding text_encoding = default_text_encoding;
                TransferMode transfer_mode
                         = TransferMode.Buffered;
                bool use_default_web_proxy = true;
@@ -91,6 +97,18 @@ namespace System.ServiceModel
                        set { bypass_proxy_on_local = value; }
                }
 
+#if NET_2_1
+               public bool EnableHttpCookieContainer {
+                       get; set;
+               }
+#elif NET_4_5
+               [Obsolete ("Use AllowCookies.")]
+               public bool EnableHttpCookieContainer {
+                       get { return AllowCookies; }
+                       set { AllowCookies = value; }
+               }
+#endif
+
                public HostNameComparisonMode HostNameComparisonMode {
                        get { return host_name_comparison_mode; }
                        set { host_name_comparison_mode = value; }
@@ -158,6 +176,10 @@ namespace System.ServiceModel
                        get { return env_version; }
                }
 
+               internal static Encoding DefaultTextEncoding {
+                       get { return default_text_encoding; }
+               }
+               
                public Encoding TextEncoding {
                        get { return text_encoding; }
                        set { text_encoding = value; }
@@ -176,27 +198,52 @@ namespace System.ServiceModel
                public override BindingElementCollection
                        CreateBindingElements ()
                {
+                       var list = new List<BindingElement> ();
+                       
+                       var security = CreateSecurityBindingElement ();
+                       if (security != null)
+                               list.Add (security);
+
+#if NET_2_1
+                       if (EnableHttpCookieContainer)
+                               list.Add (new HttpCookieContainerBindingElement ());
+#endif
+
+                       list.Add (BuildMessageEncodingBindingElement ());
+                       list.Add (GetTransport ());
+
+                       return new BindingElementCollection (list.ToArray ());
+               }
+               
+               SecurityBindingElement CreateSecurityBindingElement () 
+               {
+            SecurityBindingElement element;
                        switch (Security.Mode) {
 #if !NET_2_1
                        case BasicHttpSecurityMode.Message:
                                if (Security.Message.ClientCredentialType != BasicHttpMessageCredentialType.Certificate)
                                        throw new InvalidOperationException ("When Message security is enabled in a BasicHttpBinding, the message security credential type must be BasicHttpMessageCredentialType.Certificate.");
-                               goto case BasicHttpSecurityMode.TransportWithMessageCredential;
+                               element = SecurityBindingElement.CreateMutualCertificateBindingElement (
+                                   MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10);
+                               break;
+
                        case BasicHttpSecurityMode.TransportWithMessageCredential:
-                               SecurityBindingElement sec;
                                if (Security.Message.ClientCredentialType != BasicHttpMessageCredentialType.Certificate)
                                        // FIXME: pass proper security token parameters.
-                                       sec = SecurityBindingElement.CreateCertificateOverTransportBindingElement ();
+                                       element = SecurityBindingElement.CreateCertificateOverTransportBindingElement ();
                                else
-                                       sec = new AsymmetricSecurityBindingElement ();
-                               return new BindingElementCollection (new BindingElement [] {sec, BuildMessageEncodingBindingElement (), GetTransport ()});
+                                       element = new AsymmetricSecurityBindingElement ();
+                               break;
 #endif
-                       default:
-                               return new BindingElementCollection (new BindingElement [] {
-                                       BuildMessageEncodingBindingElement (),
-                                       GetTransport ()});
+                       default: 
+                               return null;
                        }
 
+#if !NET_2_1
+                       element.SetKeyDerivation (false);
+                       element.SecurityHeaderLayout = SecurityHeaderLayout.Lax;
+#endif
+                       return element;
                }
 
                MessageEncodingBindingElement BuildMessageEncodingBindingElement ()
@@ -240,32 +287,30 @@ namespace System.ServiceModel
                        h.ProxyAddress = ProxyAddress;
                        h.UseDefaultWebProxy = UseDefaultWebProxy;
                        h.TransferMode = TransferMode;
+#if NET_4_0
+                       h.ExtendedProtectionPolicy = Security.Transport.ExtendedProtectionPolicy;
+#endif
 
-#if !NET_2_1
-                       switch (Security.Mode) {
-                       case BasicHttpSecurityMode.Transport:
-                               switch (Security.Transport.ClientCredentialType) {
-                               case HttpClientCredentialType.Certificate:
-                                       var https = (HttpsTransportBindingElement) h;
-                                       https.RequireClientCertificate = true;
-                                       break;
-                               }
+#if !NET_2_1 || MOBILE
+                       switch (Security.Transport.ClientCredentialType) {
+                       case HttpClientCredentialType.Basic:
+                               h.AuthenticationScheme = AuthenticationSchemes.Basic;
                                break;
-                       case BasicHttpSecurityMode.TransportCredentialOnly:
-                               switch (Security.Transport.ClientCredentialType) {
-                               case HttpClientCredentialType.Basic:
-                                       h.AuthenticationScheme = AuthenticationSchemes.Basic;
-                                       break;
-                               case HttpClientCredentialType.Ntlm:
-                                       h.AuthenticationScheme = AuthenticationSchemes.Ntlm;
-                                       break;
-                               case HttpClientCredentialType.Windows:
-                                       h.AuthenticationScheme = AuthenticationSchemes.Negotiate;
-                                       break;
-                               case HttpClientCredentialType.Digest:
-                                       h.AuthenticationScheme = AuthenticationSchemes.Digest;
+                       case HttpClientCredentialType.Ntlm:
+                               h.AuthenticationScheme = AuthenticationSchemes.Ntlm;
+                               break;
+                       case HttpClientCredentialType.Windows:
+                               h.AuthenticationScheme = AuthenticationSchemes.Negotiate;
+                               break;
+                       case HttpClientCredentialType.Digest:
+                               h.AuthenticationScheme = AuthenticationSchemes.Digest;
+                               break;
+                       case HttpClientCredentialType.Certificate:
+                               switch (Security.Mode) {
+                               case BasicHttpSecurityMode.Transport:
+                                       (h as HttpsTransportBindingElement).RequireClientCertificate = true;
                                        break;
-                               case HttpClientCredentialType.Certificate:
+                               case BasicHttpSecurityMode.TransportCredentialOnly:
                                        throw new InvalidOperationException ("Certificate-based client authentication is not supported by 'TransportCredentialOnly' mode.");
                                }
                                break;
@@ -282,3 +327,4 @@ namespace System.ServiceModel
                }
        }
 }
+#endif