getSaveResponse<ContainerDataTypeGeneric> method

Future<CloudflareHTTPResponse> getSaveResponse<ContainerDataTypeGeneric>(
  1. Future futureResponse, {
  2. bool parseCloudflareResponse = true,
})
inherited

Implementation

Future<CloudflareHTTPResponse> getSaveResponse<ContainerDataTypeGeneric>(
    Future futureResponse,
    {bool parseCloudflareResponse = true}) async {
  CloudflareHTTPResponse response = CloudflareHTTPResponse(
    http.Response('', HttpStatus.notFound),
    null,
  );

  CloudflareHTTPResponse httpResponseToCustomHttpResponse(
      HttpResponse response) {
    dynamic body = response.data;
    CloudflareErrorResponse? error;
    if (parseCloudflareResponse) {
      if (body is Map<String, dynamic>) {
        body = CloudflareResponse.fromJson(body);
      } else if (body is String) {
        body = CloudflareResponse().fromJsonString(body);
      }
      if (body is CloudflareResponse && !body.success) {
        error = CloudflareErrorResponse(
          errors: body.errors,
          messages: body.messages,
        );
      }
    }
    return CloudflareHTTPResponse(
        http.Response(
          '',
          response.response.statusCode ?? HttpStatus.notFound,
          headers: MapUtils.parseHeaders(response.response.headers) ?? {},
          isRedirect: response.response.isRedirect,
          request: http.Request(
            response.response.requestOptions.method,
            response.response.requestOptions.uri,
          ),
        ),
        body,
        error: error,
        extraData: response);
  }

  CloudflareHTTPResponse<CloudflareResponse> dioErrorToCustomHttpResponse(
          dio.DioException error) =>
      CloudflareHTTPResponse(
          http.Response(
            '',
            error.response?.statusCode ?? HttpStatus.notFound,
            headers: MapUtils.parseHeaders(error.response?.headers) ?? {},
            isRedirect: error.response?.isRedirect ?? false,
            request: http.Request(
              error.response?.requestOptions.method ?? HttpMethod.GET,
              error.response?.requestOptions.uri ?? Uri(),
            ),
          ),
          null,
          error: error.response?.data ??
              CloudflareErrorResponse(
                errors: [ErrorInfo(message: error.message)],
              ),
          extraData: error);

  try {
    final HttpResponse httpResponse = await futureResponse;
    response = httpResponseToCustomHttpResponse(httpResponse);
  } catch (e) {
    if (e is HttpResponse) {
      response = httpResponseToCustomHttpResponse(e);
    } else if (e is dio.DioException) {
      switch (e.type) {
        case dio.DioExceptionType.connectionTimeout:
        case dio.DioExceptionType.receiveTimeout:
        case dio.DioExceptionType.sendTimeout:
          throw TimeoutException(e.message);
        default:
      }
      if (e.error is Exception) throw e.error as Exception;
      response = dioErrorToCustomHttpResponse(e);
    } else {
      rethrow;
    }
  }
  return response;
}