public async Task <bool> IsAvailableAsync(PackageIdentity identity, CancellationToken token) { var request = new HttpSourceRequest(() => { var url = _urlBuilder.GetSymbolsUrl(identity); // Ideally this would be an HTTP HEAD request, but MyGet does not seem to support // this. As an alternative, make an HTTP GET range request for 0 bytes. var requestMessage = new HttpRequestMessage(HttpMethod.Get, url); requestMessage.Headers.Range = new RangeHeaderValue(0, 0); return(requestMessage); }); request.IgnoreNotFounds = true; var output = await _httpSource.ProcessStreamAsync( request, stream => { var isAvailable = stream != null; return(Task.FromResult(isAvailable)); }, _logger, token); return(output); }
public async Task <T> ProcessAsync <T>(PackageIdentity identity, Func <StreamResult, Task <T> > processAsync, CancellationToken token) { var url = _urlBuilder.GetSymbolsUrl(identity); var request = new HttpSourceRequest(url, _logger); request.IgnoreNotFounds = true; var output = await _httpSource.ProcessStreamAsync( request, async stream => { if (stream == null) { var result = new StreamResult { IsAvailable = false, Stream = Stream.Null }; return(await processAsync(result)); } else { // Save the symbols package to a temporary location. var temporaryPath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); using (var fileStream = new FileStream( temporaryPath, FileMode.Create, FileAccess.ReadWrite, FileShare.None, BufferSize, FileOptions.Asynchronous | FileOptions.DeleteOnClose)) { await stream.CopyToAsync(fileStream); fileStream.Position = 0; var result = new StreamResult { IsAvailable = true, Stream = fileStream }; return(await processAsync(result)); } } }, _logger, token); return(output); }
public async Task <IReadOnlyList <VsixPackage> > EnumerateAsync(CancellationToken token) { var request = new HttpSourceRequest(_source, _logger); request.IgnoreNotFounds = false; return(await _httpSource.ProcessStreamAsync( request, stream => { var doc = XDocument.Load(stream); var entries = doc.Root.Elements(XName.Get("entry", AtomXmlns)); var packages = new List <VsixPackage>(); foreach (var entry in entries) { var contentElement = entry.Element(XName.Get("content", AtomXmlns)); var contentSrcAttribute = contentElement.Attribute("src"); var contentSrc = contentSrcAttribute.Value; var vsix = entry.Element(XName.Get("Vsix", VsixXmlns)); var idElement = vsix.Element(XName.Get("Id", VsixXmlns)); var id = idElement.Value; var versionElement = vsix.Element(XName.Get("Version", VsixXmlns)); var version = versionElement.Value; var package = new VsixPackage { Id = id, Version = version, Url = contentSrc }; packages.Add(package); } return Task.FromResult(packages); }, _logger, token)); }
public async Task<IReadOnlyList<VsixPackage>> EnumerateAsync(CancellationToken token) { var request = new HttpSourceRequest(_source, _logger); request.IgnoreNotFounds = false; return await _httpSource.ProcessStreamAsync( request, stream => { var doc = XDocument.Load(stream); var entries = doc.Root.Elements(XName.Get("entry", AtomXmlns)); var packages = new List<VsixPackage>(); foreach (var entry in entries) { var contentElement = entry.Element(XName.Get("content", AtomXmlns)); var contentSrcAttribute = contentElement.Attribute("src"); var contentSrc = contentSrcAttribute.Value; var vsix = entry.Element(XName.Get("Vsix", VsixXmlns)); var idElement = vsix.Element(XName.Get("Id", VsixXmlns)); var id = idElement.Value; var versionElement = vsix.Element(XName.Get("Version", VsixXmlns)); var version = versionElement.Value; var package = new VsixPackage { Id = id, Version = version, Url = contentSrc }; packages.Add(package); } return Task.FromResult(packages); }, _logger, token); }