Skip to content

Commit

Permalink
Merge pull request #103 from BickelLukas/S3-fix
Browse files Browse the repository at this point in the history
fix GetEntryByName for S3 File system
  • Loading branch information
fubar-coder committed Oct 8, 2021
2 parents ab1f16a + c6477fa commit 8b4b8d7
Showing 1 changed file with 41 additions and 12 deletions.
53 changes: 41 additions & 12 deletions src/FubarDev.FtpServer.FileSystem.S3/S3FileSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

Expand Down Expand Up @@ -66,7 +65,7 @@ public Task<IReadOnlyList<IUnixFileSystemEntry>> GetEntriesAsync(
prefix += '/';
}

return ListObjectsAsync(prefix, cancellationToken);
return ListObjectsAsync(prefix, false, cancellationToken);
}

/// <inheritdoc />
Expand All @@ -75,19 +74,18 @@ public Task<IReadOnlyList<IUnixFileSystemEntry>> GetEntriesAsync(
string name,
CancellationToken cancellationToken)
{
var prefix = S3Path.Combine(((S3DirectoryEntry)directoryEntry).Key, name);
var key = S3Path.Combine(((S3DirectoryEntry)directoryEntry).Key, name);

var objects = await ListObjectsAsync(prefix, cancellationToken);

if (objects.Count == 1 && objects.Single() is IUnixFileEntry entry)
{
var entry = await GetObjectAsync(key, cancellationToken);
if (entry != null)
return entry;
}

// not a file search for directory
key += '/';

var objects = await ListObjectsAsync(key, true, cancellationToken);
if (objects.Count > 0)
{
return new S3DirectoryEntry(prefix);
}
return new S3DirectoryEntry(key);

return null;
}
Expand Down Expand Up @@ -218,8 +216,35 @@ public Task<IUnixFileSystemEntry> SetMacTimeAsync(
return Task.FromResult(entry);
}

private async Task<IUnixFileSystemEntry?> GetObjectAsync(string key, CancellationToken cancellationToken)
{
try
{
var s3Object = await _client.GetObjectMetadataAsync(
new GetObjectMetadataRequest
{
BucketName = _options.BucketName,
Key = key,
}, cancellationToken);

if (key.EndsWith("/"))
return new S3DirectoryEntry(key);

return new S3FileEntry(key, s3Object.Headers.ContentLength)
{
LastWriteTime = s3Object.LastModified,
};
}
catch (AmazonS3Exception)
{
}

return null;
}

private async Task<IReadOnlyList<IUnixFileSystemEntry>> ListObjectsAsync(
string prefix,
bool includeSelf,
CancellationToken cancellationToken)
{
var objects = new List<IUnixFileSystemEntry>();
Expand Down Expand Up @@ -247,7 +272,11 @@ private async Task<IReadOnlyList<IUnixFileSystemEntry>> ListObjectsAsync(
{
if (s3Object.Key.EndsWith("/") && s3Object.Key == prefix)
{
continue; // this is the folder itself
// this is the folder itself
if (includeSelf)
objects.Add(new S3DirectoryEntry(s3Object.Key));

continue;
}

objects.Add(
Expand Down

0 comments on commit 8b4b8d7

Please sign in to comment.