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;
}
}