postMultipart2 method

Future<PlexApiResponse> postMultipart2(
  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> postMultipart2(
    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;
  }

  /// Construct query parameters if present
  if (query?.isNotEmpty == true) {
    url += "?${query!.entries.map((e) => "${Uri.encodeComponent(e.key)}=${Uri.encodeComponent(e.value.toString())}").join("&")}";
  }

  /// Prepare headers
  var currentHeaders = <String, String>{};

  if (addHeaders != null) {
    var constHeaders = await addHeaders!.call();
    currentHeaders.addAll(constHeaders);
  }

  if (headers != null) {
    currentHeaders.addAll(headers);
  }

  // ✅ Do not manually set Content-Type for multipart requests
  if (kDebugMode) print("Headers: $currentHeaders");

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

    /// Prepare Multipart Request
    var request = http.MultipartRequest('POST', uri);
    request.headers.addAll(currentHeaders);
    request.fields.addAll(formData);

    /// Attach Files
    for (var entry in files.entries) {
      var multipartFile = await http.MultipartFile.fromPath(entry.key, entry.value.path);
      request.files.add(multipartFile);
    }

    var streamedResponse = await request.send();


    var responseBody = await streamedResponse.stream.transform(utf8.decoder).join();

    if (kDebugMode) print("Completed: ${streamedResponse.statusCode}: ${responseBody.toString()}");

    /// Handle JSON & Text Responses Correctly
    if (streamedResponse.statusCode == 200) {
      try {
        return PlexSuccess(responseBody); ///  Return JSON if valid
      } catch (e) {
        return PlexSuccess(responseBody); ///  Otherwise, return as plain text
      }
    } else {
      return PlexError(
        streamedResponse.statusCode,
        responseBody.isEmpty ? streamedResponse.reasonPhrase ?? "Unknown error" : responseBody,
      );
    }
  } catch (e) {
    if (e is SocketException) {
      return _connectionFailed;
    }
    if (kDebugMode) print("Error: ${e.toString()}");
    return PlexError(400, e.toString());
  }
}