diff --git a/lib/src/minio_helpers.dart b/lib/src/minio_helpers.dart index 2f5f4fdb483d94316c2f71bc9faa4761e30df4be..ba1bf3a2a26c5928105fa76feb18b12cd9e55806 100644 --- a/lib/src/minio_helpers.dart +++ b/lib/src/minio_helpers.dart @@ -272,31 +272,7 @@ String encodePath(Uri uri) { return result.toString(); } -final _queryIgnoredChars = { - '-'.codeUnitAt(0), - '_'.codeUnitAt(0), - '.'.codeUnitAt(0), - '~'.codeUnitAt(0), -}; - /// encode [uri].path to HTML hex escape sequence String encodeCanonicalQuery(String query) { - final result = StringBuffer(); - for (var char in query.codeUnits) { - if (_A <= char && char <= _Z || - _a <= char && char <= _z || - _0 <= char && char <= _9) { - result.writeCharCode(char); - continue; - } - - if (_queryIgnoredChars.contains(char)) { - result.writeCharCode(char); - continue; - } - - result.write('%'); - result.write(hex.encode([char]).toUpperCase()); - } - return result.toString(); + return Uri.encodeQueryComponent(query).replaceAll('+', '%20'); } diff --git a/test/minio_test.dart b/test/minio_test.dart index 2104e21378d6b4829ef9a47de9dcbaea7da1fe5e..5913f263ff8a692d8c4e7caadb4996255912a977 100644 --- a/test/minio_test.dart +++ b/test/minio_test.dart @@ -323,21 +323,32 @@ void testGetObject() { group('getObject()', () { final minio = getMinioClient(); final bucketName = uniqueName(); - final objectName = uniqueName(); + final object = uniqueName(); + final objectUtf8 = uniqueName() + '/銇傘倠銇ㄣ亾銈�/鏌愪釜鏂囦欢.馃'; final objectData = Uint8List.fromList([1, 2, 3]); setUpAll(() async { await minio.makeBucket(bucketName); - await minio.putObject(bucketName, objectName, Stream.value(objectData)); + await minio.putObject(bucketName, object, Stream.value(objectData)); + await minio.putObject(bucketName, objectUtf8, Stream.value(objectData)); }); tearDownAll(() async { - await minio.removeObject(bucketName, objectName); + await minio.removeObject(bucketName, object); + await minio.removeObject(bucketName, objectUtf8); await minio.removeBucket(bucketName); }); test('succeeds', () async { - final stream = await minio.getObject(bucketName, objectName); + final stream = await minio.getObject(bucketName, object); + final buffer = BytesBuilder(); + await stream.forEach((data) => buffer.add(data)); + expect(stream.contentLength, equals(objectData.length)); + expect(buffer.takeBytes(), equals(objectData)); + }); + + test('succeeds with utf8 object name', () async { + final stream = await minio.getObject(bucketName, object); final buffer = BytesBuilder(); await stream.forEach((data) => buffer.add(data)); expect(stream.contentLength, equals(objectData.length)); @@ -346,14 +357,14 @@ void testGetObject() { test('fails on invalid bucket', () { expect( - () async => await minio.getObject('$bucketName-invalid', objectName), + () async => await minio.getObject('$bucketName-invalid', object), throwsA(isA<MinioError>()), ); }); test('fails on invalid object', () { expect( - () async => await minio.getObject(bucketName, '$objectName-invalid'), + () async => await minio.getObject(bucketName, '$object-invalid'), throwsA(isA<MinioError>()), ); }); @@ -701,6 +712,7 @@ void testListObjects() { test('succeeds', () async { final result = await minio.listAllObjects(bucketName); + print(result); expect(result.objects.map((e) => e.key).contains(objectName), isTrue); expect(result.objects.map((e) => e.key).contains(objectNameUtf8), isTrue); }); @@ -731,6 +743,29 @@ void testListObjects() { test('succeeds', () async { final result = await minio.listAllObjects(bucket, prefix: 'new folder/'); + expect(result.objects.map((e) => e.key).contains(object), isTrue); + }); + }); + + group('listAllObjects() works when prefix contains utf-8 characters', () { + final minio = getMinioClient(); + final bucket = uniqueName(); + final prefix = '馃崕馃尠馃崒馃崜/鏂囦欢澶�1/'; + final object = '${prefix}new file.txt'; + final data = Uint8List.fromList([1, 2, 3, 4, 5]); + + setUpAll(() async { + await minio.makeBucket(bucket); + await minio.putObject(bucket, object, Stream.value(data)); + }); + + tearDownAll(() async { + await minio.removeObject(bucket, object); + await minio.removeBucket(bucket); + }); + + test('succeeds', () async { + final result = await minio.listAllObjects(bucket, prefix: prefix); print(result); expect(result.objects.map((e) => e.key).contains(object), isTrue); });