Skip to content
This repository has been archived by the owner on Jan 24, 2021. It is now read-only.

Commit

Permalink
Dispose fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
grumpydev committed Mar 20, 2012
1 parent 372e14f commit 2fcd3bb
Showing 1 changed file with 10 additions and 18 deletions.
28 changes: 10 additions & 18 deletions src/Nancy/IO/RequestStream.cs
Expand Up @@ -171,14 +171,6 @@ public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, As
return this.stream.BeginWrite(buffer, offset, count, callback, state);
}

/// <summary>
/// Closes the current stream and releases any resources (such as sockets and file handles) associated with the current stream.
/// </summary>
public override void Close()
{
this.stream.Close();
}

protected override void Dispose(bool disposing)
{
if (this.isSafeToDisposeStream)
Expand Down Expand Up @@ -320,8 +312,7 @@ public override void Write(byte[] buffer, int offset, int count)

private static FileStream CreateTemporaryFileStream()
{
var fileName = Path.GetTempFileName();
var filePath = Path.Combine(Path.GetTempPath(), fileName);
var filePath = Path.GetTempFileName();

return new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite, FileShare.None, 8192, true);
}
Expand All @@ -342,7 +333,7 @@ private Stream CreateDefaultMemoryStream(long expectedLength)

private static void DeleteTemporaryFile(string fileName)
{
if (!string.IsNullOrEmpty(fileName) || !File.Exists(fileName))
if (string.IsNullOrEmpty(fileName) || !File.Exists(fileName))
{
return;
}
Expand Down Expand Up @@ -382,43 +373,44 @@ private void MoveStreamOutOfMemoryIfExpectedLengthExceedExpectedLength(long expe

private void MoveStreamContentsToFileStream()
{
MoveStreamContentsInto(CreateTemporaryFileStream());
MoveStreamContentsInto(CreateTemporaryFileStream);
}

private void MoveStreamContentsToMemoryStream()
{
MoveStreamContentsInto(new MemoryStream());
MoveStreamContentsInto(() => new MemoryStream());
}

private bool IsStreamSeekableAndSwitchingDisabled()
{
return this.disableStreamSwitching && this.stream.CanSeek;
}

private void MoveStreamContentsInto(Stream target)
private void MoveStreamContentsInto(Func<Stream> target)
{
if (IsStreamSeekableAndSwitchingDisabled())
{
return;
}

var targetStream = target.Invoke();
this.isSafeToDisposeStream = true;

if (this.stream.CanSeek && this.stream.Length == 0)
{
this.stream.Close();
this.stream = target;
this.stream = targetStream;
return;
}

this.stream.CopyTo(target, 8196);
this.stream.CopyTo(targetStream, 8196);
if (this.stream.CanSeek)
{
this.stream.Flush();
}

target.Position = 0;
this.stream = target;
targetStream.Position = 0;
this.stream = targetStream;
}

private static void ThrowExceptionIfCtorParametersWereInvalid(Stream stream, long expectedLength, long thresholdLength)
Expand Down

0 comments on commit 2fcd3bb

Please sign in to comment.