makeRequest method

Future<Response> makeRequest(
  1. String url,
  2. Map<String, String>? query,
  3. Map<String, String>? headers,
  4. List<int>? body,
  5. String type,
)

Implementation

Future<Response> makeRequest(
  String url,
  Map<String, String>? query,
  Map<String, String>? headers,
  List<int>? body,
  String type,
) async {
  headers?["Content-Type"] = "application/json";

  Uri parsedUri = Uri.parse(url);
  Uri uri = parsedUri.replace(queryParameters: query ?? {});

  int attempt = 0;

  while (true) {
    attempt++;
    try {
      http.Response response;
      switch (type) {
        case "GET":
          response = await client.get(
            uri,
            headers: headers,
          );
          break;

        case "POST":
          response = await client.post(
            uri,
            headers: headers,
            body: body,
          );
          break;

        case "PUT":
          response = await client.put(
            uri,
            headers: headers,
            body: body,
          );
          break;

        default:
          response = await client.get(
            uri,
            headers: headers,
          );
          break;
      }

      if (response.statusCode >= 200 && response.statusCode < 300) {
        return parseHttpResponse(response);
      }

      if (attempt >= maxRetries ||
          (response.statusCode != 502 && response.statusCode != 503)) {
        return parseHttpResponse(response);
      }
    } catch (e) {
      if (attempt >= maxRetries) {
        rethrow;
      }
    }

    final int interval = math.max(
        0, (2 * (retryInterval - minRetryInterval)) ~/ (1 << maxRetries));
    final Duration delay = Duration(
        milliseconds: minRetryInterval + (((1 << (attempt - 1)) * interval)));

    await Future.delayed(delay);
  }
}