/// <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); } }
/// <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); }
/// <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; }
/// <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; }
/// <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; }