download method

Future<NetworkResponse> download()

Implementation

Future<NetworkResponse> download() async {
  if (callDefaults) {
    options.onStartDefault(this);
  }
  NetworkResponse response;
  try {
    log("Downloading ${jsonEncode(data)} from ${jsonEncode(api)}");
    Response res = await dio.download(api, savePath, onReceiveProgress: onReceiveProgress, data: data, cancelToken: options.globalCancelToken).catchError((e) {
      throw e;
    }).timeout(timeOut, onTimeout: () {
      throw DioExceptionType.connectionTimeout;
    });
    response = NetworkResponse(
        responseStatus: res.statusCode! > 199 && res.statusCode! < 300,
        responseCode: res.statusCode!,
        responseTitle: res.statusMessage,
        responseBody: res.data,
        responseDetails: res,
        extractedMessage: options.successMsgExtractor!(res.data));
  } catch (e) {
    if (e is DioException && e.response != null && e.response!.data is Map) {
      response = NetworkResponse(
          responseStatus: e.response!.statusCode! > 199 && e.response!.statusCode! < 300,
          responseCode: e.response!.statusCode!,
          responseTitle: e.response!.statusMessage,
          responseBody: e.response!.data,
          responseDetails: e,
          extractedMessage: options.errorMsgExtractor(e.response!.data));
    } else if (e is DioException && e.type == DioExceptionType.badResponse) {
      response = NetworkResponse(responseStatus: false, responseCode: e.response!.statusCode!, responseTitle: e.response!.statusMessage, responseBody: e.response!.data, responseDetails: e, extractedMessage: "${e.message}");
    } else if (e is DioException) {
      if (e.type == DioExceptionType.unknown) {
        response = NetworkResponse(
            responseStatus: false,
            responseCode: -500,
            responseTitle: "Error",
            responseBody: "Connection interrupted ,Can not Connect to Server!",
            responseDetails: e,
            extractedMessage: "Connection interrupted ,Can not Connect to Server!");
      } else if (e.type == DioExceptionType.connectionTimeout || e.type == DioExceptionType.receiveTimeout || e.type == DioExceptionType.sendTimeout) {
        response = NetworkResponse(
            responseStatus: false, responseCode: -500, responseTitle: "Error", responseBody: "Connection Timeout ,Can not Reach to Server!", responseDetails: e, extractedMessage: "Connection Timeout ,Can not Reach to Server!");
      } else if (e.type == DioExceptionType.cancel) {
        response = NetworkResponse(responseStatus: false, responseCode: -500, responseTitle: "Error", responseBody: "Request Canceled!", responseDetails: e, extractedMessage: "Request Canceled!");
      } else {
        response =
            NetworkResponse(responseStatus: false, responseCode: -500, responseTitle: "Error", responseBody: "Connection interrupted ,Can not Connect to Server!", responseDetails: e, extractedMessage: "Something went wrong");
      }
    } else {
      response = NetworkResponse(responseStatus: false, responseCode: -500, responseTitle: "Failed", responseBody: "Connection interrupted ,Can not Connect to Server!", responseDetails: e, extractedMessage: e.toString());
    }
  }

  response.isCancelable = isCancelable;
  response.callDefaults = callDefaults;
  response.handleSuccess = handleSuccess;
  response.handleErrors = handleErrors;

  response.retryFunction = retry ?? (_,__) => delete.call();
  log(response.toString());

  if (options.tokenExpireRule(response, this)) {
    options.onTokenExpire(response, this);
    response.extractedMessage = "Token Expired!";
    response.responseCode = -999;
    response.responseStatus = false;
  }

  if (!options.extraSuccessRule(response, this)) {
    response.responseStatus = false;
    response.responseCode = -100;
    response.responseTitle = "Success Rules Failed";
  }

  if (callDefaults) {
    if (response.responseStatus) {
      options.onSuccessDefault(response, this);
    } else {
      options.onFailedDefault(response, this);
    }
    options.onEndDefault(response, this);
  } else {
    if (response.responseStatus) {
      if (handleSuccess) {
        options.onSuccessDefault(response, this);
      }
    } else {
      if (handleErrors) {
        options.onFailedDefault(response, this);
      }
    }
  }

  return response;
}