예제 #1
0
        Task ServeRangeContentAsync(
            IHttpRequest request,
            IHttpResponse response,
            string pathToContentFile)
        {
            // Get and validate the range
            var rangeHeaderValie = request.Header[HttpKeys.Range];

            if (rangeHeaderValie.Length >= MaxRangeHeaderValueLength)
            {
                throw new HttpPayloadTooLargeException(
                          $"Range header value length reached maximum value of {MaxRangeHeaderValueLength}"
                          );
            }
            var requestedRanges = StaticRangeValueParserUtils.GetRequestedRanges(rangeHeaderValie);

            if (requestedRanges.Length == 0 || requestedRanges.Length > MaxRangeCount)
            {
                throw new StaticRangeNotSatisfiableException();
            }

            // Range is good, from this point forward,
            // we will be serving partial content.
            response.Header.StatusCode = 206;

            if (requestedRanges.Length == 1)
            {
                return(_staticFileServer.WriteAsync(
                           request,
                           requestedRanges[0],
                           response,
                           pathToContentFile, _tcpSettings.ReadWriteBufferSize
                           ));
            }
            else
            {
                return(_staticFileServer.WriteAsync(
                           request,
                           requestedRanges,
                           response,
                           pathToContentFile, _tcpSettings.ReadWriteBufferSize
                           ));
            }
        }