add session timeout on proxy server
This commit is contained in:
+33
-2
@@ -31,6 +31,10 @@ using namespace std;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static const uint32_t SESSION_TIMEOUT_USECS = 30000000; // 30 seconds
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void flush_and_free_bufferevent(struct bufferevent* bev) {
|
static void flush_and_free_bufferevent(struct bufferevent* bev) {
|
||||||
bufferevent_flush(bev, EV_READ | EV_WRITE, BEV_FINISHED);
|
bufferevent_flush(bev, EV_READ | EV_WRITE, BEV_FINISHED);
|
||||||
bufferevent_free(bev);
|
bufferevent_free(bev);
|
||||||
@@ -226,7 +230,7 @@ void ProxyServer::UnlinkedSession::on_client_input() {
|
|||||||
// destination in the client config. If there is, open a new linked
|
// destination in the client config. If there is, open a new linked
|
||||||
// session and set its initial destination
|
// session and set its initial destination
|
||||||
if (client_config.magic != CLIENT_CONFIG_MAGIC) {
|
if (client_config.magic != CLIENT_CONFIG_MAGIC) {
|
||||||
log(ERROR, "[ProxyServer/%08" PRIX32 "] Client configuration is invalid",
|
log(ERROR, "[ProxyServer/%08" PRIX32 "] Client configuration is invalid; cannot open session",
|
||||||
license->serial_number);
|
license->serial_number);
|
||||||
} else {
|
} else {
|
||||||
session.reset(new LinkedSession(
|
session.reset(new LinkedSession(
|
||||||
@@ -238,6 +242,8 @@ void ProxyServer::UnlinkedSession::on_client_input() {
|
|||||||
client_config.proxy_destination_port));
|
client_config.proxy_destination_port));
|
||||||
this->server->serial_number_to_session.emplace(
|
this->server->serial_number_to_session.emplace(
|
||||||
license->serial_number, session);
|
license->serial_number, session);
|
||||||
|
log(INFO, "[ProxyServer/%08" PRIX32 "] Opened session",
|
||||||
|
license->serial_number);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -285,6 +291,8 @@ ProxyServer::LinkedSession::LinkedSession(
|
|||||||
uint32_t dest_addr,
|
uint32_t dest_addr,
|
||||||
uint16_t dest_port)
|
uint16_t dest_port)
|
||||||
: server(server),
|
: server(server),
|
||||||
|
timeout_event(event_new(this->server->base.get(), -1, EV_TIMEOUT,
|
||||||
|
&LinkedSession::dispatch_on_timeout, this), event_free),
|
||||||
license(license),
|
license(license),
|
||||||
client_bev(nullptr, flush_and_free_bufferevent),
|
client_bev(nullptr, flush_and_free_bufferevent),
|
||||||
server_bev(nullptr, flush_and_free_bufferevent),
|
server_bev(nullptr, flush_and_free_bufferevent),
|
||||||
@@ -353,6 +361,9 @@ void ProxyServer::LinkedSession::resume(
|
|||||||
&ProxyServer::LinkedSession::dispatch_on_server_input, nullptr,
|
&ProxyServer::LinkedSession::dispatch_on_server_input, nullptr,
|
||||||
&ProxyServer::LinkedSession::dispatch_on_server_error, this);
|
&ProxyServer::LinkedSession::dispatch_on_server_error, this);
|
||||||
bufferevent_enable(this->server_bev.get(), EV_READ | EV_WRITE);
|
bufferevent_enable(this->server_bev.get(), EV_READ | EV_WRITE);
|
||||||
|
|
||||||
|
// Cancel the session delete timeout
|
||||||
|
event_del(this->timeout_event.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -388,6 +399,19 @@ void ProxyServer::LinkedSession::dispatch_on_server_error(
|
|||||||
reinterpret_cast<LinkedSession*>(ctx)->on_stream_error(events, true);
|
reinterpret_cast<LinkedSession*>(ctx)->on_stream_error(events, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ProxyServer::LinkedSession::dispatch_on_timeout(
|
||||||
|
evutil_socket_t, short, void* ctx) {
|
||||||
|
reinterpret_cast<LinkedSession*>(ctx)->on_timeout();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void ProxyServer::LinkedSession::on_timeout() {
|
||||||
|
log(INFO, "[ProxyServer/%08" PRIX32 "] Session timed out",
|
||||||
|
this->license->serial_number);
|
||||||
|
this->server->delete_session(this->license->serial_number);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ProxyServer::LinkedSession::on_stream_error(
|
void ProxyServer::LinkedSession::on_stream_error(
|
||||||
@@ -415,6 +439,11 @@ void ProxyServer::LinkedSession::disconnect() {
|
|||||||
this->server_output_crypt.reset();
|
this->server_output_crypt.reset();
|
||||||
this->client_input_crypt.reset();
|
this->client_input_crypt.reset();
|
||||||
this->client_output_crypt.reset();
|
this->client_output_crypt.reset();
|
||||||
|
|
||||||
|
// Set a timeout to delete the session entirely (in case the client doesn't
|
||||||
|
// reconnect)
|
||||||
|
struct timeval tv = usecs_to_timeval(SESSION_TIMEOUT_USECS);
|
||||||
|
event_add(this->timeout_event.get(), &tv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -967,5 +996,7 @@ shared_ptr<ProxyServer::LinkedSession> ProxyServer::get_session() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ProxyServer::delete_session(uint32_t serial_number) {
|
void ProxyServer::delete_session(uint32_t serial_number) {
|
||||||
this->serial_number_to_session.erase(serial_number);
|
if (this->serial_number_to_session.erase(serial_number)) {
|
||||||
|
log(WARNING, "[ProxyServer/%08" PRIX32 "] Closed session", serial_number);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ public:
|
|||||||
struct LinkedSession {
|
struct LinkedSession {
|
||||||
ProxyServer* server;
|
ProxyServer* server;
|
||||||
|
|
||||||
|
std::unique_ptr<struct event, void(*)(struct event*)> timeout_event;
|
||||||
|
|
||||||
std::shared_ptr<const License> license;
|
std::shared_ptr<const License> license;
|
||||||
|
|
||||||
std::unique_ptr<struct bufferevent, void(*)(struct bufferevent*)> client_bev;
|
std::unique_ptr<struct bufferevent, void(*)(struct bufferevent*)> client_bev;
|
||||||
@@ -93,9 +95,11 @@ public:
|
|||||||
static void dispatch_on_server_input(struct bufferevent* bev, void* ctx);
|
static void dispatch_on_server_input(struct bufferevent* bev, void* ctx);
|
||||||
static void dispatch_on_server_error(struct bufferevent* bev, short events,
|
static void dispatch_on_server_error(struct bufferevent* bev, short events,
|
||||||
void* ctx);
|
void* ctx);
|
||||||
|
static void dispatch_on_timeout(evutil_socket_t fd, short what, void* ctx);
|
||||||
void on_client_input();
|
void on_client_input();
|
||||||
void on_server_input();
|
void on_server_input();
|
||||||
void on_stream_error(short events, bool is_server_stream);
|
void on_stream_error(short events, bool is_server_stream);
|
||||||
|
void on_timeout();
|
||||||
|
|
||||||
void send_to_end(const void* data, size_t size, bool to_server);
|
void send_to_end(const void* data, size_t size, bool to_server);
|
||||||
void send_to_end(const std::string& data, bool to_server);
|
void send_to_end(const std::string& data, bool to_server);
|
||||||
|
|||||||
Reference in New Issue
Block a user