private async Task <MemoryStream> DownloadAndCacheAsync(string url, string filename, string filepath, CancellationToken token, TimeSpan?duration) { if (duration == null) { duration = new TimeSpan(30, 0, 0, 0); // by default we cache data 30 days } int headersTimeout = ImageService.Config.HttpHeadersTimeout; int readTimeout = ImageService.Config.HttpReadTimeout - headersTimeout; var cancelHeadersToken = new CancellationTokenSource(); cancelHeadersToken.CancelAfter(TimeSpan.FromSeconds(headersTimeout)); var linkedHeadersToken = CancellationTokenSource.CreateLinkedTokenSource(token, cancelHeadersToken.Token); using (var response = await DownloadHttpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, linkedHeadersToken.Token).ConfigureAwait(false)) { if (!response.IsSuccessStatusCode || response.Content == null) { return(null); } var cancelReadToken = new CancellationTokenSource(); cancelReadToken.CancelAfter(TimeSpan.FromSeconds(readTimeout)); var responseBytes = await response.Content.ReadAsByteArrayAsync().ConfigureAwait(false); var memoryStream = new MemoryStream(responseBytes, false); memoryStream.Position = 0; _diskCache.AddToSavingQueueIfNotExists(filename, responseBytes, duration.Value); return(memoryStream); } }
private async Task <MemoryStream> DownloadStreamAndCacheAsync(string url, string filename, string filepath, CancellationToken token, TimeSpan?duration) { var responseBytes = await DownloadAsync(url, filename, filepath, token).ConfigureAwait(false); if (responseBytes == null) { return(null); } var memoryStream = new MemoryStream(responseBytes, false); memoryStream.Position = 0; _diskCache.AddToSavingQueueIfNotExists(filename, responseBytes, duration ?? new TimeSpan(30, 0, 0, 0)); // by default we cache data 30 days) return(memoryStream); }