@@ -38,7 +38,7 @@ extern "C" {
38
38
* @param reasonLen
39
39
*/
40
40
void WebSockets::clientDisconnect (WSclient_t * client, uint16_t code, char * reason, size_t reasonLen) {
41
- DEBUG_WEBSOCKETS (" [WS-Server ][%d][handleWebsocket] clientDisconnect code: %u\n " , client->num , code);
41
+ DEBUG_WEBSOCKETS (" [WS][%d][handleWebsocket] clientDisconnect code: %u\n " , client->num , code);
42
42
if (client->status == WSC_CONNECTED && code) {
43
43
if (reason) {
44
44
sendFrame (client, WSop_close, (uint8_t *) reason, reasonLen);
@@ -59,22 +59,36 @@ void WebSockets::clientDisconnect(WSclient_t * client, uint16_t code, char * rea
59
59
* @param payload uint8_t *
60
60
* @param length size_t
61
61
*/
62
- void WebSockets::sendFrame (WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length) {
62
+ void WebSockets::sendFrame (WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool mask) {
63
+
64
+ DEBUG_WEBSOCKETS (" [WS][%d][sendFrame] ------- send massage frame -------\n " , client->num );
65
+ DEBUG_WEBSOCKETS (" [WS][%d][sendFrame] opCode: %u mask: %u length: %u\n " , client->num , opcode, mask, length);
66
+
67
+ if (opcode == WSop_text) {
68
+ DEBUG_WEBSOCKETS (" [WS][%d][sendFrame] text: %s\n " , client->num , payload);
69
+ }
63
70
64
71
if (!client->tcp .connected ()) {
72
+ DEBUG_WEBSOCKETS (" [WS][%d][sendFrame] not Connected!?\n " , client->num );
65
73
return ;
66
74
}
67
75
76
+ uint8_t maskKey[4 ] = { 0 };
68
77
uint8_t buffer[16 ] = { 0 };
69
78
uint8_t i = 0 ;
70
79
71
80
// create header
81
+ buffer[i] = bit (7 ); // set Fin
82
+ buffer[i++] |= opcode; // set opcode
72
83
73
- buffer[i] = bit (7 ); // set Fin
74
- buffer[i++] |= opcode; // set opcode
84
+ buffer[i] = 0x00 ;
85
+
86
+ if (mask) {
87
+ buffer[i] |= bit (7 ); // set mask
88
+ }
75
89
76
90
if (length < 126 ) {
77
- buffer[i++] = length;
91
+ buffer[i++] | = length;
78
92
79
93
} else if (length < 0xFFFF ) {
80
94
buffer[i++] = 126 ;
@@ -93,6 +107,20 @@ void WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * pay
93
107
buffer[i++] = (length & 0xFF );
94
108
}
95
109
110
+ if (mask) {
111
+ // todo generate random mask key
112
+ for (uint8_t x = 0 ; x < sizeof (maskKey); x++) {
113
+ // maskKey[x] = random(0xFF);
114
+ maskKey[x] = 0x00 ; // fake xor (0x00 0x00 0x00 0x00)
115
+ buffer[i++] = maskKey[x];
116
+ }
117
+
118
+ // todo encode XOR
119
+ // for(size_t x = 0; x < length; x++) {
120
+ // payload[x] = (payload[x] ^ maskKey[x % 4]);
121
+ // }
122
+ }
123
+
96
124
// send header
97
125
client->tcp .write (&buffer[0 ], i);
98
126
@@ -123,7 +151,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
123
151
124
152
uint8_t * payload = NULL ;
125
153
126
- DEBUG_WEBSOCKETS (" [WS-Server ][%d][handleWebsocket] ------- read massage frame -------\n " , client->num );
154
+ DEBUG_WEBSOCKETS (" [WS][%d][handleWebsocket] ------- read massage frame -------\n " , client->num );
127
155
128
156
if (!readWait (client, buffer, 2 )) {
129
157
// timeout
@@ -164,11 +192,11 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
164
192
}
165
193
}
166
194
167
- DEBUG_WEBSOCKETS (" [WS-Server ][%d][handleWebsocket] fin: %u rsv1: %u rsv2: %u rsv3 %u opCode: %u\n " , client->num , fin, rsv1, rsv2, rsv3, opCode);
168
- DEBUG_WEBSOCKETS (" [WS-Server ][%d][handleWebsocket] mask: %u payloadLen: %u\n " , client->num , mask, payloadLen);
195
+ DEBUG_WEBSOCKETS (" [WS][%d][handleWebsocket] fin: %u rsv1: %u rsv2: %u rsv3 %u opCode: %u\n " , client->num , fin, rsv1, rsv2, rsv3, opCode);
196
+ DEBUG_WEBSOCKETS (" [WS][%d][handleWebsocket] mask: %u payloadLen: %u\n " , client->num , mask, payloadLen);
169
197
170
198
if (payloadLen > WEBSOCKETS_MAX_DATA_SIZE) {
171
- DEBUG_WEBSOCKETS (" [WS-Server ][%d][handleWebsocket] payload to big! (%u)\n " , client->num , payloadLen);
199
+ DEBUG_WEBSOCKETS (" [WS][%d][handleWebsocket] payload to big! (%u)\n " , client->num , payloadLen);
172
200
clientDisconnect (client, 1009 );
173
201
return ;
174
202
}
@@ -182,13 +210,13 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
182
210
payload = (uint8_t *) malloc (payloadLen + 1 );
183
211
184
212
if (!payload) {
185
- DEBUG_WEBSOCKETS (" [WS-Server ][%d][handleWebsocket] to less memory to handle payload %d!\n " , client->num , payloadLen);
213
+ DEBUG_WEBSOCKETS (" [WS][%d][handleWebsocket] to less memory to handle payload %d!\n " , client->num , payloadLen);
186
214
clientDisconnect (client, 1011 );
187
215
return ;
188
216
}
189
217
190
218
if (!readWait (client, payload, payloadLen)) {
191
- DEBUG_WEBSOCKETS (" [WS-Server ][%d][handleWebsocket] missing data!\n " , client->num );
219
+ DEBUG_WEBSOCKETS (" [WS][%d][handleWebsocket] missing data!\n " , client->num );
192
220
free (payload);
193
221
clientDisconnect (client, 1002 );
194
222
return ;
@@ -206,7 +234,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
206
234
207
235
switch (opCode) {
208
236
case WSop_text:
209
- DEBUG_WEBSOCKETS (" [WS-Server ][%d][handleWebsocket] text: %s\n " , client->num , payload);
237
+ DEBUG_WEBSOCKETS (" [WS][%d][handleWebsocket] text: %s\n " , client->num , payload);
210
238
// no break here!
211
239
case WSop_binary:
212
240
messageRecived (client, opCode, payload, payloadLen);
@@ -216,7 +244,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
216
244
sendFrame (client, WSop_pong, payload, payloadLen);
217
245
break ;
218
246
case WSop_pong:
219
- DEBUG_WEBSOCKETS (" [WS-Server ][%d][handleWebsocket] get pong from Client (%s)\n " , client->num , payload);
247
+ DEBUG_WEBSOCKETS (" [WS][%d][handleWebsocket] get pong (%s)\n " , client->num , payload);
220
248
break ;
221
249
case WSop_close:
222
250
{
@@ -225,9 +253,9 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
225
253
reasonCode = payload[0 ] << 8 | payload[1 ];
226
254
}
227
255
228
- DEBUG_WEBSOCKETS (" [WS-Server ][%d][handleWebsocket] client ask for close. Code: %d" , client->num , reasonCode);
256
+ DEBUG_WEBSOCKETS (" [WS][%d][handleWebsocket] get ask for close. Code: %d" , client->num , reasonCode);
229
257
if (payloadLen > 2 ) {
230
- DEBUG_WEBSOCKETS (" (%s)\n " , (payload+2 ));
258
+ DEBUG_WEBSOCKETS (" (%s)\n " , (payload+2 ));
231
259
} else {
232
260
DEBUG_WEBSOCKETS (" \n " );
233
261
}
@@ -271,8 +299,8 @@ String WebSockets::acceptKey(String clientKey) {
271
299
* @return base64 encoded String
272
300
*/
273
301
String WebSockets::base64_encode (uint8_t * data, size_t length) {
274
-
275
- char * buffer = (char *) malloc ((length* 1.4 )+ 1 );
302
+ size_t size = ((length* 1 . 6f )+ 1 );
303
+ char * buffer = (char *) malloc (size );
276
304
if (buffer) {
277
305
base64_encodestate _state;
278
306
base64_init_encodestate (&_state);
@@ -283,7 +311,7 @@ String WebSockets::base64_encode(uint8_t * data, size_t length) {
283
311
free (buffer);
284
312
return base64;
285
313
}
286
- return " -FAIL-" ;
314
+ return String ( " -FAIL-" ) ;
287
315
}
288
316
289
317
/* *
0 commit comments