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