| 
					
				 | 
			
			
				@@ -1,20 +1,20 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using System; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using System.Collections.Generic; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using System.IO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using System.Net; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using System.Text; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using Emby.Server.Implementations.HttpServer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using Emby.Server.Implementations.HttpServer.SocketSharp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using MediaBrowser.Model.IO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using MediaBrowser.Model.Logging; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using MediaBrowser.Model.Services; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-using ServiceStack; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using SocketHttpListener.Net; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using IHttpFile = MediaBrowser.Model.Services.IHttpFile; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using IHttpRequest = MediaBrowser.Model.Services.IHttpRequest; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using IHttpResponse = MediaBrowser.Model.Services.IHttpResponse; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using IResponse = MediaBrowser.Model.Services.IResponse; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+namespace Emby.Server.Implementations.HttpServer.SocketSharp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public partial class WebSocketSharpRequest : IHttpRequest 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -327,19 +327,30 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var pi = httpReq.PathInfo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if (pi == null || pi.Length <= formatMaxLength) return null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if (pi[0] == '/') pi = pi.Substring(1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                format = pi.LeftPart('/'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                format = LeftPart(pi, '/'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if (format.Length > formatMaxLength) return null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            format = format.LeftPart('.').ToLower(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            format = LeftPart(format, '.').ToLower(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (format.Contains("json")) return "application/json"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (format.Contains("xml")) return Xml; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public static string LeftPart(string strVal, char needle) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (strVal == null) return null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var pos = strVal.IndexOf(needle); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return pos == -1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ? strVal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                : strVal.Substring(0, pos); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public bool HasExplicitResponseContentType { get; private set; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public static string HandlerFactoryPath; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         private string pathInfo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public string PathInfo 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -347,7 +358,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if (this.pathInfo == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    var mode = HttpListenerHost.HandlerFactoryPath; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var mode = HandlerFactoryPath; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     var pos = request.RawUrl.IndexOf("?"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     if (pos != -1) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -363,7 +374,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         this.pathInfo = request.RawUrl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    this.pathInfo = this.pathInfo.UrlDecode(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    this.pathInfo = WebUtility.UrlDecode(pathInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     this.pathInfo = NormalizePathInfo(pathInfo, mode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 return this.pathInfo; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -427,9 +438,9 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if (cookies == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     cookies = new Dictionary<string, System.Net.Cookie>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    for (var i = 0; i < this.request.Cookies.Count; i++) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    foreach (var cookie in this.request.Cookies) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var httpCookie = this.request.Cookies[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        var httpCookie = (Cookie) cookie; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         cookies[httpCookie.Name] = new System.Net.Cookie(httpCookie.Name, httpCookie.Value, httpCookie.Path, httpCookie.Domain); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -539,10 +550,10 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         return httpFiles = new IHttpFile[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     httpFiles = new IHttpFile[files.Count]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    for (var i = 0; i < files.Count; i++) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var i = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    foreach (var pair in files) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var reqFile = files[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        var reqFile = pair.Value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         httpFiles[i] = new HttpFile 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             ContentType = reqFile.ContentType, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -550,6 +561,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             FileName = reqFile.FileName, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             InputStream = reqFile.InputStream, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        i++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 return httpFiles; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -561,14 +573,13 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (stream is MemoryStream) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var other = (MemoryStream)stream; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    return new MemoryStream(other.GetBuffer(), 0, (int)other.Length, false, true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                catch (UnauthorizedAccessException) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                byte[] buffer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (streamProvider.TryGetBuffer(other, out buffer)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    return new MemoryStream(other.ToArray(), 0, (int)other.Length, false, true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return streamProvider.CreateNew(buffer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return streamProvider.CreateNew(other.ToArray()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return stream; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -577,7 +588,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public static string GetHandlerPathIfAny(string listenerUrl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (listenerUrl == null) return null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            var pos = listenerUrl.IndexOf("://", StringComparison.InvariantCultureIgnoreCase); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var pos = listenerUrl.IndexOf("://", StringComparison.OrdinalIgnoreCase); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (pos == -1) return null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             var startHostUrl = listenerUrl.Substring(pos + "://".Length); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             var endPos = startHostUrl.IndexOf('/'); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -589,7 +600,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public static string NormalizePathInfo(string pathInfo, string handlerPath) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (handlerPath != null && pathInfo.TrimStart('/').StartsWith( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                handlerPath, StringComparison.InvariantCultureIgnoreCase)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                handlerPath, StringComparison.OrdinalIgnoreCase)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 return pathInfo.TrimStart('/').Substring(handlerPath.Length); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 |