Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 43 additions & 3 deletions lib/src/minio.dart
Original file line number Diff line number Diff line change
Expand Up @@ -778,12 +778,18 @@ class Minio {
/// - [expires]: expiry in seconds (optional, default 7 days)
/// - [respHeaders]: response headers to override (optional)
/// - [requestDate]: A date object, the url will be issued at (optional)
/// - [overrideHost]: override the host in the presigned URL (optional)
/// - [overridePort]: override the port in the presigned URL (optional)
/// - [overrideScheme]: override the scheme (http/https) in the presigned URL (optional)
Future<String> presignedGetObject(
String bucket,
String object, {
int? expires,
Map<String, String>? respHeaders,
DateTime? requestDate,
String? overrideHost,
int? overridePort,
String? overrideScheme,
}) {
MinioInvalidBucketNameError.check(bucket);
MinioInvalidObjectNameError.check(object);
Expand All @@ -795,6 +801,9 @@ class Minio {
expires: expires,
reqParams: respHeaders,
requestDate: requestDate,
overrideHost: overrideHost,
overridePort: overridePort,
overrideScheme: overrideScheme,
);
}

Expand Down Expand Up @@ -869,14 +878,28 @@ class Minio {
/// - [bucketName]: name of the bucket
/// - [objectName]: name of the object
/// - [expires]: expiry in seconds (optional, default 7 days)
/// - [overrideHost]: override the host in the presigned URL (optional)
/// - [overridePort]: override the port in the presigned URL (optional)
/// - [overrideScheme]: override the scheme (http/https) in the presigned URL (optional)
Future<String> presignedPutObject(
String bucket,
String object, {
int? expires,
String? overrideHost,
int? overridePort,
String? overrideScheme,
}) {
MinioInvalidBucketNameError.check(bucket);
MinioInvalidObjectNameError.check(object);
return presignedUrl('PUT', bucket, object, expires: expires);
return presignedUrl(
'PUT',
bucket,
object,
expires: expires,
overrideHost: overrideHost,
overridePort: overridePort,
overrideScheme: overrideScheme,
);
}

/// Generate a generic presigned URL which can be
Expand All @@ -888,6 +911,9 @@ class Minio {
/// - [expires]: expiry in seconds (optional, default 7 days)
/// - [reqParams]: request parameters (optional)
/// - [requestDate]: A date object, the url will be issued at (optional)
/// - [overrideHost]: override the host in the presigned URL (optional)
/// - [overridePort]: override the port in the presigned URL (optional)
/// - [overrideScheme]: override the scheme (http/https) in the presigned URL (optional)
Future<String> presignedUrl(
String method,
String bucket,
Expand All @@ -896,6 +922,9 @@ class Minio {
String? resource,
Map<String, String>? reqParams,
DateTime? requestDate,
String? overrideHost,
int? overridePort,
String? overrideScheme,
}) async {
MinioInvalidBucketNameError.check(bucket);
MinioInvalidObjectNameError.check(object);
Expand All @@ -909,7 +938,7 @@ class Minio {
requestDate ??= DateTime.now().toUtc();

final region = await getBucketRegion(bucket);
final request = _client.getBaseRequest(
var request = _client.getBaseRequest(
method,
bucket,
object,
Expand All @@ -919,6 +948,17 @@ class Minio {
{},
null,
);

if (overrideHost != null || overridePort != null || overrideScheme != null) {
final newUrl = request.url.replace(
scheme: overrideScheme ?? request.url.scheme,
host: overrideHost ?? request.url.host,
port: overridePort ?? request.url.port,
);
request = request.replace(url: newUrl);
request.headers['host'] = newUrl.authority;
}

return presignSignatureV4(this, request, region, requestDate, expires);
}

Expand Down Expand Up @@ -1133,7 +1173,7 @@ class Minio {

return StatObjectResult(
etag: etag,
size: int.parse(resp.headers['content-length']!),
size: int.tryParse(resp.headers['content-length'] ?? ''),
metaData: extractMetadata(resp.headers),
lastModified: parseRfc7231Time(resp.headers['last-modified']!),
acl: retrieveAcls ? await getObjectACL(bucket, object) : null,
Expand Down
70 changes: 70 additions & 0 deletions test/minio_presigned_url_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,51 @@ void main() {
);
});

test('Minio.presignedGetObject() uses overrideHost in URL', () async {
final minio = getMinioClient();
final url = await minio.presignedGetObject(
'bucket',
'object',
overrideHost: 'public.example.com',
);
expect(Uri.parse(url).host, equals('public.example.com'));
});

test('Minio.presignedGetObject() uses overrideScheme in URL', () async {
final minio = getMinioClient(useSSL: false, port: 80);
final url = await minio.presignedGetObject(
'bucket',
'object',
overrideScheme: 'https',
);
expect(Uri.parse(url).scheme, equals('https'));
});

test('Minio.presignedGetObject() uses overridePort in URL', () async {
final minio = getMinioClient();
final url = await minio.presignedGetObject(
'bucket',
'object',
overridePort: 9000,
);
expect(Uri.parse(url).port, equals(9000));
});

test('Minio.presignedGetObject() applies all overrides together', () async {
final minio = getMinioClient();
final url = await minio.presignedGetObject(
'bucket',
'object',
overrideHost: 'public.example.com',
overridePort: 9000,
overrideScheme: 'http',
);
final uri = Uri.parse(url);
expect(uri.host, equals('public.example.com'));
expect(uri.port, equals(9000));
expect(uri.scheme, equals('http'));
});

test('Minio.presignedPutObject() works', () async {
final minio = getMinioClient();
await minio.presignedPutObject('bucket', 'object');
Expand All @@ -29,4 +74,29 @@ void main() {
throwsA(isA<MinioError>()),
);
});

test('Minio.presignedPutObject() uses overrideHost in URL', () async {
final minio = getMinioClient();
final url = await minio.presignedPutObject(
'bucket',
'object',
overrideHost: 'public.example.com',
);
expect(Uri.parse(url).host, equals('public.example.com'));
});

test('Minio.presignedPutObject() applies all overrides together', () async {
final minio = getMinioClient();
final url = await minio.presignedPutObject(
'bucket',
'object',
overrideHost: 'public.example.com',
overridePort: 9000,
overrideScheme: 'http',
);
final uri = Uri.parse(url);
expect(uri.host, equals('public.example.com'));
expect(uri.port, equals(9000));
expect(uri.scheme, equals('http'));
});
}
Loading