//
// 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
// 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;
using System.Net.Security;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
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;
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; }
get { return env_version; }
}
+ internal static Encoding DefaultTextEncoding {
+ get { return default_text_encoding; }
+ }
+
public Encoding TextEncoding {
get { return text_encoding; }
set { text_encoding = value; }
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:
- case BasicHttpSecurityMode.TransportWithMessageCredential:
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.");
- return new BindingElementCollection (new BindingElement [] {
+ element = SecurityBindingElement.CreateMutualCertificateBindingElement (
+ MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10);
+ break;
+
+ case BasicHttpSecurityMode.TransportWithMessageCredential:
+ if (Security.Message.ClientCredentialType != BasicHttpMessageCredentialType.Certificate)
// FIXME: pass proper security token parameters.
- new AsymmetricSecurityBindingElement (),
- BuildMessageEncodingBindingElement (),
- GetTransport ()});
+ element = SecurityBindingElement.CreateCertificateOverTransportBindingElement ();
+ else
+ 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 ()
if (MessageEncoding == WSMessageEncoding.Text) {
TextMessageEncodingBindingElement tm = new TextMessageEncodingBindingElement (
MessageVersion.CreateVersion (EnvelopeVersion, AddressingVersion.None), TextEncoding);
+#if !NET_2_1
ReaderQuotas.CopyTo (tm.ReaderQuotas);
+#endif
return tm;
}
else
TransportBindingElement GetTransport ()
{
- HttpTransportBindingElement transportBindingElement;
+ HttpTransportBindingElement h;
switch (Security.Mode) {
case BasicHttpSecurityMode.Transport:
case BasicHttpSecurityMode.TransportWithMessageCredential:
- transportBindingElement
- = new HttpsTransportBindingElement ();
+ h = new HttpsTransportBindingElement ();
break;
default:
- transportBindingElement
- = new HttpTransportBindingElement ();
+ h = new HttpTransportBindingElement ();
break;
}
- transportBindingElement.AllowCookies = AllowCookies;
- transportBindingElement.BypassProxyOnLocal = BypassProxyOnLocal;
- transportBindingElement.HostNameComparisonMode = HostNameComparisonMode;
- transportBindingElement.MaxBufferPoolSize = MaxBufferPoolSize;
- transportBindingElement.MaxBufferSize = MaxBufferSize;
- transportBindingElement.MaxReceivedMessageSize = MaxReceivedMessageSize;
- transportBindingElement.ProxyAddress = ProxyAddress;
- transportBindingElement.UseDefaultWebProxy = UseDefaultWebProxy;
- transportBindingElement.TransferMode = TransferMode;
+ h.AllowCookies = AllowCookies;
+ h.BypassProxyOnLocal = BypassProxyOnLocal;
+ h.HostNameComparisonMode = HostNameComparisonMode;
+ h.MaxBufferPoolSize = MaxBufferPoolSize;
+ h.MaxBufferSize = MaxBufferSize;
+ h.MaxReceivedMessageSize = MaxReceivedMessageSize;
+ h.ProxyAddress = ProxyAddress;
+ h.UseDefaultWebProxy = UseDefaultWebProxy;
+ h.TransferMode = TransferMode;
+#if NET_4_0
+ h.ExtendedProtectionPolicy = Security.Transport.ExtendedProtectionPolicy;
+#endif
- return transportBindingElement;
+#if !NET_2_1 || MOBILE
+ 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;
+ break;
+ case HttpClientCredentialType.Certificate:
+ switch (Security.Mode) {
+ case BasicHttpSecurityMode.Transport:
+ (h as HttpsTransportBindingElement).RequireClientCertificate = true;
+ break;
+ case BasicHttpSecurityMode.TransportCredentialOnly:
+ throw new InvalidOperationException ("Certificate-based client authentication is not supported by 'TransportCredentialOnly' mode.");
+ }
+ break;
+ }
+#endif
+
+ return h;
}
// explicit interface implementations
}
}
}
+#endif