delete method
Implementation
Future<PlexApiResponse> delete(
String url, {
Map<String, dynamic>? query,
Map<String, String>? headers,
dynamic body,
Duration? timeout,
PlexCancelToken? cancelToken,
}) async {
if (await isNetworkAvailable() == false) return PlexNetworkNoConnectivity();
if (query?.isNotEmpty == true) {
url += "?";
query?.forEach((key, value) {
url += "$key=$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 retry = _retryInterceptor;
final maxAttempts = retry?.maxAttempts ?? 1;
PlexApiResponse lastResponse = PlexNetworkNoConnectivity();
final requestTimeout = timeout ?? defaultTimeout;
for (var attempt = 0; attempt < maxAttempts; attempt++) {
if (cancelToken?.isCancelled == true) {
lastResponse = PlexNetworkCancelled();
break;
}
try {
var startTime = DateTime.now();
var uri = Uri.parse(_isValidUrl(url) ? url : _apiUrl() + url);
PlexLogger.d('Networking', 'DELETE Started: ${uri.toString()}');
late http.Response data;
if (body != null) {
data = await http.delete(uri, headers: currentHeaders, body: jsonEncode(body)).timeout(requestTimeout);
} else {
data = await http.delete(uri, headers: currentHeaders).timeout(requestTimeout);
}
if (cancelToken?.isCancelled == true) {
lastResponse = PlexNetworkCancelled();
break;
}
var diffInMillis = DateTime.now().difference(startTime).inMilliseconds;
PlexLogger.d('Networking', 'DELETE Completed: ${data.statusCode}: ${uri.toString()} in ${diffInMillis}ms');
if (data.statusCode >= 200 && data.statusCode < 300) {
lastResponse = PlexSuccess(data.body);
} else {
lastResponse = PlexNetworkServerError(
data.statusCode,
data.body.isEmpty ? (data.reasonPhrase ?? data.body) : data.body,
);
}
final statusCode = lastResponse is PlexNetworkServerError ? lastResponse.statusCode : 0;
final shouldRetry = lastResponse is PlexNetworkServerError &&
retry != null &&
retry.retryOnStatusCodes.contains(statusCode) &&
attempt < maxAttempts - 1;
if (!shouldRetry) break;
} catch (e, stack) {
if (e is TimeoutException) {
lastResponse = PlexNetworkTimeout();
} else if (e is SocketException) {
lastResponse = PlexNetworkNoConnectivity();
} else {
PlexLogger.e('Networking', 'DELETE failed', error: e);
lastResponse = await _runErrorInterceptors(e, stack);
}
break;
}
}
return _runResponseInterceptors(lastResponse);
}