postMultipart method
Implementation
Future<PlexApiResponse> postMultipart(
String url, {
Map<String, dynamic>? query,
Map<String, String>? headers,
required Map<String, String> formData,
required Map<String, File> files,
Duration? timeout,
PlexCancelToken? cancelToken,
}) async {
if (await isNetworkAvailable() == false) return PlexNetworkNoConnectivity();
if (query?.isNotEmpty == true) {
url += "?";
query?.forEach((key, value) {
url += "${Uri.encodeComponent(key)}=${Uri.encodeComponent(value)}&";
});
url = url.substring(0, url.length - 1);
}
var currentHeaders = <String, String>{};
if (addHeaders != null) currentHeaders.addAll(await addHeaders!());
if (headers != null) currentHeaders.addAll(headers);
if (!currentHeaders.containsKey("Content-Type")) {
currentHeaders["Content-Type"] = "application/json";
}
currentHeaders = await _runRequestInterceptors(url, currentHeaders);
final requestTimeout = timeout ?? defaultTimeout;
if (cancelToken?.isCancelled == true) return _runResponseInterceptors(PlexNetworkCancelled());
try {
var startTime = DateTime.now();
var uri = Uri.parse(_isValidUrl(url) ? url : _apiUrl() + url);
PlexLogger.d('Networking', '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.headers.addAll(currentHeaders);
request.fields.addAll(formData);
request.files.addAll(multipartFiles);
var data = await request.send().timeout(requestTimeout);
if (cancelToken?.isCancelled == true) return _runResponseInterceptors(PlexNetworkCancelled());
var diffInMillis = DateTime.now().difference(startTime).inMilliseconds;
PlexLogger.d('Networking', 'Completed: ${data.statusCode}: ${uri.toString()} in ${diffInMillis}ms');
PlexApiResponse lastResponse;
if (data.statusCode == 200) {
var responseBody = await data.stream.transform(utf8.decoder).join();
lastResponse = PlexSuccess(responseBody);
} else {
var responseBody = await data.stream.transform(utf8.decoder).join();
lastResponse = PlexNetworkServerError(
data.statusCode,
responseBody.isEmpty ? (data.reasonPhrase ?? responseBody) : responseBody,
);
}
return _runResponseInterceptors(lastResponse);
} catch (e, stack) {
if (e is TimeoutException) {
return _runResponseInterceptors(PlexNetworkTimeout());
}
if (e is SocketException) {
return _runResponseInterceptors(PlexNetworkNoConnectivity());
}
PlexLogger.e('Networking', 'Request failed', error: e);
return _runResponseInterceptors(await _runErrorInterceptors(e, stack));
}
}