parseBody method
Manually parses the request body, if it has not already been parsed.
Implementation
Future<void> parseBody({Encoding encoding = utf8}) async {
//if (contentType == null) {
// throw FormatException('Missing "content-type" header.');
//}
if (!_hasParsedBody) {
_hasParsedBody = true;
var contentBody = body ?? Stream.empty();
if (contentType.type == 'application' && contentType.subtype == 'json') {
_uploadedFiles = [];
var parsed = (_bodyObject =
await encoding.decoder.bind(contentBody).join().then(json.decode));
if (parsed is Map) {
_bodyFields = Map<String, dynamic>.from(parsed);
} else if (parsed is List) {
_bodyList = parsed;
}
} else if (contentType.type == 'application' &&
contentType.subtype == 'x-www-form-urlencoded') {
_uploadedFiles = [];
var parsed = await encoding.decoder
.bind(contentBody)
.join()
.then((s) => Uri.splitQueryString(s, encoding: encoding));
_bodyFields = Map<String, dynamic>.from(parsed);
} else if (contentType.type == 'multipart' &&
contentType.subtype == 'form-data' &&
contentType.parameters.containsKey('boundary')) {
var boundary = contentType.parameters['boundary'] ?? '';
var transformer = MimeMultipartTransformer(boundary);
var parts = transformer.bind(contentBody).map((part) =>
HttpMultipartFormData.parse(part, defaultEncoding: encoding));
_bodyFields = {};
_uploadedFiles = [];
await for (var part in parts) {
if (part.isBinary) {
_uploadedFiles.add(UploadedFile(part));
} else if (part.isText &&
part.contentDisposition.parameters.containsKey('name')) {
// If there is no name, then don't parse it.
var key = part.contentDisposition.parameters['name'];
if (key != null) {
var value = await part.join();
_bodyFields[key] = value;
}
}
}
} else {
_bodyFields = {};
_uploadedFiles = [];
}
}
}