payload method

Future<Map?> payload({
  1. Encoding encoder = utf8,
})

Get the payload (body)

If don't have the contentType of payload will return null

Implementation

Future<Map?> payload({Encoding encoder = utf8}) async {
  var completer = Completer<Map>();

  if (!hasContentType) return null;

  if (isMime('application/x-www-form-urlencoded')) {
    const AsciiDecoder().bind(_request).listen((content) {
      final payload = {
        for (var kv in content.split('&').map((kvs) => kvs.split('=')))
          Uri.decodeQueryComponent(kv[0], encoding: encoder):
              Uri.decodeQueryComponent(kv[1], encoding: encoder)
      };
      completer.complete(payload);
    });
  } else if (isMime('multipart/form-data', loose: true)) {
    var boundary = _request.headers.contentType!.parameters['boundary']!;
    final payload = {};
    MimeMultipartTransformer(boundary)
        .bind(_request)
        .map(HttpMultipartFormData.parse)
        .listen((formData) {
      var parameters = formData.contentDisposition.parameters;
      formData.listen((data) {
        if (formData.contentType != null) {
          data = MultipartUpload(
              parameters?['filename'],
              formData.contentType!.mimeType,
              formData.contentTransferEncoding,
              data);
        }
        payload[parameters?['name']] = data;
      });
    }, onDone: () {
      completer.complete(payload);
    });
  } else if (isMime('application/json')) {
    try {
      final content = await utf8.decodeStream(_request);
      final payload = jsonDecode(content);
      completer.complete(payload);
    } catch (e) {
      rethrow;
    }
  }

  return completer.future;
}