Make MtprotoHeader thread-safe.
This commit is contained in:
parent
1ab81f426c
commit
e8d92b0dcb
@ -9,6 +9,7 @@
|
|||||||
#include "td/telegram/net/Proxy.h"
|
#include "td/telegram/net/Proxy.h"
|
||||||
|
|
||||||
#include "td/utils/common.h"
|
#include "td/utils/common.h"
|
||||||
|
#include "td/utils/port/RwMutex.h"
|
||||||
#include "td/utils/Slice.h"
|
#include "td/utils/Slice.h"
|
||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
@ -30,15 +31,18 @@ class MtprotoHeader {
|
|||||||
};
|
};
|
||||||
|
|
||||||
explicit MtprotoHeader(const Options &options) : options_(options) {
|
explicit MtprotoHeader(const Options &options) : options_(options) {
|
||||||
gen_headers();
|
default_header_ = gen_header(options_, false);
|
||||||
|
anonymous_header_ = gen_header(options_, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_proxy(Proxy proxy) {
|
void set_proxy(Proxy proxy) {
|
||||||
|
auto lock = rw_mutex_.lock_write();
|
||||||
options_.proxy = std::move(proxy);
|
options_.proxy = std::move(proxy);
|
||||||
default_header_ = gen_header(options_, false);
|
default_header_ = gen_header(options_, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool set_parameters(string parameters) {
|
bool set_parameters(string parameters) {
|
||||||
|
auto lock = rw_mutex_.lock_write();
|
||||||
if (options_.parameters == parameters) {
|
if (options_.parameters == parameters) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -49,6 +53,7 @@ class MtprotoHeader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool set_is_emulator(bool is_emulator) {
|
bool set_is_emulator(bool is_emulator) {
|
||||||
|
auto lock = rw_mutex_.lock_write();
|
||||||
if (options_.is_emulator == is_emulator) {
|
if (options_.is_emulator == is_emulator) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -59,6 +64,7 @@ class MtprotoHeader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool set_language_pack(string language_pack) {
|
bool set_language_pack(string language_pack) {
|
||||||
|
auto lock = rw_mutex_.lock_write();
|
||||||
if (options_.language_pack == language_pack) {
|
if (options_.language_pack == language_pack) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -69,6 +75,7 @@ class MtprotoHeader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool set_language_code(string language_code) {
|
bool set_language_code(string language_code) {
|
||||||
|
auto lock = rw_mutex_.lock_write();
|
||||||
if (options_.language_code == language_code) {
|
if (options_.language_code == language_code) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -79,6 +86,7 @@ class MtprotoHeader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool set_tz_offset(int32 tz_offset) {
|
bool set_tz_offset(int32 tz_offset) {
|
||||||
|
auto lock = rw_mutex_.lock_write();
|
||||||
if (options_.tz_offset == tz_offset) {
|
if (options_.tz_offset == tz_offset) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -88,14 +96,18 @@ class MtprotoHeader {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Slice get_default_header() const {
|
string get_default_header() const {
|
||||||
|
auto lock = rw_mutex_.lock_read();
|
||||||
return default_header_;
|
return default_header_;
|
||||||
}
|
}
|
||||||
Slice get_anonymous_header() const {
|
|
||||||
|
string get_anonymous_header() const {
|
||||||
|
auto lock = rw_mutex_.lock_read();
|
||||||
return anonymous_header_;
|
return anonymous_header_;
|
||||||
}
|
}
|
||||||
|
|
||||||
string get_system_language_code() const {
|
string get_system_language_code() const {
|
||||||
|
auto lock = rw_mutex_.lock_read();
|
||||||
return options_.system_language_code;
|
return options_.system_language_code;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,11 +115,7 @@ class MtprotoHeader {
|
|||||||
Options options_;
|
Options options_;
|
||||||
string default_header_;
|
string default_header_;
|
||||||
string anonymous_header_;
|
string anonymous_header_;
|
||||||
|
mutable RwMutex rw_mutex_;
|
||||||
void gen_headers() {
|
|
||||||
default_header_ = gen_header(options_, false);
|
|
||||||
anonymous_header_ = gen_header(options_, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
static string gen_header(const Options &options, bool is_anonymous);
|
static string gen_header(const Options &options, bool is_anonymous);
|
||||||
};
|
};
|
||||||
|
@ -278,9 +278,9 @@ Session::Session(unique_ptr<Callback> callback, std::shared_ptr<AuthDataShared>
|
|||||||
long_poll_connection_.connection_id_ = 1;
|
long_poll_connection_.connection_id_ = 1;
|
||||||
|
|
||||||
if (is_cdn) {
|
if (is_cdn) {
|
||||||
auth_data_.set_header(G()->mtproto_header().get_anonymous_header().str());
|
auth_data_.set_header(G()->mtproto_header().get_anonymous_header());
|
||||||
} else {
|
} else {
|
||||||
auth_data_.set_header(G()->mtproto_header().get_default_header().str());
|
auth_data_.set_header(G()->mtproto_header().get_default_header());
|
||||||
}
|
}
|
||||||
last_activity_timestamp_ = now;
|
last_activity_timestamp_ = now;
|
||||||
last_success_timestamp_ = now - 366 * 86400;
|
last_success_timestamp_ = now - 366 * 86400;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user