request method Null safety

Future<PaylikeResponse> request(
  1. String endpoint,
  2. RequestOptions? opts
)

Implementation

Future<PaylikeResponse> request(String endpoint, RequestOptions? opts) async {
  opts ??= RequestOptions();
  var url = Uri.parse(endpoint);
  if (opts.query != null) {
    url.replace(queryParameters: opts.query);
  }
  var headers = {
    'X-Client': opts.clientId,
    'Accept-Version': opts.version.toString(),
  };

  io.HttpClientRequest request;
  switch (opts.method) {
    case 'GET':
      request = await client.getUrl(url);
      break;
    case 'POST':
      request = await client.postUrl(url);
      headers = {
        ...headers,
        'Content-Type': 'application/json',
      };
      break;
    default:
      throw ('Unexpected error');
  }
  headers.forEach((key, value) {
    request.headers.add(key, value);
  });
  if (opts.method == 'POST') {
    request.write(jsonEncode(opts.data));
  }
  io.HttpClientResponse response;
  try {
    log({
      't': 'request',
      'method': opts.method,
      'url': url,
      'timeout': opts.timeout
    });
    if (opts.timeout.inSeconds == 0) {
      response = await request.close();
    } else {
      response = await request.close().timeout(opts.timeout);
    }
  } on TimeoutException catch (_) {
    request.abort();
    throw TimeoutException('Request timed out', opts.timeout);
  }
  if (response.statusCode == 429) {
    var retryHeaders = response.headers['retry-after'];
    if (retryHeaders != null && retryHeaders.length == 1) {
      throw RateLimitException.withTime(retryHeaders[0]);
    }
    throw RateLimitException();
  } else if (response.statusCode < 300) {
    return PaylikeResponse(response);
  } else {
    Exception exception = ServerErrorException.withHTTPInfo(
        response.statusCode, response.headers);
    try {
      var parsed = PaylikeResponse(response);
      Map<String, dynamic> body = jsonDecode(await parsed.getBody());
      exception = PaylikeException(body, response.statusCode);
    } catch (_) {}
    throw exception;
  }
}