public void Write(object data, bool allowZip, RangeDescriptor range) { var sendobject = GetSendObject(data); if (allowZip && SupportGZip && IsRequiredGZip(sendobject)) { SetHeader("Content-Encoding", "gzip"); var ms = EnsureStream(sendobject); var str = Stream; if (ms.Length < 1024000 && null == range) { str = new MemoryStream(); } using (var g = new GZipStream(str, CompressionLevel.Optimal, leaveOpen: str != Stream)) { if (null == range) { ms.CopyTo(g, 4096); } else { CopyRanged(range, ms, g); } } if (str != Stream) { SetHeader("Content-Length", str.Length.ToStr()); str.Position = 0; str.CopyTo(Stream); } } else { var bytes = sendobject as byte[]; if (null != bytes) { var start = null == range ? 0 : range.Start; var length = null == range ? bytes.Length : range.Finish - range.Start + 1; Stream.Write(bytes, (int)start, (int)length); } else { if (null != range) { CopyRanged(range, (Stream)sendobject, Stream); } else { ((Stream)sendobject).CopyTo(Stream); } } } }
private static void CopyRanged(RangeDescriptor range, Stream source, Stream target) { source.Seek(range.Start, SeekOrigin.Current); var totalLength = range.Finish - range.Start + 1; var currentLength = 0; var buffer = new byte[524288]; while (true) { if (currentLength >= totalLength) { break; } ; var readsize = Math.Min(524288, totalLength - currentLength); var currentChunk = source.Read(buffer, 0, (int)readsize); if (currentChunk <= 0) { break; } currentLength += currentChunk; target.Write(buffer, 0, currentChunk); } }
public void Finish(object data, string mime = "application/json", int status = 200, RangeDescriptor range = null) { StatusCode = status; if (mime.Contains("text") || mime.Contains("json")) { mime += "; charset=utf-8"; } ContentType = mime; if (CallingMethod == "HEAD") { ConentLength = 0; } else { if (null != range) { StatusCode = 206; AddHeader("Content-Range", string.Format("bytes {0}-{1}/{2}", range.Start, range.Finish, range.Total)); var length = range.Finish - range.Start + 1; ConentLength = length; } else { var s = data as string; if (s != null && s.Length < 512) { ConentLength = Encoding.UTF8.GetByteCount(s); } } } WriteCookies(); if (CallingMethod != "HEAD") { Write(data, true, range); } Close(); }
public void Finish(object data, string mime = "application/json", int status = 200, RangeDescriptor range = null) { Response.Finish(data, mime, status, range); }