in lambda/src/main/java/cn/amazon/aws/rp/spapi/lambda/requestlimiter/ApiProxy.java [45:82]
public ApiResponse<R> invkWithToken(Map<String, Object> input, String sellerName) throws Throwable {
ApiResponse<R> result = null;
try {
final String limiterName = String.format("%s:%s", sellerName, ivk.getRateLimiterNameSuffix());
// Blocking here.
acquireToken(limiterName);
logger.info("request parameters: " + gson.toJson(input));
result = ivk.invoke(input);
logger.info("result is: " + gson.toJson(result)); // TODO remove it.
// Retry
if (result.getStatusCode() == OVER_REQUEST_CODE) {
logger.warn("SERVER SIDE LIMIT: going to retry due to request too frequently.");
result = retryInvk(input, sellerName);
}
// Everything is good here, so we reset delay
delayTime = 0.0;
// Update rate limiter
final List<String> updateLimit = result.getHeaders().get(X_AMZN_RATE_LIMIT_LIMIT);
if (updateLimit != null) {
logger.info("server current limit is " + gson.toJson(updateLimit));
final String limit = updateLimit.get(0);
if (limit != null) {
updateLimiter(limiterName, limit);
}
}
} catch (ApiException throwable) {
logger.error("Other error found in API Call ", throwable);
logger.error("Details: " + gson.toJson(throwable));
throw throwable;
}
return result;
}