send method

Future<HttpResponse> send({
  1. required String method,
  2. required String url,
  3. required Map<String, dynamic> headers,
  4. dynamic body,
  5. ResponseType responseType = ResponseType.json,
  6. int retries = 0,
})

Send request

Implementation

Future<HttpResponse> send({
  required String method,
  required String url,
  required Map<String, dynamic> headers,
  dynamic body,
  ResponseType responseType = ResponseType.json,
  int retries = 0,
}) async {
  int start = DateTime.now().millisecondsSinceEpoch;

  try {
    var res = await _dioClient.fetch(RequestOptions(
      method: method,
      path: url,
      headers: headers,
      data: body,
      responseType: responseType,
    ));

    client.log(
      LogLevel.info,
      "$method $url [${((DateTime.now().millisecondsSinceEpoch - start) / 1000).toStringAsFixed(2)}s]: ${res.statusCode ?? "???"} ${res.statusMessage ?? ""}",
    );

    return HttpResponse(
      success: true,
      data: res.data,
    );
  } on DioError catch (e) {
    client.log(
      LogLevel.info,
      "$method $url [${((DateTime.now().millisecondsSinceEpoch - start) / 1000).toStringAsFixed(2)}s]: ${e.response?.statusCode ?? "???"} ${e.response?.statusMessage ?? ""}",
    );

    int status = e.response?.statusCode ?? 0;

    if (status.toString().startsWith("5") && retries < restRetryLimit) {
      return await send(
        method: method,
        url: url,
        headers: headers,
        body: body,
        responseType: responseType,
        retries: retries + 1,
      );
    }

    if (status == 429 ||
        e.response?.data?["errorCode"] ==
            "errors.com.epicgames.common.throttled") {
      int retryAfter = 5;
      await Future.delayed(Duration(seconds: retryAfter + 5), () async {
        return await send(
          method: method,
          url: url,
          headers: headers,
          body: body,
          responseType: responseType,
          retries: retries + 1,
        );
      });
    }

    return HttpResponse(
      success: false,
      error: e.response?.data ?? e.message,
    );
  }
}