// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
-#if NET_2_0 && SECURITY_DEP
+#if SECURITY_DEP
using System.IO;
using System.Net.Sockets;
byte [] bytes = null;
MemoryStream ms = GetHeaders (true);
bool chunked = response.SendChunked;
- if (ms != null) {
- long start = ms.Position;
- if (chunked && !trailer_sent) {
- bytes = GetChunkSizeBytes (0, true);
- ms.Position = ms.Length;
- ms.Write (bytes, 0, bytes.Length);
+ if (stream.CanWrite) {
+ try {
+ if (ms != null) {
+ long start = ms.Position;
+ if (chunked && !trailer_sent) {
+ bytes = GetChunkSizeBytes (0, true);
+ ms.Position = ms.Length;
+ ms.Write (bytes, 0, bytes.Length);
+ }
+ InternalWrite (ms.GetBuffer (), (int) start, (int) (ms.Length - start));
+ trailer_sent = true;
+ } else if (chunked && !trailer_sent) {
+ bytes = GetChunkSizeBytes (0, true);
+ InternalWrite (bytes, 0, bytes.Length);
+ trailer_sent = true;
+ }
+ } catch (IOException) {
+ // Ignore error due to connection reset by peer
}
- InternalWrite (ms.GetBuffer (), (int) start, (int) (ms.Length - start));
- trailer_sent = true;
- } else if (chunked && !trailer_sent) {
- bytes = GetChunkSizeBytes (0, true);
- InternalWrite (bytes, 0, bytes.Length);
- trailer_sent = true;
}
response.Close ();
}
MemoryStream GetHeaders (bool closing)
{
- if (response.HeadersSent)
- return null;
- MemoryStream ms = new MemoryStream ();
- response.SendHeaders (closing, ms);
- return ms;
+ // SendHeaders works on shared headers
+ lock (response.headers_lock) {
+ if (response.HeadersSent)
+ return null;
+ MemoryStream ms = new MemoryStream ();
+ response.SendHeaders (closing, ms);
+ return ms;
+ }
}
public override void Flush ()
{
if (disposed)
throw new ObjectDisposedException (GetType ().ToString ());
+ if (count == 0)
+ return;
byte [] bytes = null;
MemoryStream ms = GetHeaders (false);