From 9b0ebfdf5b84cd88ebb6bfe572e5330c641f1f49 Mon Sep 17 00:00:00 2001 From: philenius <philenius@users.noreply.github.com> Date: Sat, 2 Jan 2021 00:25:10 +0100 Subject: [PATCH] fix HTTP header for user-defined object metadata According to the S3 documentation, when adding user-defined object metadata, the metadata key must start with "x-amz-meta-" (all lowercase). --- lib/src/minio_helpers.dart | 2 +- test/minio_dart_test.dart | 49 +++++++++++++++++++++++++++++++------- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/lib/src/minio_helpers.dart b/lib/src/minio_helpers.dart index 4cd2fdc..57bd145 100644 --- a/lib/src/minio_helpers.dart +++ b/lib/src/minio_helpers.dart @@ -130,7 +130,7 @@ Map<String, String> prependXAMZMeta(Map<String, String> metadata) { if (!isAmzHeader(key) && !isSupportedHeader(key) && !isStorageclassHeader(key)) { - newMetadata['X-Amz-Meta-' + key] = newMetadata[key]; + newMetadata['x-amz-meta-' + key] = newMetadata[key]; newMetadata.remove(key); } } diff --git a/test/minio_dart_test.dart b/test/minio_dart_test.dart index 2a11653..b980301 100644 --- a/test/minio_dart_test.dart +++ b/test/minio_dart_test.dart @@ -63,7 +63,8 @@ void main() { test('bucketExists() returns false for a non-existent bucket', () async { final minio = _getClient(); - expect(await minio.bucketExists('non-existing-bucket-name'), equals(false)); + expect( + await minio.bucketExists('non-existing-bucket-name'), equals(false)); }); test('bucketExists() fails due to wrong access key', () async { @@ -98,29 +99,61 @@ void main() { group('fPutObject', () { final bucketName = DateTime.now().millisecondsSinceEpoch.toString(); Directory tempDir; + File testFile; + final objectName = 'a.jpg'; setUpAll(() async { tempDir = await Directory.systemTemp.createTemp(); + testFile = await File('${tempDir.path}/$objectName').create(); + await testFile.writeAsString('random bytes'); final minio = _getClient(); await minio.makeBucket(bucketName); }); - tearDown(() async { + tearDownAll(() async { await tempDir.delete(recursive: true); }); test('fPutObject() inserts content-type to metadata', () async { - final objectName = 'a.jpg'; + final minio = _getClient(); + await minio.fPutObject(bucketName, objectName, testFile.path); - final testFile = await File('${tempDir.path}/$objectName').create(); - await testFile.writeAsString('random bytes'); + final stat = await minio.statObject(bucketName, objectName); + expect(stat.metaData['content-type'], equals('image/jpeg')); + }); + + test('fPutObject() adds user-defined object metadata w/ prefix', () async { + final prefix = 'x-amz-meta-'; + final userDefinedMetadataKey = '${prefix}user-defined-metadata-key-1'; + final userDefinedMetadataValue = 'custom value 1'; + final metadata = { + userDefinedMetadataKey: userDefinedMetadataValue, + }; final minio = _getClient(); - await minio.fPutObject(bucketName, 'a.jpg', testFile.path); - + await minio.fPutObject(bucketName, objectName, testFile.path, metadata); + final stat = await minio.statObject(bucketName, objectName); - expect(stat.metaData['content-type'], equals('image/jpeg')); + expect( + stat.metaData[userDefinedMetadataKey.substring(prefix.length)], + equals(userDefinedMetadataValue), + ); + }); + + test('fPutObject() adds user-defined object metadata w/o prefix', () async { + final userDefinedMetadataKey = 'user-defined-metadata-key-2'; + final userDefinedMetadataValue = 'custom value 2'; + final metadata = { + userDefinedMetadataKey: userDefinedMetadataValue, + }; + + final minio = _getClient(); + await minio.fPutObject(bucketName, objectName, testFile.path, metadata); + + final stat = await minio.statObject(bucketName, objectName); + expect(stat.metaData[userDefinedMetadataKey], + equals(userDefinedMetadataValue)); }); }); } -- GitLab