postMultipart method

Future<PlexApiResponse> postMultipart(
  1. String url, {
  2. Map<String, dynamic>? query,
  3. Map<String, String>? headers,
  4. required Map<String, String> formData,
  5. required Map<String, File> files,
})

Implementation

Future<PlexApiResponse> postMultipart(
  String url, {
  Map<String, dynamic>? query,
  Map<String, String>? headers,
  required Map<String, String> formData,
  required Map<String, File> files,
}) async {
  if (await isNetworkAvailable() == false) {
    return _noNetwork;
  }

  if (query?.isNotEmpty == true) {
    url += "?";
    query?.forEach((key, value) {
      url += "$key=$value&";
    });
    url = url.substring(0, url.length - 1);
  }

  headers ??= <String, String>{};
  if (formData == null) {
    headers["Content-Type"] = "application/json";
  }
  if (addHeaders != null) {
    var constHeaders = await addHeaders!.call();
    headers.addAll(constHeaders);
  }

  try {
    var uri = Uri.parse(_isValidUrl(url) ? url : _apiUrl() + url);
    if (kDebugMode) print("Started: ${uri.toString()}");

    var multipartFiles = List<http.MultipartFile>.empty(growable: true);
    var filesKeys = files.keys.toList();
    for (var i = 0; i < filesKeys.length; i++) {
      var multipart = await http.MultipartFile.fromPath(filesKeys[i], files[filesKeys[i]]!.path);
      multipartFiles.add(multipart);
    }

    var request = http.MultipartRequest('POST', uri);
    request.fields.addAll(formData);
    request.files.addAll(multipartFiles);

    var data = await request.send();

    if (kDebugMode) print("Completed: ${data.statusCode}: ${uri.toString()}");
    if (data.statusCode == 200) {
      var responseBody = await data.stream.transform(utf8.decoder).join();
      return PlexSuccess(responseBody);
    } else {
      var responseBody = await data.stream.transform(utf8.decoder).join();
      if (responseBody.isEmpty) {
        return PlexError(data.statusCode, data.reasonPhrase ?? responseBody);
      }
      return PlexError(data.statusCode, responseBody);
    }
  } catch (e) {
    if(e is SocketException) {
      return _connectionFailed;
    }
    if (kDebugMode) print("Error: ${e.toString()}");
    return PlexError(400, e.toString());
  }
}