@@ -38,7 +38,7 @@ extern "C" {
3838 * @param reasonLen
3939 */
4040void 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);
4242 if (client->status == WSC_CONNECTED && code) {
4343 if (reason) {
4444 sendFrame (client, WSop_close, (uint8_t *) reason, reasonLen);
@@ -59,22 +59,36 @@ void WebSockets::clientDisconnect(WSclient_t * client, uint16_t code, char * rea
5959 * @param payload uint8_t *
6060 * @param length size_t
6161 */
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+ }
6370
6471 if (!client->tcp .connected ()) {
72+ DEBUG_WEBSOCKETS (" [WS][%d][sendFrame] not Connected!?\n " , client->num );
6573 return ;
6674 }
6775
76+ uint8_t maskKey[4 ] = { 0 };
6877 uint8_t buffer[16 ] = { 0 };
6978 uint8_t i = 0 ;
7079
7180 // create header
81+ buffer[i] = bit (7 ); // set Fin
82+ buffer[i++] |= opcode; // set opcode
7283
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+ }
7589
7690 if (length < 126 ) {
77- buffer[i++] = length;
91+ buffer[i++] | = length;
7892
7993 } else if (length < 0xFFFF ) {
8094 buffer[i++] = 126 ;
@@ -93,6 +107,20 @@ void WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * pay
93107 buffer[i++] = (length & 0xFF );
94108 }
95109
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+
96124 // send header
97125 client->tcp .write (&buffer[0 ], i);
98126
@@ -123,7 +151,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
123151
124152 uint8_t * payload = NULL ;
125153
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 );
127155
128156 if (!readWait (client, buffer, 2 )) {
129157 // timeout
@@ -164,11 +192,11 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
164192 }
165193 }
166194
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);
169197
170198 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);
172200 clientDisconnect (client, 1009 );
173201 return ;
174202 }
@@ -182,13 +210,13 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
182210 payload = (uint8_t *) malloc (payloadLen + 1 );
183211
184212 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);
186214 clientDisconnect (client, 1011 );
187215 return ;
188216 }
189217
190218 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 );
192220 free (payload);
193221 clientDisconnect (client, 1002 );
194222 return ;
@@ -206,7 +234,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
206234
207235 switch (opCode) {
208236 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);
210238 // no break here!
211239 case WSop_binary:
212240 messageRecived (client, opCode, payload, payloadLen);
@@ -216,7 +244,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
216244 sendFrame (client, WSop_pong, payload, payloadLen);
217245 break ;
218246 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);
220248 break ;
221249 case WSop_close:
222250 {
@@ -225,9 +253,9 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
225253 reasonCode = payload[0 ] << 8 | payload[1 ];
226254 }
227255
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);
229257 if (payloadLen > 2 ) {
230- DEBUG_WEBSOCKETS (" (%s)\n " , (payload+2 ));
258+ DEBUG_WEBSOCKETS (" (%s)\n " , (payload+2 ));
231259 } else {
232260 DEBUG_WEBSOCKETS (" \n " );
233261 }
@@ -271,8 +299,8 @@ String WebSockets::acceptKey(String clientKey) {
271299 * @return base64 encoded String
272300 */
273301String 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 );
276304 if (buffer) {
277305 base64_encodestate _state;
278306 base64_init_encodestate (&_state);
@@ -283,7 +311,7 @@ String WebSockets::base64_encode(uint8_t * data, size_t length) {
283311 free (buffer);
284312 return base64;
285313 }
286- return " -FAIL-" ;
314+ return String ( " -FAIL-" ) ;
287315}
288316
289317/* *
0 commit comments