public IContentResponse Get(string method, string rawUrl, NameValueCollection headers, Stream inputStream) { long length; using (new MutexLock(2000, _lockName)) { using (Stream output = new FileStream(_filename, FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read)) length = output.Length; } using (Stream rawinput = new FileStream(_filename, FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite)) { long position = 0; Match m = Regex.Match(headers["If-None-Match"] ?? String.Empty, "^\"position:(?<position>\\d+)\"$"); if (m.Success) { position = Math.Min(Math.Max(0, long.Parse(m.Groups["position"].Value)), length); } using (Stream input = new ClampedStream(rawinput, position, Math.Max(0, length - position))) { PingbackRecord rec = PingbackRecord.ParseFrom(input); return(new DynamicResponse("application/vnd.google.protobuf", rec.ToByteArray()) { ETag = String.Format("position:{0}", length), LastModified = rec.RecordsCount > 0 ? rec.RecordsList[rec.RecordsCount - 1].When : DateTime.Now, }); } } }
public void TestIsDispose() { Stream s = new ClampedStream(new MemoryStream(), 0, long.MaxValue, false); s.Dispose(); s.Seek(0, SeekOrigin.Begin); Assert.Fail(); }
public void TestWritePastEndByte() { using (Stream s = new ClampedStream(new MemoryStream(new byte[255]), 2, 10)) { s.Seek(0, SeekOrigin.End); s.WriteByte(1); } Assert.Fail(); }
public void TestSetLengthNotSupported() { MemoryStream ms = new MemoryStream(SequencedBytes(20)); using (Stream s = new ClampedStream(ms, 2, 10)) { s.SetLength(20); Assert.Fail(); } }
public void TestSetLength() { MemoryStream ms = new MemoryStream(); using (Stream s = new ClampedStream(ms, 2, long.MaxValue)) { s.SetLength(20); Assert.AreEqual(22, ms.Length); } }
public void TestLength() { using (Stream s = new ClampedStream(new MemoryStream(SequencedBytes(20), false), 2, 10)) Assert.AreEqual(10, s.Length); using (Stream s = new ClampedStream(new MemoryStream(SequencedBytes(10), false), 2, 10)) Assert.AreEqual(8, s.Length); using (Stream s = new ClampedStream(new MemoryStream(SequencedBytes(10), false), 2, 0)) Assert.AreEqual(0, s.Length); using (Stream s = new ClampedStream(new MemoryStream(SequencedBytes(10), false), 12, 10)) Assert.AreEqual(0, s.Length); }
public void TestClampedFlush() { MemoryStream ms = new MemoryStream(); BufferedStream bs = new BufferedStream(ms, 1024); using (Stream s = new ClampedStream(bs, 0, long.MaxValue, false)) { s.WriteByte(1); Assert.AreEqual(0, ms.Position); s.Flush(); Assert.AreEqual(1, ms.Position); ms.Position = 0; Assert.AreEqual(1, ms.ReadByte()); } }
public void TestReadWrite() { using (MemoryStream ms = new MemoryStream(SequencedBytes(20))) using (Stream s = new ClampedStream(ms, 10, 5)) { byte[] test = new byte[200]; Assert.AreEqual(5, s.Read(test, 0, 200)); Array.Resize(ref test, 5); Assert.AreEqual(new byte[] { 10, 11, 12, 13, 14 }, test); s.Position = 0; s.Write(new byte[] { 1, 2, 3, 4, 5 }, 0, 5); s.Position = 0; Assert.AreEqual(new byte[] { 1, 2, 3, 4, 5 }, IOStream.ReadAllBytes(s)); } }
public void TestPosition() { using (Stream s = new ClampedStream(new MemoryStream(SequencedBytes(20), false), 2, 10)) { Assert.AreEqual(0, s.Position); Assert.AreEqual(2, s.ReadByte()); s.Position = 0; Assert.AreEqual(0, s.Position); Assert.AreEqual(2, s.ReadByte()); s.Position = 10; Assert.AreEqual(-1, s.ReadByte()); Assert.AreEqual(10, s.Position); Assert.AreEqual(0, s.Read(new byte[10], 0, 10)); Assert.AreEqual(10, s.Position); } }
public void TestSeek() { MemoryStream ms = new MemoryStream(SequencedBytes(100)); using (Stream s = new ClampedStream(ms, 10, 80)) { Assert.AreEqual(0, s.Seek(0, SeekOrigin.Begin)); Assert.AreEqual(0, s.Position); Assert.AreEqual(10, s.Seek(10, SeekOrigin.Begin)); Assert.AreEqual(10, s.Position); Assert.AreEqual(20, s.Seek(10, SeekOrigin.Current)); Assert.AreEqual(20, s.Position); Assert.AreEqual(15, s.Seek(-5, SeekOrigin.Current)); Assert.AreEqual(15, s.Position); Assert.AreEqual(70, s.Seek(-10, SeekOrigin.End)); Assert.AreEqual(70, s.Position); Assert.AreEqual(80, s.Seek(0, SeekOrigin.End)); Assert.AreEqual(80, s.Position); } }
public void TestClampedCanI() { MemoryStream ms = new MemoryStream(); using (ClampedStream stream = new ClampedStream(ms, 0, long.MaxValue)) { Assert.IsTrue(stream.CanRead); Assert.IsTrue(stream.CanWrite); Assert.IsTrue(stream.CanSeek); stream.Dispose(); Assert.IsFalse(stream.CanRead); Assert.IsFalse(stream.CanWrite); Assert.IsFalse(stream.CanSeek); } ms = new MemoryStream(new byte[10], false); using (ClampedStream stream = new ClampedStream(ms, 3, 5)) { Assert.IsTrue(stream.CanRead); Assert.IsFalse(stream.CanWrite); Assert.IsTrue(stream.CanSeek); } }
public void TestWritePastEnd() { using (Stream s = new ClampedStream(new MemoryStream(new byte[255]), 2, 10)) s.Write(new byte[20], 0, 20); Assert.Fail(); }
public void TestInvalidSeekPastEnd() { using (Stream s = new ClampedStream(new MemoryStream(new byte[255]), 2, 10)) s.Seek(1, SeekOrigin.End); Assert.Fail(); }
public void TestInvalidSeekBeforeBegin() { using (Stream s = new ClampedStream(new MemoryStream(new byte[255]), 2, 10)) s.Seek(-1, SeekOrigin.Begin); Assert.Fail(); }