Add and use Client::get_closing_error().

This commit is contained in:
levlam 2022-12-12 17:57:22 +03:00
parent 9aeb8135e0
commit ed9f836977
2 changed files with 33 additions and 38 deletions

View File

@ -4633,12 +4633,9 @@ void Client::get_chat_member(int64 chat_id, int64 user_id, PromisedQueryPtr quer
} }
void Client::send_request(object_ptr<td_api::Function> &&f, td::unique_ptr<TdQueryCallback> handler) { void Client::send_request(object_ptr<td_api::Function> &&f, td::unique_ptr<TdQueryCallback> handler) {
if (logging_out_) { if (closing_ || logging_out_) {
return handler->on_result( auto error = get_closing_error();
make_object<td_api::error>(LOGGING_OUT_ERROR_CODE, get_logging_out_error_description().str())); return handler->on_result(make_object<td_api::error>(error.code, error.message.str()));
}
if (closing_) {
return handler->on_result(make_object<td_api::error>(CLOSING_ERROR_CODE, CLOSING_ERROR_DESCRIPTION.str()));
} }
do_send_request(std::move(f), std::move(handler)); do_send_request(std::move(f), std::move(handler));
@ -4671,13 +4668,12 @@ void Client::on_update_file(object_ptr<td_api::file> file) {
} }
if (!file->local_->is_downloading_active_ && download_started_file_ids_.count(file_id)) { if (!file->local_->is_downloading_active_ && download_started_file_ids_.count(file_id)) {
// also includes all 5xx and 429 errors // also includes all 5xx and 429 errors
if (closing_ || logging_out_) {
auto error = get_closing_error();
return on_file_download(file_id, Status::Error(error.code, error.message));
}
auto error = Status::Error(400, "Bad Request: wrong file_id or the file is temporarily unavailable"); auto error = Status::Error(400, "Bad Request: wrong file_id or the file is temporarily unavailable");
if (logging_out_) {
error = Status::Error(LOGGING_OUT_ERROR_CODE, get_logging_out_error_description());
}
if (closing_) {
error = Status::Error(CLOSING_ERROR_CODE, CLOSING_ERROR_DESCRIPTION);
}
return on_file_download(file_id, std::move(error)); return on_file_download(file_id, std::move(error));
} }
} }
@ -5128,10 +5124,6 @@ void Client::on_result(td::uint64 id, object_ptr<td_api::Object> result) {
handlers_.erase(id); handlers_.erase(id);
} }
td::Slice Client::get_logging_out_error_description() const {
return is_api_id_invalid_ ? API_ID_INVALID_ERROR_DESCRIPTION : LOGGING_OUT_ERROR_DESCRIPTION;
}
void Client::on_closed() { void Client::on_closed() {
LOG(WARNING) << "Closed"; LOG(WARNING) << "Closed";
CHECK(logging_out_ || closing_); CHECK(logging_out_ || closing_);
@ -9331,14 +9323,26 @@ void Client::fail_query_conflict(Slice message, PromisedQueryPtr &&query) {
} }
} }
void Client::fail_query_closing(PromisedQueryPtr &&query) const { void Client::fail_query_closing(PromisedQueryPtr &&query) {
auto error = get_closing_error();
fail_query(error.code, error.message, std::move(query));
}
Client::ClosingError Client::get_closing_error() {
ClosingError result;
if (logging_out_) { if (logging_out_) {
return fail_query(LOGGING_OUT_ERROR_CODE, get_logging_out_error_description(), std::move(query)); result.code = 401;
if (is_api_id_invalid_) {
result.message = Slice("Unauthorized: invalid api-id/api-hash");
} else {
result.message = Slice("Unauthorized");
}
} else {
CHECK(closing_);
result.code = 500;
result.message = Slice("Internal Server Error: restart");
} }
if (closing_) { return result;
return fail_query(CLOSING_ERROR_CODE, CLOSING_ERROR_DESCRIPTION, std::move(query));
}
UNREACHABLE();
} }
class Client::JsonUpdates final : public Jsonable { class Client::JsonUpdates final : public Jsonable {
@ -10940,13 +10944,6 @@ constexpr Client::Slice Client::GREAT_MINDS_SET_NAME;
constexpr Client::Slice Client::MASK_POINTS[MASK_POINTS_SIZE]; constexpr Client::Slice Client::MASK_POINTS[MASK_POINTS_SIZE];
constexpr int Client::LOGGING_OUT_ERROR_CODE;
constexpr Client::Slice Client::LOGGING_OUT_ERROR_DESCRIPTION;
constexpr Client::Slice Client::API_ID_INVALID_ERROR_DESCRIPTION;
constexpr int Client::CLOSING_ERROR_CODE;
constexpr Client::Slice Client::CLOSING_ERROR_DESCRIPTION;
td::FlatHashMap<td::string, td::Status (Client::*)(PromisedQueryPtr &query)> Client::methods_; td::FlatHashMap<td::string, td::Status (Client::*)(PromisedQueryPtr &query)> Client::methods_;
} // namespace telegram_bot_api } // namespace telegram_bot_api

View File

@ -84,13 +84,6 @@ class Client final : public WebhookActor::Callback {
static constexpr int32 MAX_LENGTH = 10000; // max width or height static constexpr int32 MAX_LENGTH = 10000; // max width or height
static constexpr int32 MAX_DURATION = 24 * 60 * 60; static constexpr int32 MAX_DURATION = 24 * 60 * 60;
static constexpr int LOGGING_OUT_ERROR_CODE = 401;
static constexpr Slice LOGGING_OUT_ERROR_DESCRIPTION = "Unauthorized";
static constexpr Slice API_ID_INVALID_ERROR_DESCRIPTION = "Unauthorized: invalid api-id/api-hash";
static constexpr int CLOSING_ERROR_CODE = 500;
static constexpr Slice CLOSING_ERROR_DESCRIPTION = "Internal Server Error: restart";
class JsonFile; class JsonFile;
class JsonDatedFile; class JsonDatedFile;
class JsonDatedFiles; class JsonDatedFiles;
@ -316,7 +309,6 @@ class Client final : public WebhookActor::Callback {
void on_update_authorization_state(); void on_update_authorization_state();
void log_out(bool is_api_id_invalid); void log_out(bool is_api_id_invalid);
Slice get_logging_out_error_description() const;
void on_closed(); void on_closed();
void finish_closing(); void finish_closing();
@ -615,10 +607,16 @@ class Client final : public WebhookActor::Callback {
void abort_long_poll(bool from_set_webhook); void abort_long_poll(bool from_set_webhook);
void fail_query_closing(PromisedQueryPtr &&query) const; void fail_query_closing(PromisedQueryPtr &&query);
void fail_query_conflict(Slice message, PromisedQueryPtr &&query); void fail_query_conflict(Slice message, PromisedQueryPtr &&query);
struct ClosingError {
int code;
Slice message;
};
ClosingError get_closing_error();
static int get_retry_after_time(Slice error_message); static int get_retry_after_time(Slice error_message);
static void fail_query_with_error(PromisedQueryPtr query, int32 error_code, Slice error_message, static void fail_query_with_error(PromisedQueryPtr query, int32 error_code, Slice error_message,