Beispiel #1
0
        /// <summary>
        /// Byte Range Response
        /// </summary>
        /// <param name="content">source content stream</param>
        /// <param name="range">range header</param>
        /// <param name="mediaType">MIME</param>
        /// <exception cref="NotSupportedException"></exception>
        public ByteRangeResponse(Stream content, RangeHeaderValue range, string mediaType)
            
        {
            if (!range.Unit.Equals("BYTES",StringComparison.InvariantCultureIgnoreCase))
            {
                throw new NotSupportedException();
            }
            if (!range.Any())
            {
                throw new ArgumentException("range");
            }

            if (string.IsNullOrEmpty(mediaType))
            {
                mediaType = MimeTypes.GetMimeType("application/octet-stream");
            }

            var contentLength = content.Length - content.Position;
            var itemCount = range.RangeItemHeaderValues.Count();

            if (itemCount == 1)
            {
                var rangeItem = range.First();
                base.Contents = x =>
                {
                    var temStream = new ByteRangeStream(content, rangeItem);
                    temStream.CopyTo(x);
                };
                base.ContentType = mediaType;
                base.Headers.Add("Content-Range", $"{range.Unit} {rangeItem.From}-{rangeItem.To}/{contentLength}");
                base.StatusCode = HttpStatusCode.PartialContent;
            }
            else
            {
                throw new NotSupportedException();
            }
        }