@@ -184,7 +184,7 @@ void awh::WebSocketClient::readCallback(const char * buffer, const size_t size,
184
184
// Выводим в лог сообщение
185
185
ws->log ->print (" %s" , log_t ::flag_t ::INFO, " authorization on the WebSocket server was successful" );
186
186
// Если функция обратного вызова установлена, выполняем
187
- if (ws->openStopFn != nullptr ) ws->openStopFn (true , ws);
187
+ if (ws->openStopFn != nullptr ) ws->openStopFn (true , ws, ws-> ctx . at ( 0 ) );
188
188
// Устанавливаем таймер на контроль подключения
189
189
ws->timerPing .setInterval ([ws]{
190
190
// Выполняем пинг сервера
@@ -210,6 +210,13 @@ void awh::WebSocketClient::readCallback(const char * buffer, const size_t size,
210
210
ws->code = query.code ;
211
211
// Создаём сообщение
212
212
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
+ }
213
220
// Выводим сообщение
214
221
ws->error (mess);
215
222
} break ;
@@ -286,7 +293,7 @@ void awh::WebSocketClient::readCallback(const char * buffer, const size_t size,
286
293
// Если ответом является PONG
287
294
case (uint8_t ) frame_t ::opcode_t ::PONG:
288
295
// Если функция обратного вызова обработки 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 ) );
290
297
break ;
291
298
// Если ответом является TEXT
292
299
case (uint8_t ) frame_t ::opcode_t ::TEXT:
@@ -434,8 +441,6 @@ void awh::WebSocketClient::readProxyCallback(const char * buffer, const size_t s
434
441
ws->code = 403 ;
435
442
// Присваиваем сообщению, новое значение кода
436
443
mess = ws->code ;
437
- // Устанавливаем сообщение ответа
438
- mess = ws->worker .proxy .http ->getMessage (ws->code );
439
444
} break ;
440
445
// Если запрос выполнен удачно
441
446
case (uint8_t ) http_t ::stath_t ::GOOD: {
@@ -446,6 +451,16 @@ void awh::WebSocketClient::readProxyCallback(const char * buffer, const size_t s
446
451
// Завершаем работу
447
452
return ;
448
453
} 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 ;
449
464
}
450
465
// Выводим сообщение
451
466
ws->error (mess);
@@ -474,7 +489,7 @@ void awh::WebSocketClient::error(const mess_t & message) const noexcept {
474
489
// Иначе выводим сообщение в упрощёном виде
475
490
else this ->log ->print (" %s [%u]" , log_t ::flag_t ::WARNING, message.text .c_str (), message.code );
476
491
// Если функция обратного вызова установлена, выводим полученное сообщение
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 ) );
478
493
}
479
494
}
480
495
/* *
@@ -518,19 +533,19 @@ void awh::WebSocketClient::extraction(const vector <char> & buffer, const bool u
518
533
// Выполняем шифрование переданных данных
519
534
const auto & res = this ->hash ->decrypt (data.data (), data.size ());
520
535
// Отправляем полученный результат
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 ) );
522
537
// Иначе выводим сообщение так - как оно пришло
523
- else this ->messageFn (data, utf8, const_cast <WebSocketClient *> (this ));
538
+ else this ->messageFn (data, utf8, const_cast <WebSocketClient *> (this ), this -> ctx . at ( 3 ) );
524
539
// Отправляем полученный результат
525
- } else this ->messageFn (data, utf8, const_cast <WebSocketClient *> (this ));
540
+ } else this ->messageFn (data, utf8, const_cast <WebSocketClient *> (this ), this -> ctx . at ( 3 ) );
526
541
// Выводим сообщение об ошибке
527
542
} else {
528
543
// Создаём сообщение
529
544
mess_t mess (1007 , " received data decompression error" );
530
545
// Выводим сообщение
531
546
this ->error (mess);
532
547
// Иначе выводим сообщение так - как оно пришло
533
- this ->messageFn (buffer, utf8, const_cast <WebSocketClient *> (this ));
548
+ this ->messageFn (buffer, utf8, const_cast <WebSocketClient *> (this ), this -> ctx . at ( 3 ) );
534
549
}
535
550
// Если функция обратного вызова установлена, выводим полученное сообщение
536
551
} else {
@@ -539,11 +554,11 @@ void awh::WebSocketClient::extraction(const vector <char> & buffer, const bool u
539
554
// Выполняем шифрование переданных данных
540
555
const auto & res = this ->hash ->decrypt (buffer.data (), buffer.size ());
541
556
// Отправляем полученный результат
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 ) );
543
558
// Иначе выводим сообщение так - как оно пришло
544
- else this ->messageFn (buffer, utf8, const_cast <WebSocketClient *> (this ));
559
+ else this ->messageFn (buffer, utf8, const_cast <WebSocketClient *> (this ), this -> ctx . at ( 3 ) );
545
560
// Отправляем полученный результат
546
- } else this ->messageFn (buffer, utf8, const_cast <WebSocketClient *> (this ));
561
+ } else this ->messageFn (buffer, utf8, const_cast <WebSocketClient *> (this ), this -> ctx . at ( 3 ) );
547
562
}
548
563
}
549
564
}
@@ -597,33 +612,45 @@ void awh::WebSocketClient::init(const string & url, const http_t::compress_t com
597
612
}
598
613
/* *
599
614
* on Метод установки функции обратного вызова на событие запуска или остановки подключения
615
+ * @param ctx контекст для вывода в сообщении
600
616
* @param callback функция обратного вызова
601
617
*/
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;
603
621
// Устанавливаем функцию запуска и остановки
604
622
this ->openStopFn = callback;
605
623
}
606
624
/* *
607
625
* on Метод установки функции обратного вызова на событие получения PONG
626
+ * @param ctx контекст для вывода в сообщении
608
627
* @param callback функция обратного вызова
609
628
*/
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;
611
632
// Устанавливаем функцию получения сообщений PONG
612
633
this ->pongFn = callback;
613
634
}
614
635
/* *
615
636
* on Метод установки функции обратного вызова на событие получения ошибок
637
+ * @param ctx контекст для вывода в сообщении
616
638
* @param callback функция обратного вызова
617
639
*/
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;
619
643
// Устанавливаем функцию получения ошибок
620
644
this ->errorFn = callback;
621
645
}
622
646
/* *
623
647
* on Метод установки функции обратного вызова на событие получения сообщений
648
+ * @param ctx контекст для вывода в сообщении
624
649
* @param callback функция обратного вызова
625
650
*/
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;
627
654
// Устанавливаем функцию получения сообщений с сервера
628
655
this ->messageFn = callback;
629
656
}
@@ -753,7 +780,7 @@ void awh::WebSocketClient::stop() noexcept {
753
780
// Если завершать работу запрещено, просто отключаемся
754
781
else ((core_t *) const_cast <coreCli_t *> (this ->core ))->close (this ->aid );
755
782
// Если функция обратного вызова установлена, выполняем
756
- if (this ->openStopFn != nullptr ) this ->openStopFn (false , this );
783
+ if (this ->openStopFn != nullptr ) this ->openStopFn (false , this , this -> ctx . at ( 0 ) );
757
784
}
758
785
}
759
786
/* *
@@ -767,10 +794,8 @@ void awh::WebSocketClient::pause() noexcept {
767
794
* start Метод запуска клиента
768
795
*/
769
796
void awh::WebSocketClient::start () noexcept {
770
- // Снимаем с паузы клиент
771
- this ->freeze = false ;
772
797
// Если адрес URL запроса передан
773
- if (!this ->worker .url .empty ()){
798
+ if (!this ->freeze && ! this -> worker .url .empty ()){
774
799
// Устанавливаем метод сжатия
775
800
this ->http ->setCompress (this ->compress );
776
801
// Если биндинг не запущен, выполняем запуск биндинга
@@ -780,6 +805,8 @@ void awh::WebSocketClient::start() noexcept {
780
805
// Выполняем запрос на сервер
781
806
else const_cast <coreCli_t *> (this ->core )->open (this ->worker .wid );
782
807
}
808
+ // Снимаем с паузы клиент
809
+ this ->freeze = false ;
783
810
}
784
811
/* *
785
812
* getSub Метод получения выбранного сабпротокола
0 commit comments