delete method

Future<PlexApiResponse> delete(
  1. String url, {
  2. Map<String, dynamic>? query,
  3. Map<String, String>? headers,
  4. dynamic body,
  5. Duration? timeout,
  6. PlexCancelToken? cancelToken,
})

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);
}