in src/runtime.cpp [401:457]
void run_handler(std::function<invocation_response(invocation_request const&)> const& handler)
{
logging::log_info(LOG_TAG, "Initializing the C++ Lambda Runtime version %s", aws::lambda_runtime::get_version());
std::string endpoint("http://");
if (auto* ep = std::getenv("AWS_LAMBDA_RUNTIME_API")) {
assert(ep);
logging::log_debug(LOG_TAG, "LAMBDA_SERVER_ADDRESS defined in environment as: %s", ep);
endpoint += ep;
}
runtime rt(endpoint);
size_t retries = 0;
size_t const max_retries = 3;
while (retries < max_retries) {
auto next_outcome = rt.get_next();
if (!next_outcome.is_success()) {
if (next_outcome.get_failure() == aws::http::response_code::REQUEST_NOT_MADE) {
++retries;
continue;
}
logging::log_info(
LOG_TAG,
"HTTP request was not successful. HTTP response code: %d. Retrying..",
static_cast<int>(next_outcome.get_failure()));
++retries;
continue;
}
retries = 0;
auto const req = std::move(next_outcome).get_result();
logging::log_info(LOG_TAG, "Invoking user handler");
invocation_response res = handler(req);
logging::log_info(LOG_TAG, "Invoking user handler completed.");
if (res.is_success()) {
const auto post_outcome = rt.post_success(req.request_id, res);
if (!handle_post_outcome(post_outcome, req.request_id)) {
return; // TODO: implement a better retry strategy
}
}
else {
const auto post_outcome = rt.post_failure(req.request_id, res);
if (!handle_post_outcome(post_outcome, req.request_id)) {
return; // TODO: implement a better retry strategy
}
}
}
if (retries == max_retries) {
logging::log_error(
LOG_TAG, "Exhausted all retries. This is probably a bug in libcurl v" LIBCURL_VERSION " Exiting!");
}
}