28
28
WebSocketsClient::WebSocketsClient () {
29
29
_cbEvent = NULL ;
30
30
_client.num = 0 ;
31
-
32
31
}
33
32
34
33
WebSocketsClient::~WebSocketsClient () {
@@ -42,7 +41,13 @@ void WebSocketsClient::begin(const char *host, uint16_t port, const char * url)
42
41
_host = host;
43
42
_port = port;
44
43
44
+ _client.num = 0 ;
45
45
_client.status = WSC_NOT_CONNECTED;
46
+ _client.tcp = NULL ;
47
+ #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
48
+ _client.isSSL = false ;
49
+ _client.ssl = NULL ;
50
+ #endif
46
51
_client.cUrl = url;
47
52
_client.cCode = 0 ;
48
53
_client.cIsUpgrade = false ;
@@ -53,8 +58,12 @@ void WebSocketsClient::begin(const char *host, uint16_t port, const char * url)
53
58
_client.cExtensions = " " ;
54
59
_client.cVersion = 0 ;
55
60
61
+ #ifdef ESP8266
62
+ randomSeed (RANDOM_REG32);
63
+ #else
56
64
// todo find better seed
57
65
randomSeed (millis ());
66
+ #endif
58
67
}
59
68
60
69
void WebSocketsClient::begin (String host, uint16_t port, String url) {
@@ -66,16 +75,44 @@ void WebSocketsClient::begin(String host, uint16_t port, String url) {
66
75
*/
67
76
void WebSocketsClient::loop (void ) {
68
77
if (!clientIsConnected (&_client)) {
69
- if (_client.tcp .connect (_host.c_str (), _port)) {
78
+
79
+ #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
80
+ if (_client.isSSL ) {
81
+ DEBUG_WEBSOCKETS (" [WS-Client] connect wss...\n " );
82
+ if (_client.ssl ) {
83
+ delete _client.ssl ;
84
+ _client.ssl = NULL ;
85
+ _client.tcp = NULL ;
86
+ }
87
+ _client.ssl = new WiFiClientSecure ();
88
+ _client.tcp = _client.ssl ;
89
+ } else {
90
+ DEBUG_WEBSOCKETS (" [WS-Client] connect ws...\n " );
91
+ if (_client.tcp ) {
92
+ delete _client.tcp ;
93
+ _client.tcp = NULL ;
94
+ }
95
+ _client.tcp = new WiFiClient ();
96
+ }
97
+ #else
98
+ _client.tcp = new WEBSOCKETS_NETWORK_CLASS ();
99
+ #endif
100
+
101
+ if (!_client.tcp ) {
102
+ DEBUG_WEBSOCKETS (" [WS-Client] creating Network class failed!" );
103
+ return ;
104
+ }
105
+
106
+ if (_client.tcp ->connect (_host.c_str (), _port)) {
70
107
DEBUG_WEBSOCKETS (" [WS-Client] connected to %s:%u.\n " , _host.c_str (), _port);
71
108
72
109
_client.status = WSC_HEADER;
73
110
74
111
// set Timeout for readBytesUntil and readStringUntil
75
- _client.tcp . setTimeout (WEBSOCKETS_TCP_TIMEOUT);
112
+ _client.tcp -> setTimeout (WEBSOCKETS_TCP_TIMEOUT);
76
113
77
- #ifdef ESP8266
78
- _client.tcp . setNoDelay (true );
114
+ #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
115
+ _client.tcp -> setNoDelay (true );
79
116
#endif
80
117
81
118
// send Header to Server
@@ -190,9 +227,25 @@ void WebSocketsClient::messageRecived(WSclient_t * client, WSopcode_t opcode, ui
190
227
*/
191
228
void WebSocketsClient::clientDisconnect (WSclient_t * client) {
192
229
230
+ #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
231
+ if (client->isSSL && client->ssl ) {
232
+ if (client->ssl ->connected ()) {
233
+ client->ssl ->flush ();
234
+ client->ssl ->stop ();
235
+ }
236
+ delete client->ssl ;
237
+ client->ssl = NULL ;
238
+ client->tcp = NULL ;
239
+ }
240
+ #endif
241
+
193
242
if (client->tcp ) {
194
- client->tcp .flush ();
195
- client->tcp .stop ();
243
+ if (client->tcp ->connected ()) {
244
+ client->tcp ->flush ();
245
+ client->tcp ->stop ();
246
+ }
247
+ delete client->tcp ;
248
+ client->tcp = NULL ;
196
249
}
197
250
198
251
client->cCode = 0 ;
@@ -218,7 +271,11 @@ void WebSocketsClient::clientDisconnect(WSclient_t * client) {
218
271
*/
219
272
bool WebSocketsClient::clientIsConnected (WSclient_t * client) {
220
273
221
- if (client->tcp .connected ()) {
274
+ if (!client->tcp ) {
275
+ return false ;
276
+ }
277
+
278
+ if (client->tcp ->connected ()) {
222
279
if (client->status != WSC_NOT_CONNECTED) {
223
280
return true ;
224
281
}
@@ -230,14 +287,20 @@ bool WebSocketsClient::clientIsConnected(WSclient_t * client) {
230
287
clientDisconnect (client);
231
288
}
232
289
}
290
+
291
+ if (client->tcp ) {
292
+ // do cleanup
293
+ clientDisconnect (client);
294
+ }
295
+
233
296
return false ;
234
297
}
235
298
236
299
/* *
237
300
* Handel incomming data from Client
238
301
*/
239
302
void WebSocketsClient::handleClientData (void ) {
240
- int len = _client.tcp . available ();
303
+ int len = _client.tcp -> available ();
241
304
if (len > 0 ) {
242
305
switch (_client.status ) {
243
306
case WSC_HEADER:
@@ -289,7 +352,7 @@ void WebSocketsClient::sendHeader(WSclient_t * client) {
289
352
290
353
handshake += " \r\n " ;
291
354
292
- client->tcp . write (handshake.c_str (), handshake.length ());
355
+ client->tcp -> write (handshake.c_str (), handshake.length ());
293
356
294
357
DEBUG_WEBSOCKETS (" [WS-Client][sendHeader] sending header... Done (%uus).\n " , (micros () - start));
295
358
@@ -301,7 +364,7 @@ void WebSocketsClient::sendHeader(WSclient_t * client) {
301
364
*/
302
365
void WebSocketsClient::handleHeader (WSclient_t * client) {
303
366
304
- String headerLine = client->tcp . readStringUntil (' \n ' );
367
+ String headerLine = client->tcp -> readStringUntil (' \n ' );
305
368
headerLine.trim (); // remove \r
306
369
307
370
if (headerLine.length () > 0 ) {
@@ -392,7 +455,7 @@ void WebSocketsClient::handleHeader(WSclient_t * client) {
392
455
393
456
} else {
394
457
DEBUG_WEBSOCKETS (" [WS-Client][handleHeader] no Websocket connection close.\n " );
395
- client->tcp . write (" This is a webSocket client!" );
458
+ client->tcp -> write (" This is a webSocket client!" );
396
459
clientDisconnect (client);
397
460
}
398
461
}
0 commit comments