浏览代码

update response stream handling

Luke Pulverenti 8 年之前
父节点
当前提交
1714cb8764

+ 0 - 3
Emby.Server.Core/ApplicationHost.cs

@@ -1136,9 +1136,6 @@ namespace Emby.Server.Core
         {
         {
             get
             get
             {
             {
-#if DEBUG
-                return false;
-#endif
 #pragma warning disable 162
 #pragma warning disable 162
                 return NativeApp.CanSelfUpdate;
                 return NativeApp.CanSelfUpdate;
 #pragma warning restore 162
 #pragma warning restore 162

+ 6 - 1
Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpResponse.cs

@@ -100,7 +100,12 @@ namespace Emby.Server.Implementations.HttpServer.SocketSharp
             {
             {
                 var outputStream = response.OutputStream;
                 var outputStream = response.OutputStream;
 
 
-                outputStream.Flush();
+                // This is needed with compression
+                //if (!string.IsNullOrWhiteSpace(GetHeader("Content-Encoding")))
+                {
+                    outputStream.Flush();
+                }
+
                 outputStream.Dispose();
                 outputStream.Dispose();
                 response.Close();
                 response.Close();
             }
             }

+ 4 - 0
MediaBrowser.ServerApplication/MainStartup.cs

@@ -291,6 +291,10 @@ namespace MediaBrowser.ServerApplication
         {
         {
             get
             get
             {
             {
+#if DEBUG
+                return false;
+#endif
+
                 if (_isRunningAsService)
                 if (_isRunningAsService)
                 {
                 {
                     return _canRestartService;
                     return _canRestartService;

+ 14 - 3
SocketHttpListener.Portable/Net/HttpConnection.cs

@@ -23,7 +23,7 @@ namespace SocketHttpListener.Net
         StringBuilder current_line;
         StringBuilder current_line;
         ListenerPrefix prefix;
         ListenerPrefix prefix;
         RequestStream i_stream;
         RequestStream i_stream;
-        ResponseStream o_stream;
+        Stream o_stream;
         bool chunked;
         bool chunked;
         int reuses;
         int reuses;
         bool context_bound;
         bool context_bound;
@@ -204,12 +204,23 @@ namespace SocketHttpListener.Net
             return i_stream;
             return i_stream;
         }
         }
 
 
-        public ResponseStream GetResponseStream()
+        public Stream GetResponseStream()
         {
         {
             // TODO: can we get this stream before reading the input?
             // TODO: can we get this stream before reading the input?
             if (o_stream == null)
             if (o_stream == null)
             {
             {
-                o_stream = new ResponseStream(stream, context.Response, _memoryStreamFactory, _textEncoding);
+                if (context.Response.SendChunked)
+                {
+                    o_stream = new ResponseStream(stream, context.Response, _memoryStreamFactory, _textEncoding);
+                }
+                else
+                {
+                    o_stream = stream;
+                    using (var headerStream = ResponseStream.GetHeaders(context.Response, _memoryStreamFactory, false))
+                    {
+                        headerStream.CopyTo(o_stream);
+                    }
+                }
             }
             }
             return o_stream;
             return o_stream;
         }
         }

+ 2 - 2
SocketHttpListener.Portable/Net/HttpListenerRequest.cs

@@ -181,11 +181,11 @@ namespace SocketHttpListener.Net
 
 
             if (String.Compare(Headers["Expect"], "100-continue", StringComparison.OrdinalIgnoreCase) == 0)
             if (String.Compare(Headers["Expect"], "100-continue", StringComparison.OrdinalIgnoreCase) == 0)
             {
             {
-                ResponseStream output = context.Connection.GetResponseStream();
+                var output = context.Connection.GetResponseStream();
                 
                 
                 var _100continue = _textEncoding.GetASCIIEncoding().GetBytes("HTTP/1.1 100 Continue\r\n\r\n");
                 var _100continue = _textEncoding.GetASCIIEncoding().GetBytes("HTTP/1.1 100 Continue\r\n\r\n");
 
 
-                output.InternalWrite(_100continue, 0, _100continue.Length);
+                //output.InternalWrite(_100continue, 0, _100continue.Length);
             }
             }
         }
         }
 
 

+ 1 - 1
SocketHttpListener.Portable/Net/HttpListenerResponse.cs

@@ -19,7 +19,7 @@ namespace SocketHttpListener.Net
         CookieCollection cookies;
         CookieCollection cookies;
         WebHeaderCollection headers = new WebHeaderCollection();
         WebHeaderCollection headers = new WebHeaderCollection();
         bool keep_alive = true;
         bool keep_alive = true;
-        ResponseStream output_stream;
+        Stream output_stream;
         Version version = HttpVersion.Version11;
         Version version = HttpVersion.Version11;
         string location;
         string location;
         int status_code = 200;
         int status_code = 200;

+ 5 - 5
SocketHttpListener.Portable/Net/ResponseStream.cs

@@ -64,7 +64,7 @@ namespace SocketHttpListener.Net
             {
             {
                 disposed = true;
                 disposed = true;
                 byte[] bytes = null;
                 byte[] bytes = null;
-                MemoryStream ms = GetHeaders(true);
+                MemoryStream ms = GetHeaders(response, _memoryStreamFactory, false);
                 bool chunked = response.SendChunked;
                 bool chunked = response.SendChunked;
                 if (stream.CanWrite)
                 if (stream.CanWrite)
                 {
                 {
@@ -102,14 +102,14 @@ namespace SocketHttpListener.Net
             base.Dispose(disposing);
             base.Dispose(disposing);
         }
         }
 
 
-        MemoryStream GetHeaders(bool closing)
+        internal static MemoryStream GetHeaders(HttpListenerResponse response, IMemoryStreamFactory memoryStreamFactory, bool closing)
         {
         {
             // SendHeaders works on shared headers
             // SendHeaders works on shared headers
             lock (response.headers_lock)
             lock (response.headers_lock)
             {
             {
                 if (response.HeadersSent)
                 if (response.HeadersSent)
                     return null;
                     return null;
-                MemoryStream ms = _memoryStreamFactory.CreateNew();
+                MemoryStream ms = memoryStreamFactory.CreateNew();
                 response.SendHeaders(closing, ms);
                 response.SendHeaders(closing, ms);
                 return ms;
                 return ms;
             }
             }
@@ -137,7 +137,7 @@ namespace SocketHttpListener.Net
                 throw new ObjectDisposedException(GetType().ToString());
                 throw new ObjectDisposedException(GetType().ToString());
 
 
             byte[] bytes = null;
             byte[] bytes = null;
-            MemoryStream ms = GetHeaders(false);
+            MemoryStream ms = GetHeaders(response, _memoryStreamFactory, false);
             bool chunked = response.SendChunked;
             bool chunked = response.SendChunked;
             if (ms != null)
             if (ms != null)
             {
             {
@@ -177,7 +177,7 @@ namespace SocketHttpListener.Net
                 throw new ObjectDisposedException(GetType().ToString());
                 throw new ObjectDisposedException(GetType().ToString());
 
 
             byte[] bytes = null;
             byte[] bytes = null;
-            MemoryStream ms = GetHeaders(false);
+            MemoryStream ms = GetHeaders(response, _memoryStreamFactory, false);
             bool chunked = response.SendChunked;
             bool chunked = response.SendChunked;
             if (ms != null)
             if (ms != null)
             {
             {