arriRequest function

Future<Response> arriRequest(
  1. String url, {
  2. Client? httpClient,
  3. HttpMethod method = HttpMethod.get,
  4. Map<String, dynamic>? params,
  5. FutureOr<Map<String, String>> headers()?,
  6. Map<String, String>? query,
  7. Encoding? encoding,
  8. String? clientVersion,
})

Perform a raw http request

Implementation

Future<http.Response> arriRequest(
  String url, {
  http.Client? httpClient,
  HttpMethod method = HttpMethod.get,
  Map<String, dynamic>? params,
  FutureOr<Map<String, String>> Function()? headers,

  /// manually specify specific url query parameters
  Map<String, String>? query,

  /// manually specify a specific encoding
  Encoding? encoding,
  String? clientVersion,
}) async {
  String defaultErrorMsg =
      "Placeholder request. If you see this that means a request was never sent to the server.";
  http.Response result = http.Response(
    """{"statusCode": 400,"statusMessage":"$defaultErrorMsg"}""",
    400,
  );

  final finalHeaders = await headers?.call() ?? {};
  if (clientVersion != null && clientVersion.isNotEmpty) {
    finalHeaders["client-version"] = clientVersion;
  }
  final client = httpClient ?? http.Client();
  String? bodyInput;
  if (method != HttpMethod.get && method != HttpMethod.head && params != null) {
    finalHeaders["Content-Type"] = "application/json";
    bodyInput = json.encode(params);
  }
  switch (method) {
    case HttpMethod.get:
      final paramsInput = query ?? params;
      if (paramsInput != null) {
        final queryParts = <String>[];
        for (final entry in paramsInput.entries) {
          queryParts.add("${entry.key}=${entry.value.toString()}");
        }
        final uri = Uri.parse("$url?${queryParts.join("&")}");
        result = await client.get(
          uri,
          headers: finalHeaders,
        );
        break;
      }
      final uri = Uri.parse(url);
      result = await client.get(uri, headers: finalHeaders);
      break;
    case HttpMethod.patch:
      result = await client.patch(
        Uri.parse(url),
        headers: finalHeaders,
        body: bodyInput,
        encoding: encoding,
      );
      break;
    case HttpMethod.put:
      result = await client.put(
        Uri.parse(url),
        headers: finalHeaders,
        body: bodyInput,
        encoding: encoding,
      );
      break;
    case HttpMethod.post:
      result = await client.post(
        Uri.parse(url),
        headers: finalHeaders,
        body: bodyInput,
        encoding: encoding,
      );
      break;
    case HttpMethod.head:
      final paramsInput = query ?? params;
      if (paramsInput != null) {
        final queryParts = <String>[];
        for (final entry in paramsInput.entries) {
          queryParts.add("${entry.key}=${entry.value.toString()}");
        }
        final uri = Uri.parse("$url?${queryParts.join("&")}");
        result = await client.head(
          uri,
          headers: finalHeaders,
        );
      }
      break;
    case HttpMethod.delete:
      result = await client.delete(Uri.parse(url),
          headers: finalHeaders, encoding: encoding, body: bodyInput);
      break;
    default:
      throw ArriError.fromResponse(result);
  }
  return result;
}