public async Task TryGetUrlFileIconClassAsync(DocumentKey doc, CancellationToken cancellationToken) { var ini = await TryReadUrlFileAsync(doc, cancellationToken); var iconFile = ini?.GetValue("InternetShortcut", "IconFile"); return String.IsNullOrEmpty(iconFile) ? null : iconFile; } private async Task TryGetUrlFileTargetAsync(DocumentKey doc, CancellationToken cancellationToken) { var ini = await TryReadUrlFileAsync(doc, cancellationToken); var target = ini?.GetValue("InternetShortcut", "URL"); if (String.IsNullOrWhiteSpace(target)) return null; if (!Uri.TryCreate(target, UriKind.Absolute, out var uri)) return null; if (!(uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps)) return null; return uri.ToString(); } private async Task TryReadUrlFileAsync(DocumentKey doc, CancellationToken cancellationToken) { try { using var response = await s3.GetObjectAsync(new GetObjectRequest { BucketName = _settings.S3.Bucket, Key = doc.ToString(), }, cancellationToken); using var reader = new StreamReader(response.ResponseStream); return await iniParser.ParseAsync(reader, cancellationToken); } catch (AmazonS3Exception exception) when (exception.StatusCode == HttpStatusCode.NotFound) { return null; } }