private void QueryS3Objects(S3ObjectSearchRequest searchRequest, S3ObjectSearchResponse searchResponse) { using (var session = documentStore.OpenSession()) { var query = string.IsNullOrWhiteSpace(searchRequest.Prefix) ? string.Format("Bucket:{0}", searchRequest.BucketName) : string.Format("Bucket:{0} AND Key:{1}*", searchRequest.BucketName, searchRequest.Prefix); searchResponse.S3Objects = session.Advanced .LuceneQuery<S3Object, S3Object_Search>() .Where(query) .Take(searchRequest.MaxKeys ?? 1000) .WaitForNonStaleResultsAsOfNow() .ToList(); } if (!string.IsNullOrWhiteSpace(searchRequest.Delimiter)) { ApplyDelimiterFilter(searchRequest, searchResponse); } }
public S3ObjectSearchResponse GetObjects(S3ObjectSearchRequest searchRequest) { var searchResponse = new S3ObjectSearchResponse { BucketName = searchRequest.BucketName, Delimiter = searchRequest.Delimiter, Marker = searchRequest.Marker, MaxKeys = searchRequest.MaxKeys, Prefix = searchRequest.Prefix, IsTruncated = false, S3Objects = new List<S3Object>(), Prefixes = new List<string>() }; var bucket = GetBucket(searchRequest.BucketName); if (bucket == null) { return searchResponse; } QueryS3Objects(searchRequest, searchResponse); return searchResponse; }
private void ApplyDelimiterFilter(S3ObjectSearchRequest searchRequest, S3ObjectSearchResponse searchResponse) { IList<string> prefixStrings = new List<string>(); IList<S3Object> objectsToRemove = new List<S3Object>(); foreach (var s3Object in searchResponse.S3Objects) { var match = Regex.Match(s3Object.Key, string.Format("({0}.*?{1}).*?", searchRequest.Prefix, searchRequest.Delimiter)); if (!match.Success) continue; var @group = match.Groups[0].Value; if (!prefixStrings.Contains(@group)) { prefixStrings.Add(@group); } objectsToRemove.Add(s3Object); } foreach (var s3Object in objectsToRemove) { searchResponse.S3Objects.Remove(s3Object); } searchResponse.Prefixes = prefixStrings; }
private Response ListObjects(string bucket) { var bucketObject = storage.GetBucket(bucket); if (bucketObject == null) { var responseNotFound = responder.Respond(new BucketNotFound { BucketName = bucket }); responseNotFound.StatusCode = HttpStatusCode.NotFound; return responseNotFound; } var searchRequest = new S3ObjectSearchRequest { BucketName = bucket, Prefix = Request.Query.prefix.HasValue ? Request.Query.prefix : string.Empty, Delimiter = Request.Query.delimiter.HasValue ? Request.Query.delimiter : string.Empty, Marker = Request.Query.marker.HasValue ? Request.Query.marker : string.Empty, MaxKeys = Request.Query.maxkeys.HasValue ? Request.Query.maxkeys : 1000, }; var searchResponse = storage.GetObjects(searchRequest); var response = responder.Respond(searchResponse); return response; }