Skip to content
Snippets Groups Projects
Commit 73848784 authored by xuty's avatar xuty
Browse files

Fix response body encoding #14

parent 06026ea8
Branches
No related merge requests found
import 'dart:convert';
import 'dart:typed_data';
import 'package:http/http.dart';
import 'package:minio/minio.dart';
......@@ -43,6 +44,42 @@ class MinioRequest extends BaseRequest {
}
}
/// An HTTP response where the entire response body is known in advance.
class MinioResponse extends BaseResponse {
/// The bytes comprising the body of this response.
final Uint8List bodyBytes;
/// Body of s3 response is always encoded as UTF-8.
String get body => utf8.decode(bodyBytes);
/// Create a new HTTP response with a byte array body.
MinioResponse.bytes(
this.bodyBytes,
int statusCode, {
BaseRequest? request,
Map<String, String> headers = const {},
bool isRedirect = false,
bool persistentConnection = true,
String? reasonPhrase,
}) : super(statusCode,
contentLength: bodyBytes.length,
request: request,
headers: headers,
isRedirect: isRedirect,
persistentConnection: persistentConnection,
reasonPhrase: reasonPhrase);
static Future<MinioResponse> fromStream(StreamedResponse response) async {
final body = await response.stream.toBytes();
return MinioResponse.bytes(body, response.statusCode,
request: response.request,
headers: response.headers,
isRedirect: response.isRedirect,
persistentConnection: response.persistentConnection,
reasonPhrase: response.reasonPhrase);
}
}
class MinioClient {
MinioClient(this.minio) {
anonymous = minio.accessKey.isEmpty && minio.secretKey.isEmpty;
......@@ -93,7 +130,7 @@ class MinioClient {
return response;
}
Future<Response> request({
Future<MinioResponse> request({
required String method,
String? bucket,
String? object,
......@@ -114,7 +151,7 @@ class MinioClient {
headers: headers,
);
final response = await Response.fromStream(stream);
final response = await MinioResponse.fromStream(stream);
logResponse(response);
return response;
......
import 'package:http/http.dart';
import 'package:minio/models.dart';
import 'package:minio/src/minio_client.dart';
import 'package:minio/src/minio_helpers.dart';
class MinioError {
......@@ -88,5 +88,6 @@ class MinioS3Error extends MinioError {
MinioS3Error(String? message, [this.error, this.response]) : super(message);
Error? error;
Response? response;
MinioResponse? response;
}
import 'package:convert/convert.dart';
import 'package:http/http.dart';
import 'package:mime/mime.dart' show lookupMimeType;
import 'package:minio/src/minio_client.dart';
import 'package:minio/src/minio_errors.dart';
import 'package:minio/src/minio_models_generated.dart';
import 'package:xml/xml.dart' as xml;
......@@ -199,20 +200,20 @@ Future<void> validateStreamed(
int? expect,
}) async {
if (streamedResponse.statusCode >= 400) {
final response = await Response.fromStream(streamedResponse);
final response = await MinioResponse.fromStream(streamedResponse);
final body = xml.XmlDocument.parse(response.body);
final error = Error.fromXml(body.rootElement);
throw MinioS3Error(error.message, error, response);
}
if (expect != null && streamedResponse.statusCode != expect) {
final response = await Response.fromStream(streamedResponse);
final response = await MinioResponse.fromStream(streamedResponse);
throw MinioS3Error(
'$expect expected, got ${streamedResponse.statusCode}', null, response);
}
}
void validate(Response response, {int? expect}) {
void validate(MinioResponse response, {int? expect}) {
if (response.statusCode >= 400) {
var error;
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment