Exemplo n.º 1
0
        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);
                    }
                }
            }
        }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 3
0
        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();
        }
Exemplo n.º 4
0
 public void Finish(object data, string mime = "application/json", int status = 200, RangeDescriptor range = null)
 {
     Response.Finish(data, mime, status, range);
 }