parseBody method

Future<void> parseBody({
  1. Encoding encoding = utf8,
})

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 = [];
    }
  }
}