Skip to content

Commit 27a9a22

Browse files
committed
create overloaded functions for send and broadcast for easy usage
void sendTXT(uint8_t num, uint8_t * payload, size_t length = 0); void sendTXT(uint8_t num, const uint8_t * payload, size_t length = 0); void sendTXT(uint8_t num, char * payload, size_t length = 0); void sendTXT(uint8_t num, const char * payload, size_t length = 0); void sendTXT(uint8_t num, String payload); void broadcastTXT(uint8_t * payload, size_t length = 0); void broadcastTXT(const uint8_t * payload, size_t length = 0); void broadcastTXT(char * payload, size_t length = 0); void broadcastTXT(const char * payload, size_t length = 0); void broadcastTXT(String payload); void sendBIN(uint8_t num, uint8_t * payload, size_t length); void sendBIN(uint8_t num, const uint8_t * payload, size_t length); void broadcastBIN(uint8_t * payload, size_t length); void broadcastBIN(const uint8_t * payload, size_t length); send URL as payload on WStype_CONNECTED event move Sec-WebSocket-Accept generation in function
1 parent 2af71ab commit 27a9a22

File tree

5 files changed

+105
-29
lines changed

5 files changed

+105
-29
lines changed

src/WebSockets.cpp

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@
2424

2525
#include "WebSockets.h"
2626

27+
extern "C" {
28+
#include "libb64/cencode.h"
29+
}
30+
31+
#include <Hash.h>
32+
2733
/**
2834
*
2935
* @param client WSclient_t * ptr to the client struct
@@ -195,8 +201,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
195201

196202
switch(opCode) {
197203
case WSop_text:
198-
DEBUG_WEBSOCKETS("[WS-Server][%d][handleWebsocket] text: %s\n", client->num, payload)
199-
;
204+
DEBUG_WEBSOCKETS("[WS-Server][%d][handleWebsocket] text: %s\n", client->num, payload);
200205
// no break here!
201206
case WSop_binary:
202207
messageRecived(client, opCode, payload, payloadLen);
@@ -206,8 +211,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
206211
sendFrame(client, WSop_pong, payload, payloadLen);
207212
break;
208213
case WSop_pong:
209-
DEBUG_WEBSOCKETS("[WS-Server][%d][handleWebsocket] get pong from Client (%s)\n", client->num, payload)
210-
;
214+
DEBUG_WEBSOCKETS("[WS-Server][%d][handleWebsocket] get pong from Client (%s)\n", client->num, payload);
211215
break;
212216
case WSop_close:
213217
{
@@ -240,6 +244,43 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
240244

241245
}
242246

247+
/**
248+
* generate the key for Sec-WebSocket-Accept
249+
* @param clientKey String
250+
* @return String Accept Key
251+
*/
252+
String WebSockets::acceptKey(String clientKey) {
253+
uint8_t sha1HashBin[20] = { 0 };
254+
sha1(clientKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", &sha1HashBin[0]);
255+
256+
String key = base64_encode(sha1HashBin, 20);
257+
key.trim();
258+
259+
return key;
260+
}
261+
262+
/**
263+
* base64_encode
264+
* @param data uint8_t *
265+
* @param length size_t
266+
* @return base64 encoded String
267+
*/
268+
String WebSockets::base64_encode(uint8_t * data, size_t length) {
269+
270+
char * buffer = (char *) malloc((length*1.4)+1);
271+
if(buffer) {
272+
base64_encodestate _state;
273+
base64_init_encodestate(&_state);
274+
int len = base64_encode_block((const char *) &data[0], length, &buffer[0], &_state);
275+
len = base64_encode_blockend((buffer + len), &_state);
276+
277+
String base64 = String(buffer);
278+
free(buffer);
279+
return base64;
280+
}
281+
return "-FAIL-";
282+
}
283+
243284
/**
244285
* read x byte from tcp or get timeout
245286
* @param client WSclient_t *

src/WebSockets.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ class WebSockets {
104104
void handleWebsocket(WSclient_t * client);
105105

106106
bool readWait(WSclient_t * client, uint8_t *out, size_t n);
107+
108+
String acceptKey(String clientKey);
109+
String base64_encode(uint8_t * data, size_t length);
107110
};
108111

109112
#endif /* WEBSOCKETS_H_ */

src/WebSocketsServer.cpp

Lines changed: 44 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,6 @@
2525
#include "WebSockets.h"
2626
#include "WebSocketsServer.h"
2727

28-
extern "C" {
29-
#include "libb64/cencode.h"
30-
}
31-
32-
#include <Hash.h>
33-
3428
WebSocketsServer::WebSocketsServer(uint16_t port) {
3529
_port = port;
3630
_server = new WiFiServer(port);
@@ -95,12 +89,27 @@ void WebSocketsServer::sendTXT(uint8_t num, uint8_t * payload, size_t length) {
9589
if(num >= WEBSOCKETS_SERVER_CLIENT_MAX) {
9690
return;
9791
}
92+
if(length == 0) {
93+
length = strlen((const char *) payload);
94+
}
9895
WSclient_t * client = &_clients[num];
9996
if(clientIsConnected(client)) {
10097
sendFrame(client, WSop_text, payload, length);
10198
}
10299
}
103100

101+
void WebSocketsServer::sendTXT(uint8_t num, const uint8_t * payload, size_t length) {
102+
sendTXT(num, (uint8_t *) payload, length);
103+
}
104+
105+
void WebSocketsServer::sendTXT(uint8_t num, char * payload, size_t length) {
106+
sendTXT(num, (uint8_t *) payload, length);
107+
}
108+
109+
void WebSocketsServer::sendTXT(uint8_t num, const char * payload, size_t length) {
110+
sendTXT(num, (uint8_t *) payload, length);
111+
}
112+
104113
void WebSocketsServer::sendTXT(uint8_t num, String payload) {
105114
sendTXT(num, (uint8_t *) payload.c_str(), payload.length());
106115
}
@@ -112,6 +121,9 @@ void WebSocketsServer::sendTXT(uint8_t num, String payload) {
112121
*/
113122
void WebSocketsServer::broadcastTXT(uint8_t * payload, size_t length) {
114123
WSclient_t * client;
124+
if(length == 0) {
125+
length = strlen((const char *) payload);
126+
}
115127
for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) {
116128
client = &_clients[i];
117129
if(clientIsConnected(client)) {
@@ -120,6 +132,18 @@ void WebSocketsServer::broadcastTXT(uint8_t * payload, size_t length) {
120132
}
121133
}
122134

135+
void WebSocketsServer::broadcastTXT(const uint8_t * payload, size_t length) {
136+
broadcastTXT((uint8_t *) payload, length);
137+
}
138+
139+
void WebSocketsServer::broadcastTXT(char * payload, size_t length) {
140+
broadcastTXT((uint8_t *) payload, length);
141+
}
142+
143+
void WebSocketsServer::broadcastTXT(const char * payload, size_t length) {
144+
broadcastTXT((uint8_t *) payload, length);
145+
}
146+
123147
void WebSocketsServer::broadcastTXT(String payload) {
124148
broadcastTXT((uint8_t *) payload.c_str(), payload.length());
125149
}
@@ -140,6 +164,10 @@ void WebSocketsServer::sendBIN(uint8_t num, uint8_t * payload, size_t length) {
140164
}
141165
}
142166

167+
void WebSocketsServer::sendBIN(uint8_t num, const uint8_t * payload, size_t length) {
168+
sendBIN(num, (uint8_t *) payload, length);
169+
}
170+
143171
/**
144172
* send binary data to client all
145173
* @param payload uint8_t *
@@ -155,6 +183,10 @@ void WebSocketsServer::broadcastBIN(uint8_t * payload, size_t length) {
155183
}
156184
}
157185

186+
void WebSocketsServer::broadcastBIN(const uint8_t * payload, size_t length) {
187+
broadcastBIN((uint8_t *) payload, length);
188+
}
189+
158190
//#################################################################################
159191
//#################################################################################
160192
//#################################################################################
@@ -289,7 +321,7 @@ void WebSocketsServer::handleClientData(void) {
289321
WebSockets::handleWebsocket(client);
290322
break;
291323
default:
292-
clientDisconnect(client);
324+
WebSockets::clientDisconnect(client, 1002);
293325
break;
294326
}
295327
}
@@ -363,19 +395,7 @@ void WebSocketsServer::handleHeader(WSclient_t * client) {
363395
DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] Websocket connection incomming.\n", client->num);
364396

365397
// generate Sec-WebSocket-Accept key
366-
uint8_t sha1HashBin[20] = { 0 };
367-
sha1(client->cKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", &sha1HashBin[0]);
368-
369-
char sha1Base64[64] = { 0 };
370-
int len = 0;
371-
372-
base64_encodestate _state;
373-
base64_init_encodestate(&_state);
374-
len = base64_encode_block((const char *) &sha1HashBin[0], 20, &sha1Base64[0], &_state);
375-
base64_encode_blockend((sha1Base64 + len), &_state);
376-
377-
client->sKey = sha1Base64;
378-
client->sKey.trim();
398+
client->sKey = acceptKey(client->cKey);
379399

380400
DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - sKey: %s\n", client->num, client->sKey.c_str());
381401

@@ -398,8 +418,11 @@ void WebSocketsServer::handleHeader(WSclient_t * client) {
398418
// header end
399419
client->tcp.write("\r\n");
400420

421+
// send ping
422+
WebSockets::sendFrame(client, WSop_ping);
423+
401424
if(_cbEvent) {
402-
_cbEvent(client->num, WStype_CONNECTED, NULL, 0);
425+
_cbEvent(client->num, WStype_CONNECTED, (uint8_t *)client->cUrl.c_str(), client->cUrl.length());
403426
}
404427

405428
} else {

src/WebSocketsServer.h

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,23 @@ class WebSocketsServer: private WebSockets {
6565
void onEvent(WebSocketServerEvent cbEvent);
6666

6767

68-
void sendTXT(uint8_t num, uint8_t * payload, size_t length);
69-
void broadcastTXT(uint8_t * payload, size_t length);
70-
68+
void sendTXT(uint8_t num, uint8_t * payload, size_t length = 0);
69+
void sendTXT(uint8_t num, const uint8_t * payload, size_t length = 0);
70+
void sendTXT(uint8_t num, char * payload, size_t length = 0);
71+
void sendTXT(uint8_t num, const char * payload, size_t length = 0);
7172
void sendTXT(uint8_t num, String payload);
73+
74+
void broadcastTXT(uint8_t * payload, size_t length = 0);
75+
void broadcastTXT(const uint8_t * payload, size_t length = 0);
76+
void broadcastTXT(char * payload, size_t length = 0);
77+
void broadcastTXT(const char * payload, size_t length = 0);
7278
void broadcastTXT(String payload);
7379

7480
void sendBIN(uint8_t num, uint8_t * payload, size_t length);
81+
void sendBIN(uint8_t num, const uint8_t * payload, size_t length);
82+
7583
void broadcastBIN(uint8_t * payload, size_t length);
84+
void broadcastBIN(const uint8_t * payload, size_t length);
7685

7786
private:
7887
uint16_t _port;

src/libb64/cencode.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ int base64_encode_blockend(char* code_out, base64_encodestate* state_in)
102102
case step_A:
103103
break;
104104
}
105-
*codechar++ = '\n';
105+
*codechar++ = 0x00;
106106

107107
return codechar - code_out;
108108
}

0 commit comments

Comments
 (0)