Jelajahi Sumber

Prepare for HostNameComparisonMode support (i.e. incomplete).

This is for bugfix #687580.
Atsushi Eno 14 tahun lalu
induk
melakukan
0bb7a5deff

+ 1 - 1
mcs/class/System.ServiceModel/System.ServiceModel.Channels.Http/HttpChannelListener.cs

@@ -120,7 +120,7 @@ namespace System.ServiceModel.Channels.Http
 		protected HttpListenerManager GetOrCreateListenerManager ()
 		{
 			var table = HttpListenerManagerTable.GetOrCreate (ChannelDispatcher != null ? ChannelDispatcher.Host : null);
-			return table.GetOrCreateManager (Uri);
+			return table.GetOrCreateManager (Uri, Source);
 		}
 
 		protected override void OnOpen (TimeSpan timeout)

+ 5 - 1
mcs/class/System.ServiceModel/System.ServiceModel.Channels.Http/HttpListenerManager.cs

@@ -107,11 +107,15 @@ namespace System.ServiceModel.Channels.Http
 
 	internal class HttpStandaloneListenerManager : HttpListenerManager
 	{
-		public HttpStandaloneListenerManager (Uri uri)
+		public HttpStandaloneListenerManager (Uri uri, HttpTransportBindingElement element)
 		{
 			var l = new HttpListener ();
 
+#if false // FIXME: enable this once we found out why this causes problem
+			string uriString = element.HostNameComparisonMode == HostNameComparisonMode.Exact ? uri.ToString () : uri.Scheme + "://*" + uri.GetComponents (UriComponents.Port | UriComponents.Path, UriFormat.SafeUnescaped);
+#else
 			string uriString = uri.ToString ();
+#endif
 			if (!uriString.EndsWith ("/", StringComparison.Ordinal))
 				uriString += "/"; // HttpListener requires this mess.
 

+ 5 - 5
mcs/class/System.ServiceModel/System.ServiceModel.Channels.Http/HttpListenerManagerTable.cs

@@ -70,7 +70,7 @@ namespace System.ServiceModel.Channels.Http
 
 		public object ServiceHostKey { get; private set; }
 
-		public HttpListenerManager GetOrCreateManager (Uri uri)
+		public HttpListenerManager GetOrCreateManager (Uri uri, HttpTransportBindingElement element)
 		{
 			var m = listeners.FirstOrDefault (p => p.Key.Equals (uri)).Value;
 			if (m == null) {
@@ -78,7 +78,7 @@ namespace System.ServiceModel.Channels.Http
 				string absolutePath = uri.AbsolutePath;
 				if (absolutePath.EndsWith ("/js", StringComparison.Ordinal) ||
 				    absolutePath.EndsWith ("/jsdebug", StringComparison.Ordinal))
-					return CreateListenerManager (uri);
+					return CreateListenerManager (uri, element);
 				
 				// Try without the query, if any
 				UriBuilder ub = null;
@@ -110,19 +110,19 @@ namespace System.ServiceModel.Channels.Http
 			}
 			
 			if (m == null)
-				return CreateListenerManager (uri);
+				return CreateListenerManager (uri, element);
 			
 			return m;
 		}
 
-		HttpListenerManager CreateListenerManager (Uri uri)
+		HttpListenerManager CreateListenerManager (Uri uri, HttpTransportBindingElement element)
 		{
 			HttpListenerManager m;
 			
 			if (ServiceHostingEnvironment.InAspNet)
 				m = new AspNetHttpListenerManager (uri);
 			else
-				m = new HttpStandaloneListenerManager (uri);
+				m = new HttpStandaloneListenerManager (uri, element);
 			listeners [uri] = m;
 
 			return m;

+ 2 - 2
mcs/class/System.ServiceModel/System.ServiceModel.Channels/SvcHttpHandler.cs

@@ -75,9 +75,9 @@ namespace System.ServiceModel.Channels
 			EnsureServiceHost ();
 
 			var table = HttpListenerManagerTable.GetOrCreate (host);
-			var manager = table.GetOrCreateManager (context.Request.Url);
+			var manager = table.GetOrCreateManager (context.Request.Url, null);
 			if (manager == null)
-				manager = table.GetOrCreateManager (host.BaseAddresses [0]);
+				manager = table.GetOrCreateManager (host.BaseAddresses [0], null);
 			var wait = new ManualResetEvent (false);
 			wcf_wait_handles [context] = wait;
 			manager.ProcessNewContext (new System.ServiceModel.Channels.Http.AspNetHttpContextInfo (this, context));