diff --git a/ServiceStack/HttpResponseExtensionsInternal.cs b/ServiceStack/HttpResponseExtensionsInternal.cs index 318d624294..f78647721e 100644 --- a/ServiceStack/HttpResponseExtensionsInternal.cs +++ b/ServiceStack/HttpResponseExtensionsInternal.cs @@ -161,10 +161,8 @@ namespace ServiceStack var responseText = result as string; if (responseText != null) { - if (response.ContentType == null || response.ContentType == "text/html") - response.ContentType = defaultContentType; - var bytes = Encoding.UTF8.GetBytes(responseText); + response.SetContentLength(bytes.Length); await response.OutputStream.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false); return; } diff --git a/SocketHttpListener.Portable/Net/HttpConnection.cs b/SocketHttpListener.Portable/Net/HttpConnection.cs index d9fd97ed2f..b09d022549 100644 --- a/SocketHttpListener.Portable/Net/HttpConnection.cs +++ b/SocketHttpListener.Portable/Net/HttpConnection.cs @@ -209,7 +209,7 @@ namespace SocketHttpListener.Net // TODO: can we get this stream before reading the input? if (o_stream == null) { - if (context.Response.SendChunked || isExpect100Continue) + if (context.Response.SendChunked || isExpect100Continue || context.Response.ContentLength64 <= 0) { o_stream = new ResponseStream(stream, context.Response, _memoryStreamFactory, _textEncoding); } @@ -438,7 +438,9 @@ namespace SocketHttpListener.Net str = String.Format("

{0}

", description); byte[] error = context.Response.ContentEncoding.GetBytes(str); - response.Close(error, false); + response.ContentLength64 = error.Length; + response.OutputStream.Write(error, 0, (int)error.Length); + response.Close(); } catch { @@ -492,7 +494,9 @@ namespace SocketHttpListener.Net { Stream st = GetResponseStream(); if (st != null) + { st.Dispose(); + } o_stream = null; } @@ -514,16 +518,6 @@ namespace SocketHttpListener.Net if (!force_close && context.Request.FlushInput()) { - if (chunked && context.Response.ForceCloseChunked == false) - { - // Don't close. Keep working. - reuses++; - Unbind(); - Init(); - BeginReadRequest(); - return; - } - reuses++; Unbind(); Init(); diff --git a/SocketHttpListener.Portable/Net/HttpListenerResponse.cs b/SocketHttpListener.Portable/Net/HttpListenerResponse.cs index 93358cae42..fb3bc2bdb3 100644 --- a/SocketHttpListener.Portable/Net/HttpListenerResponse.cs +++ b/SocketHttpListener.Portable/Net/HttpListenerResponse.cs @@ -30,8 +30,6 @@ namespace SocketHttpListener.Net internal bool HeadersSent; internal object headers_lock = new object(); - bool force_close_chunked; - private readonly ILogger _logger; private readonly ITextEncoding _textEncoding; @@ -50,11 +48,6 @@ namespace SocketHttpListener.Net } } - internal bool ForceCloseChunked - { - get { return force_close_chunked; } - } - public Encoding ContentEncoding { get @@ -327,7 +320,7 @@ namespace SocketHttpListener.Net headers.Add(name, value); } - void Close(bool force) + private void Close(bool force) { if (force) { @@ -345,20 +338,6 @@ namespace SocketHttpListener.Net Close(false); } - public void Close(byte[] responseEntity, bool willBlock) - { - if (disposed) - return; - - if (responseEntity == null) - throw new ArgumentNullException("responseEntity"); - - //TODO: if willBlock -> BeginWrite + Close ? - ContentLength64 = responseEntity.Length; - OutputStream.Write(responseEntity, 0, (int)content_length); - Close(false); - } - public void Redirect(string url) { StatusCode = 302; // Found