Skip to content

Commit a788699

Browse files
committed
Отладка стабильности работы
1 parent f25405c commit a788699

File tree

5 files changed

+87
-42
lines changed

5 files changed

+87
-42
lines changed

include/client/ws.hpp

+15-8
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ namespace awh {
7676
frame_t::opcode_t opcode = frame_t::opcode_t::TEXT;
7777
// Флаги работы с сжатыми данными
7878
http_t::compress_t compress = http_t::compress_t::NONE;
79+
private:
80+
// Список контекстов передаваемых объектов
81+
vector <void *> ctx = {nullptr, nullptr, nullptr, nullptr};
7982
private:
8083
// Создаём объект для работы с HTTP
8184
wsc_t * http = nullptr;
@@ -96,13 +99,13 @@ namespace awh {
9699
const coreCli_t * core = nullptr;
97100
private:
98101
// Функция обратного вызова, при запуске или остановки подключения к серверу
99-
function <void (const bool, WebSocketClient *)> openStopFn = nullptr;
102+
function <void (const bool, WebSocketClient *, void *)> openStopFn = nullptr;
100103
// Функция обратного вызова, при получении ответа от сервера
101-
function <void (const string &, WebSocketClient *)> pongFn = nullptr;
104+
function <void (const string &, WebSocketClient *, void *)> pongFn = nullptr;
102105
// Функция обратного вызова, при получении ошибки работы клиента
103-
function <void (const u_short, const string &, WebSocketClient *)> errorFn = nullptr;
106+
function <void (const u_short, const string &, WebSocketClient *, void *)> errorFn = nullptr;
104107
// Функция обратного вызова, при получении сообщения с сервера
105-
function <void (const vector <char> &, const bool, WebSocketClient *)> messageFn = nullptr;
108+
function <void (const vector <char> &, const bool, WebSocketClient *, void *)> messageFn = nullptr;
106109
private:
107110
/**
108111
* chunking Метод обработки получения чанков
@@ -190,24 +193,28 @@ namespace awh {
190193
public:
191194
/**
192195
* on Метод установки функции обратного вызова на событие запуска или остановки подключения
196+
* @param ctx контекст для вывода в сообщении
193197
* @param callback функция обратного вызова
194198
*/
195-
void on(function <void (const bool, WebSocketClient *)> callback) noexcept;
199+
void on(void * ctx, function <void (const bool, WebSocketClient *, void *)> callback) noexcept;
196200
/**
197201
* on Метод установки функции обратного вызова на событие получения PONG
202+
* @param ctx контекст для вывода в сообщении
198203
* @param callback функция обратного вызова
199204
*/
200-
void on(function <void (const string &, WebSocketClient *)> callback) noexcept;
205+
void on(void * ctx, function <void (const string &, WebSocketClient *, void *)> callback) noexcept;
201206
/**
202207
* on Метод установки функции обратного вызова на событие получения ошибок
208+
* @param ctx контекст для вывода в сообщении
203209
* @param callback функция обратного вызова
204210
*/
205-
void on(function <void (const u_short, const string &, WebSocketClient *)> callback) noexcept;
211+
void on(void * ctx, function <void (const u_short, const string &, WebSocketClient *, void *)> callback) noexcept;
206212
/**
207213
* on Метод установки функции обратного вызова на событие получения сообщений
214+
* @param ctx контекст для вывода в сообщении
208215
* @param callback функция обратного вызова
209216
*/
210-
void on(function <void (const vector <char> &, const bool, WebSocketClient *)> callback) noexcept;
217+
void on(void * ctx, function <void (const vector <char> &, const bool, WebSocketClient *, void *)> callback) noexcept;
211218
public:
212219
/**
213220
* send Метод отправки сообщения на сервер

include/lib.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*/
99

1010
// Версия приложения
11-
#define AWH_VERSION "1.1.2"
11+
#define AWH_VERSION "1.1.3"
1212
// Короткое название библиотеки
1313
#define AWH_SHORT_NAME "AWH"
1414
// Название библиотеки

sample/ws.cpp

+16-9
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,11 @@ int main(int argc, char * argv[]) noexcept {
7575
// cout << " ============= " << message << endl;
7676
});
7777
// Подписываемся на событие запуска и остановки сервера
78-
ws.on([](const bool mode, wsCli_t * ws){
79-
// Выводим сообщение
80-
cout << " +++++++++++++ " << (mode ? "Start" : "Stop") << " server" << endl;
78+
ws.on(&log, [](const bool mode, wsCli_t * ws, void * ctx){
79+
// Получаем объект логирования
80+
log_t * log = reinterpret_cast <log_t *> (ctx);
81+
// Выводим информацию в лог
82+
log->print("%s server", log_t::flag_t::INFO, (mode ? "Start" : "Stop"));
8183
// Если подключение произошло удачно
8284
if(mode){
8385
// Создаём объект JSON
@@ -97,16 +99,21 @@ int main(int argc, char * argv[]) noexcept {
9799
}
98100
});
99101
// Подписываемся на событие получения ошибки работы клиента
100-
ws.on([](const u_short code, const string & mess, wsCli_t * ws){
101-
// Выводим сообщение об ошибке
102-
cout << " +++++++++++++ " << code << " === " << mess << endl;
102+
ws.on(&log, [](const u_short code, const string & mess, wsCli_t * ws, void * ctx){
103+
// Получаем объект логирования
104+
log_t * log = reinterpret_cast <log_t *> (ctx);
105+
// Выводим информацию в лог
106+
log->print("%s [%u]", log_t::flag_t::CRITICAL, mess.c_str(), code);
103107
});
104108
// Подписываемся на событие ответа сервера PONG
105-
ws.on([](const string & mess, wsCli_t * ws){
106-
cout << " +++++++++++++ " << "PONG" << " === " << mess << endl;
109+
ws.on(&log, [](const string & mess, wsCli_t * ws, void * ctx){
110+
// Получаем объект логирования
111+
log_t * log = reinterpret_cast <log_t *> (ctx);
112+
// Выводим информацию в лог
113+
log->print("PONG %s", log_t::flag_t::INFO, mess.c_str());
107114
});
108115
// Подписываемся на событие получения сообщения с сервера
109-
ws.on([](const vector <char> & buffer, const bool utf8, wsCli_t * ws){
116+
ws.on(nullptr, [](const vector <char> & buffer, const bool utf8, wsCli_t * ws, void * ctx){
110117
// Если данные пришли в виде текста, выводим
111118
if(utf8){
112119
// Создаём объект JSON

src/client/rest.cpp

+8-4
Original file line numberDiff line numberDiff line change
@@ -198,13 +198,15 @@ void awh::Rest::readCallback(const char * buffer, const size_t size, const size_
198198
}
199199
// Устанавливаем код ответа
200200
web->res.code = 403;
201-
// Устанавливаем сообщение ответа
202-
web->res.message = web->http->getMessage(web->res.code);
203201
} break;
204202
// Если запрос выполнен удачно
205203
case (uint8_t) http_t::stath_t::GOOD: web->res.ok = true;
206204
// Если запрос неудачный
207205
case (uint8_t) http_t::stath_t::FAULT: {
206+
// Запрещаем бесконечный редирект при запросе авторизации
207+
if((web->res.code == 401) || (web->res.code == 407))
208+
// Устанавливаем код ответа
209+
web->res.code = 403;
208210
// Получаем тело запроса
209211
const auto & entity = web->http->getBody();
210212
// Устанавливаем заголовки ответа
@@ -301,8 +303,6 @@ void awh::Rest::readProxyCallback(const char * buffer, const size_t size, const
301303
}
302304
// Устанавливаем код ответа
303305
web->res.code = 403;
304-
// Устанавливаем сообщение ответа
305-
web->res.message = web->worker.proxy.http->getMessage(web->res.code);
306306
} break;
307307
// Если запрос выполнен удачно
308308
case (uint8_t) http_t::stath_t::GOOD: {
@@ -315,6 +315,10 @@ void awh::Rest::readProxyCallback(const char * buffer, const size_t size, const
315315
} break;
316316
// Если запрос неудачный
317317
case (uint8_t) http_t::stath_t::FAULT: {
318+
// Запрещаем бесконечный редирект при запросе авторизации
319+
if((web->res.code == 401) || (web->res.code == 407))
320+
// Устанавливаем код ответа
321+
web->res.code = 403;
318322
// Получаем тело запроса
319323
const auto & entity = web->worker.proxy.http->getBody();
320324
// Устанавливаем заголовки ответа

src/client/ws.cpp

+47-20
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ void awh::WebSocketClient::readCallback(const char * buffer, const size_t size,
184184
// Выводим в лог сообщение
185185
ws->log->print("%s", log_t::flag_t::INFO, "authorization on the WebSocket server was successful");
186186
// Если функция обратного вызова установлена, выполняем
187-
if(ws->openStopFn != nullptr) ws->openStopFn(true, ws);
187+
if(ws->openStopFn != nullptr) ws->openStopFn(true, ws, ws->ctx.at(0));
188188
// Устанавливаем таймер на контроль подключения
189189
ws->timerPing.setInterval([ws]{
190190
// Выполняем пинг сервера
@@ -210,6 +210,13 @@ void awh::WebSocketClient::readCallback(const char * buffer, const size_t size,
210210
ws->code = query.code;
211211
// Создаём сообщение
212212
mess_t mess(ws->code, query.message);
213+
// Запрещаем бесконечный редирект при запросе авторизации
214+
if((ws->code == 401) || (ws->code == 407)){
215+
// Устанавливаем код ответа
216+
ws->code = 403;
217+
// Присваиваем сообщению, новое значение кода
218+
mess = ws->code;
219+
}
213220
// Выводим сообщение
214221
ws->error(mess);
215222
} break;
@@ -286,7 +293,7 @@ void awh::WebSocketClient::readCallback(const char * buffer, const size_t size,
286293
// Если ответом является PONG
287294
case (uint8_t) frame_t::opcode_t::PONG:
288295
// Если функция обратного вызова обработки PONG существует
289-
if(ws->pongFn != nullptr) ws->pongFn(string(data.begin(), data.end()), ws);
296+
if(ws->pongFn != nullptr) ws->pongFn(string(data.begin(), data.end()), ws, ws->ctx.at(1));
290297
break;
291298
// Если ответом является TEXT
292299
case (uint8_t) frame_t::opcode_t::TEXT:
@@ -434,8 +441,6 @@ void awh::WebSocketClient::readProxyCallback(const char * buffer, const size_t s
434441
ws->code = 403;
435442
// Присваиваем сообщению, новое значение кода
436443
mess = ws->code;
437-
// Устанавливаем сообщение ответа
438-
mess = ws->worker.proxy.http->getMessage(ws->code);
439444
} break;
440445
// Если запрос выполнен удачно
441446
case (uint8_t) http_t::stath_t::GOOD: {
@@ -446,6 +451,16 @@ void awh::WebSocketClient::readProxyCallback(const char * buffer, const size_t s
446451
// Завершаем работу
447452
return;
448453
} break;
454+
// Если запрос неудачный
455+
case (uint8_t) http_t::stath_t::FAULT: {
456+
// Запрещаем бесконечный редирект при запросе авторизации
457+
if((ws->code == 401) || (ws->code == 407)){
458+
// Устанавливаем код ответа
459+
ws->code = 403;
460+
// Присваиваем сообщению, новое значение кода
461+
mess = ws->code;
462+
}
463+
} break;
449464
}
450465
// Выводим сообщение
451466
ws->error(mess);
@@ -474,7 +489,7 @@ void awh::WebSocketClient::error(const mess_t & message) const noexcept {
474489
// Иначе выводим сообщение в упрощёном виде
475490
else this->log->print("%s [%u]", log_t::flag_t::WARNING, message.text.c_str(), message.code);
476491
// Если функция обратного вызова установлена, выводим полученное сообщение
477-
if(this->errorFn != nullptr) this->errorFn(message.code, message.text, const_cast <WebSocketClient *> (this));
492+
if(this->errorFn != nullptr) this->errorFn(message.code, message.text, const_cast <WebSocketClient *> (this), this->ctx.at(2));
478493
}
479494
}
480495
/**
@@ -518,19 +533,19 @@ void awh::WebSocketClient::extraction(const vector <char> & buffer, const bool u
518533
// Выполняем шифрование переданных данных
519534
const auto & res = this->hash->decrypt(data.data(), data.size());
520535
// Отправляем полученный результат
521-
if(!res.empty()) this->messageFn(res, utf8, const_cast <WebSocketClient *> (this));
536+
if(!res.empty()) this->messageFn(res, utf8, const_cast <WebSocketClient *> (this), this->ctx.at(3));
522537
// Иначе выводим сообщение так - как оно пришло
523-
else this->messageFn(data, utf8, const_cast <WebSocketClient *> (this));
538+
else this->messageFn(data, utf8, const_cast <WebSocketClient *> (this), this->ctx.at(3));
524539
// Отправляем полученный результат
525-
} else this->messageFn(data, utf8, const_cast <WebSocketClient *> (this));
540+
} else this->messageFn(data, utf8, const_cast <WebSocketClient *> (this), this->ctx.at(3));
526541
// Выводим сообщение об ошибке
527542
} else {
528543
// Создаём сообщение
529544
mess_t mess(1007, "received data decompression error");
530545
// Выводим сообщение
531546
this->error(mess);
532547
// Иначе выводим сообщение так - как оно пришло
533-
this->messageFn(buffer, utf8, const_cast <WebSocketClient *> (this));
548+
this->messageFn(buffer, utf8, const_cast <WebSocketClient *> (this), this->ctx.at(3));
534549
}
535550
// Если функция обратного вызова установлена, выводим полученное сообщение
536551
} else {
@@ -539,11 +554,11 @@ void awh::WebSocketClient::extraction(const vector <char> & buffer, const bool u
539554
// Выполняем шифрование переданных данных
540555
const auto & res = this->hash->decrypt(buffer.data(), buffer.size());
541556
// Отправляем полученный результат
542-
if(!res.empty()) this->messageFn(res, utf8, const_cast <WebSocketClient *> (this));
557+
if(!res.empty()) this->messageFn(res, utf8, const_cast <WebSocketClient *> (this), this->ctx.at(3));
543558
// Иначе выводим сообщение так - как оно пришло
544-
else this->messageFn(buffer, utf8, const_cast <WebSocketClient *> (this));
559+
else this->messageFn(buffer, utf8, const_cast <WebSocketClient *> (this), this->ctx.at(3));
545560
// Отправляем полученный результат
546-
} else this->messageFn(buffer, utf8, const_cast <WebSocketClient *> (this));
561+
} else this->messageFn(buffer, utf8, const_cast <WebSocketClient *> (this), this->ctx.at(3));
547562
}
548563
}
549564
}
@@ -597,33 +612,45 @@ void awh::WebSocketClient::init(const string & url, const http_t::compress_t com
597612
}
598613
/**
599614
* on Метод установки функции обратного вызова на событие запуска или остановки подключения
615+
* @param ctx контекст для вывода в сообщении
600616
* @param callback функция обратного вызова
601617
*/
602-
void awh::WebSocketClient::on(function <void (const bool, WebSocketClient *)> callback) noexcept {
618+
void awh::WebSocketClient::on(void * ctx, function <void (const bool, WebSocketClient *, void *)> callback) noexcept {
619+
// Устанавливаем контекст передаваемого объекта
620+
this->ctx.at(0) = ctx;
603621
// Устанавливаем функцию запуска и остановки
604622
this->openStopFn = callback;
605623
}
606624
/**
607625
* on Метод установки функции обратного вызова на событие получения PONG
626+
* @param ctx контекст для вывода в сообщении
608627
* @param callback функция обратного вызова
609628
*/
610-
void awh::WebSocketClient::on(function <void (const string &, WebSocketClient *)> callback) noexcept {
629+
void awh::WebSocketClient::on(void * ctx, function <void (const string &, WebSocketClient *, void *)> callback) noexcept {
630+
// Устанавливаем контекст передаваемого объекта
631+
this->ctx.at(1) = ctx;
611632
// Устанавливаем функцию получения сообщений PONG
612633
this->pongFn = callback;
613634
}
614635
/**
615636
* on Метод установки функции обратного вызова на событие получения ошибок
637+
* @param ctx контекст для вывода в сообщении
616638
* @param callback функция обратного вызова
617639
*/
618-
void awh::WebSocketClient::on(function <void (const u_short, const string &, WebSocketClient *)> callback) noexcept {
640+
void awh::WebSocketClient::on(void * ctx, function <void (const u_short, const string &, WebSocketClient *, void *)> callback) noexcept {
641+
// Устанавливаем контекст передаваемого объекта
642+
this->ctx.at(2) = ctx;
619643
// Устанавливаем функцию получения ошибок
620644
this->errorFn = callback;
621645
}
622646
/**
623647
* on Метод установки функции обратного вызова на событие получения сообщений
648+
* @param ctx контекст для вывода в сообщении
624649
* @param callback функция обратного вызова
625650
*/
626-
void awh::WebSocketClient::on(function <void (const vector <char> &, const bool, WebSocketClient *)> callback) noexcept {
651+
void awh::WebSocketClient::on(void * ctx, function <void (const vector <char> &, const bool, WebSocketClient *, void *)> callback) noexcept {
652+
// Устанавливаем контекст передаваемого объекта
653+
this->ctx.at(3) = ctx;
627654
// Устанавливаем функцию получения сообщений с сервера
628655
this->messageFn = callback;
629656
}
@@ -753,7 +780,7 @@ void awh::WebSocketClient::stop() noexcept {
753780
// Если завершать работу запрещено, просто отключаемся
754781
else ((core_t *) const_cast <coreCli_t *> (this->core))->close(this->aid);
755782
// Если функция обратного вызова установлена, выполняем
756-
if(this->openStopFn != nullptr) this->openStopFn(false, this);
783+
if(this->openStopFn != nullptr) this->openStopFn(false, this, this->ctx.at(0));
757784
}
758785
}
759786
/**
@@ -767,10 +794,8 @@ void awh::WebSocketClient::pause() noexcept {
767794
* start Метод запуска клиента
768795
*/
769796
void awh::WebSocketClient::start() noexcept {
770-
// Снимаем с паузы клиент
771-
this->freeze = false;
772797
// Если адрес URL запроса передан
773-
if(!this->worker.url.empty()){
798+
if(!this->freeze && !this->worker.url.empty()){
774799
// Устанавливаем метод сжатия
775800
this->http->setCompress(this->compress);
776801
// Если биндинг не запущен, выполняем запуск биндинга
@@ -780,6 +805,8 @@ void awh::WebSocketClient::start() noexcept {
780805
// Выполняем запрос на сервер
781806
else const_cast <coreCli_t *> (this->core)->open(this->worker.wid);
782807
}
808+
// Снимаем с паузы клиент
809+
this->freeze = false;
783810
}
784811
/**
785812
* getSub Метод получения выбранного сабпротокола

0 commit comments

Comments
 (0)