/// <summary>
        /// Gets the static remote stream result.
        /// </summary>
        /// <param name="state">The state.</param>
        /// <param name="responseHeaders">The response headers.</param>
        /// <param name="isHeadRequest">if set to <c>true</c> [is head request].</param>
        /// <param name="cancellationTokenSource">The cancellation token source.</param>
        /// <returns>Task{System.Object}.</returns>
        private async Task <object> GetStaticRemoteStreamResult(
            StreamState state,
            Dictionary <string, string> responseHeaders,
            bool isHeadRequest,
            CancellationTokenSource cancellationTokenSource)
        {
            var options = new HttpRequestOptions
            {
                Url               = state.MediaPath,
                BufferContent     = false,
                CancellationToken = cancellationTokenSource.Token
            };

            if (state.RemoteHttpHeaders.TryGetValue(HeaderNames.UserAgent, out var useragent))
            {
                options.UserAgent = useragent;
            }

            var response = await HttpClient.GetResponse(options).ConfigureAwait(false);

            responseHeaders[HeaderNames.AcceptRanges] = "none";

            // Seeing cases of -1 here
            if (response.ContentLength.HasValue && response.ContentLength.Value >= 0)
            {
                responseHeaders[HeaderNames.ContentLength] = response.ContentLength.Value.ToString(CultureInfo.InvariantCulture);
            }

            if (isHeadRequest)
            {
                using (response)
                {
                    return(ResultFactory.GetResult(null, Array.Empty <byte>(), response.ContentType, responseHeaders));
                }
            }

            var result = new StaticRemoteStreamWriter(response);

            result.Headers[HeaderNames.ContentType] = response.ContentType;

            // Add the response headers to the result object
            foreach (var header in responseHeaders)
            {
                result.Headers[header.Key] = header.Value;
            }

            return(result);
        }
        /// <summary>
        /// Gets the static remote stream result.
        /// </summary>
        /// <param name="item">The item.</param>
        /// <param name="responseHeaders">The response headers.</param>
        /// <param name="isHeadRequest">if set to <c>true</c> [is head request].</param>
        /// <returns>Task{System.Object}.</returns>
        private async Task <object> GetStaticRemoteStreamResult(BaseItem item, Dictionary <string, string> responseHeaders, bool isHeadRequest)
        {
            responseHeaders["Accept-Ranges"] = "none";

            var httpClient = new HttpClient(new WebRequestHandler
            {
                CachePolicy            = new RequestCachePolicy(RequestCacheLevel.BypassCache),
                AutomaticDecompression = DecompressionMethods.None
            });

            using (var message = new HttpRequestMessage(HttpMethod.Get, item.Path))
            {
                var useragent = GetUserAgent(item);

                if (!string.IsNullOrEmpty(useragent))
                {
                    message.Headers.Add("User-Agent", useragent);
                }

                var response = await httpClient.SendAsync(message, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false);

                response.EnsureSuccessStatusCode();

                var contentType = response.Content.Headers.ContentType.MediaType;

                // Headers only
                if (isHeadRequest)
                {
                    response.Dispose();
                    httpClient.Dispose();

                    return(ResultFactory.GetResult(null, contentType, responseHeaders));
                }

                var result = new StaticRemoteStreamWriter(response, httpClient);

                result.Options["Content-Type"] = contentType;

                // Add the response headers to the result object
                foreach (var header in responseHeaders)
                {
                    result.Options[header.Key] = header.Value;
                }

                return(result);
            }
        }
Exemple #3
0
        /// <summary>
        /// Gets the static remote stream result.
        /// </summary>
        /// <param name="state">The state.</param>
        /// <param name="responseHeaders">The response headers.</param>
        /// <param name="isHeadRequest">if set to <c>true</c> [is head request].</param>
        /// <param name="cancellationTokenSource">The cancellation token source.</param>
        /// <returns>Task{System.Object}.</returns>
        private async Task <object> GetStaticRemoteStreamResult(StreamState state, Dictionary <string, string> responseHeaders, bool isHeadRequest, CancellationTokenSource cancellationTokenSource)
        {
            string useragent = null;

            state.RemoteHttpHeaders.TryGetValue("User-Agent", out useragent);

            var options = new HttpRequestOptions
            {
                Url               = state.MediaPath,
                UserAgent         = useragent,
                BufferContent     = false,
                CancellationToken = cancellationTokenSource.Token
            };

            var response = await HttpClient.GetResponse(options).ConfigureAwait(false);

            responseHeaders["Accept-Ranges"] = "none";

            var length = response.Headers["Content-Length"];

            if (!string.IsNullOrEmpty(length))
            {
                responseHeaders["Content-Length"] = length;
            }

            if (isHeadRequest)
            {
                using (response.Content)
                {
                    return(ResultFactory.GetResult(new byte[] { }, response.ContentType, responseHeaders));
                }
            }

            var result = new StaticRemoteStreamWriter(response);

            result.Options["Content-Type"] = response.ContentType;

            // Add the response headers to the result object
            foreach (var header in responseHeaders)
            {
                result.Options[header.Key] = header.Value;
            }

            return(result);
        }
Exemple #4
0
        /// <summary>
        /// Gets the static remote stream result.
        /// </summary>
        /// <param name="mediaPath">The media path.</param>
        /// <param name="responseHeaders">The response headers.</param>
        /// <param name="isHeadRequest">if set to <c>true</c> [is head request].</param>
        /// <returns>Task{System.Object}.</returns>
        private async Task <object> GetStaticRemoteStreamResult(string mediaPath, Dictionary <string, string> responseHeaders, bool isHeadRequest)
        {
            var options = new HttpRequestOptions
            {
                Url           = mediaPath,
                UserAgent     = GetUserAgent(mediaPath),
                BufferContent = false
            };

            var response = await HttpClient.GetResponse(options).ConfigureAwait(false);

            responseHeaders["Accept-Ranges"] = "none";

            var length = response.Headers["Content-Length"];

            if (!string.IsNullOrEmpty(length))
            {
                responseHeaders["Content-Length"] = length;
            }

            if (isHeadRequest)
            {
                using (response.Content)
                {
                    return(ResultFactory.GetResult(new byte[] { }, response.ContentType, responseHeaders));
                }
            }

            var result = new StaticRemoteStreamWriter(response);

            result.Options["Content-Type"] = response.ContentType;

            // Add the response headers to the result object
            foreach (var header in responseHeaders)
            {
                result.Options[header.Key] = header.Value;
            }

            return(result);
        }
        /// <summary>
        /// Gets the static remote stream result.
        /// </summary>
        /// <param name="state">The state.</param>
        /// <param name="responseHeaders">The response headers.</param>
        /// <param name="isHeadRequest">if set to <c>true</c> [is head request].</param>
        /// <param name="cancellationTokenSource">The cancellation token source.</param>
        /// <returns>Task{System.Object}.</returns>
        private async Task<object> GetStaticRemoteStreamResult(StreamState state, Dictionary<string, string> responseHeaders, bool isHeadRequest, CancellationTokenSource cancellationTokenSource)
        {
            string useragent = null;
            state.RemoteHttpHeaders.TryGetValue("User-Agent", out useragent);

            var trySupportSeek = false;

            var options = new HttpRequestOptions
            {
                Url = state.MediaPath,
                UserAgent = useragent,
                BufferContent = false,
                CancellationToken = cancellationTokenSource.Token
            };

            if (trySupportSeek)
            {
                if (!string.IsNullOrWhiteSpace(Request.QueryString["Range"]))
                {
                    options.RequestHeaders["Range"] = Request.QueryString["Range"];
                }
            }
            var response = await HttpClient.GetResponse(options).ConfigureAwait(false);

            if (trySupportSeek)
            {
                foreach (var name in new[] {"Content-Range", "Accept-Ranges"})
                {
                    var val = response.Headers[name];
                    if (!string.IsNullOrWhiteSpace(val))
                    {
                        responseHeaders[name] = val;
                    }
                }
            }
            else
            {
                responseHeaders["Accept-Ranges"] = "none";
            }
            
            if (response.ContentLength.HasValue)
            {
                responseHeaders["Content-Length"] = response.ContentLength.Value.ToString(UsCulture);
            }
            
            if (isHeadRequest)
            {
                using (response)
                {
                    return ResultFactory.GetResult(new byte[] { }, response.ContentType, responseHeaders);
                }
            }

            var result = new StaticRemoteStreamWriter(response);

            result.Options["Content-Type"] = response.ContentType;

            // Add the response headers to the result object
            foreach (var header in responseHeaders)
            {
                result.Options[header.Key] = header.Value;
            }

            return result;
        }
Exemple #6
0
        /// <summary>
        /// Gets the static remote stream result.
        /// </summary>
        /// <param name="state">The state.</param>
        /// <param name="responseHeaders">The response headers.</param>
        /// <param name="isHeadRequest">if set to <c>true</c> [is head request].</param>
        /// <param name="cancellationTokenSource">The cancellation token source.</param>
        /// <returns>Task{System.Object}.</returns>
        private async Task <object> GetStaticRemoteStreamResult(StreamState state, Dictionary <string, string> responseHeaders, bool isHeadRequest, CancellationTokenSource cancellationTokenSource)
        {
            string useragent = null;

            state.RemoteHttpHeaders.TryGetValue("User-Agent", out useragent);

            var trySupportSeek = false;

            var options = new HttpRequestOptions
            {
                Url               = state.MediaPath,
                UserAgent         = useragent,
                BufferContent     = false,
                CancellationToken = cancellationTokenSource.Token
            };

            if (trySupportSeek)
            {
                if (!string.IsNullOrWhiteSpace(Request.QueryString["Range"]))
                {
                    options.RequestHeaders["Range"] = Request.QueryString["Range"];
                }
            }
            var response = await HttpClient.GetResponse(options).ConfigureAwait(false);

            if (trySupportSeek)
            {
                foreach (var name in new[] { "Content-Range", "Accept-Ranges" })
                {
                    var val = response.Headers[name];
                    if (!string.IsNullOrWhiteSpace(val))
                    {
                        responseHeaders[name] = val;
                    }
                }
            }
            else
            {
                responseHeaders["Accept-Ranges"] = "none";
            }

            if (response.ContentLength.HasValue)
            {
                responseHeaders["Content-Length"] = response.ContentLength.Value.ToString(UsCulture);
            }

            if (isHeadRequest)
            {
                using (response)
                {
                    return(ResultFactory.GetResult(new byte[] { }, response.ContentType, responseHeaders));
                }
            }

            var result = new StaticRemoteStreamWriter(response);

            result.Options["Content-Type"] = response.ContentType;

            // Add the response headers to the result object
            foreach (var header in responseHeaders)
            {
                result.Options[header.Key] = header.Value;
            }

            return(result);
        }
        /// <summary>
        /// Gets the static remote stream result.
        /// </summary>
        /// <param name="mediaPath">The media path.</param>
        /// <param name="responseHeaders">The response headers.</param>
        /// <param name="isHeadRequest">if set to <c>true</c> [is head request].</param>
        /// <returns>Task{System.Object}.</returns>
        private async Task<object> GetStaticRemoteStreamResult(string mediaPath, Dictionary<string, string> responseHeaders, bool isHeadRequest)
        {
            var options = new HttpRequestOptions
            {
                Url = mediaPath,
                UserAgent = GetUserAgent(mediaPath),
                BufferContent = false
            };

            var response = await HttpClient.GetResponse(options).ConfigureAwait(false);

            responseHeaders["Accept-Ranges"] = "none";

            var length = response.Headers["Content-Length"];

            if (!string.IsNullOrEmpty(length))
            {
                responseHeaders["Content-Length"] = length;
            }

            if (isHeadRequest)
            {
                using (response.Content)
                {
                    return ResultFactory.GetResult(new byte[] { }, response.ContentType, responseHeaders);
                }
            }

            var result = new StaticRemoteStreamWriter(response);

            result.Options["Content-Type"] = response.ContentType;

            // Add the response headers to the result object
            foreach (var header in responseHeaders)
            {
                result.Options[header.Key] = header.Value;
            }

            return result;
        }
Exemple #8
0
        /// <summary>
        /// Gets the static remote stream result.
        /// </summary>
        /// <param name="state">The state.</param>
        /// <param name="responseHeaders">The response headers.</param>
        /// <param name="isHeadRequest">if set to <c>true</c> [is head request].</param>
        /// <param name="cancellationTokenSource">The cancellation token source.</param>
        /// <returns>Task{System.Object}.</returns>
        private async Task <object> GetStaticRemoteStreamResult(StreamState state, Dictionary <string, string> responseHeaders, bool isHeadRequest, CancellationTokenSource cancellationTokenSource)
        {
            state.RemoteHttpHeaders.TryGetValue(HeaderNames.UserAgent, out var useragent);

            const bool trySupportSeek = false;

            var options = new HttpRequestOptions
            {
                Url               = state.MediaPath,
                UserAgent         = useragent,
                BufferContent     = false,
                CancellationToken = cancellationTokenSource.Token
            };

            if (trySupportSeek)
            {
                if (!string.IsNullOrWhiteSpace(Request.QueryString[HeaderNames.Range]))
                {
                    options.RequestHeaders[HeaderNames.Range] = Request.QueryString[HeaderNames.Range];
                }
            }
            var response = await HttpClient.GetResponse(options).ConfigureAwait(false);

            if (trySupportSeek)
            {
                foreach (var name in new[] { HeaderNames.ContentRange, HeaderNames.AcceptRanges })
                {
                    var val = response.Headers[name];
                    if (!string.IsNullOrWhiteSpace(val))
                    {
                        responseHeaders[name] = val;
                    }
                }
            }
            else
            {
                responseHeaders[HeaderNames.AcceptRanges] = "none";
            }

            // Seeing cases of -1 here
            if (response.ContentLength.HasValue && response.ContentLength.Value >= 0)
            {
                responseHeaders[HeaderNames.ContentLength] = response.ContentLength.Value.ToString(CultureInfo.InvariantCulture);
            }

            if (isHeadRequest)
            {
                using (response)
                {
                    return(ResultFactory.GetResult(null, new byte[] { }, response.ContentType, responseHeaders));
                }
            }

            var result = new StaticRemoteStreamWriter(response);

            result.Headers[HeaderNames.ContentType] = response.ContentType;

            // Add the response headers to the result object
            foreach (var header in responseHeaders)
            {
                result.Headers[header.Key] = header.Value;
            }

            return(result);
        }
        /// <summary>
        /// Gets the static remote stream result.
        /// </summary>
        /// <param name="item">The item.</param>
        /// <param name="responseHeaders">The response headers.</param>
        /// <param name="isHeadRequest">if set to <c>true</c> [is head request].</param>
        /// <returns>Task{System.Object}.</returns>
        private async Task<object> GetStaticRemoteStreamResult(BaseItem item, Dictionary<string, string> responseHeaders, bool isHeadRequest)
        {
            responseHeaders["Accept-Ranges"] = "none";

            var httpClient = new HttpClient();

            using (var message = new HttpRequestMessage(HttpMethod.Get, item.Path))
            {
                var useragent = GetUserAgent(item);

                if (!string.IsNullOrEmpty(useragent))
                {
                    message.Headers.Add("User-Agent", useragent);
                }

                var response = await httpClient.SendAsync(message, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false);

                response.EnsureSuccessStatusCode();

                var contentType = response.Content.Headers.ContentType.MediaType;

                // Headers only
                if (isHeadRequest)
                {
                    response.Dispose();
                    httpClient.Dispose();

                    return ResultFactory.GetResult(null, contentType, responseHeaders);
                }

                var result = new StaticRemoteStreamWriter(response, httpClient);

                result.Options["Content-Type"] = contentType;

                // Add the response headers to the result object
                foreach (var header in responseHeaders)
                {
                    result.Options[header.Key] = header.Value;
                }

                return result;
            }
        }
        /// <summary>
        /// Gets the static remote stream result.
        /// </summary>
        /// <param name="state">The state.</param>
        /// <param name="responseHeaders">The response headers.</param>
        /// <param name="isHeadRequest">if set to <c>true</c> [is head request].</param>
        /// <param name="cancellationTokenSource">The cancellation token source.</param>
        /// <returns>Task{System.Object}.</returns>
        private async Task<object> GetStaticRemoteStreamResult(StreamState state, Dictionary<string, string> responseHeaders, bool isHeadRequest, CancellationTokenSource cancellationTokenSource)
        {
            string useragent = null;
            state.RemoteHttpHeaders.TryGetValue("User-Agent", out useragent);

            var options = new HttpRequestOptions
            {
                Url = state.MediaPath,
                UserAgent = useragent,
                BufferContent = false,
                CancellationToken = cancellationTokenSource.Token
            };

            var response = await HttpClient.GetResponse(options).ConfigureAwait(false);

            responseHeaders["Accept-Ranges"] = "none";

            var length = response.Headers["Content-Length"];

            if (!string.IsNullOrEmpty(length))
            {
                responseHeaders["Content-Length"] = length;
            }

            if (isHeadRequest)
            {
                using (response.Content)
                {
                    return ResultFactory.GetResult(new byte[] { }, response.ContentType, responseHeaders);
                }
            }

            var result = new StaticRemoteStreamWriter(response);

            result.Options["Content-Type"] = response.ContentType;

            // Add the response headers to the result object
            foreach (var header in responseHeaders)
            {
                result.Options[header.Key] = header.Value;
            }

            return result;
        }