diff --git a/examples/WebSocketsServer/WebSocketsServer.ino b/examples/WebSocketsServer/WebSocketsServer.ino index c0895ca..a4d4848 100644 --- a/examples/WebSocketsServer/WebSocketsServer.ino +++ b/examples/WebSocketsServer/WebSocketsServer.ino @@ -10,7 +10,7 @@ #include #include #include -#include +#include ESP8266WiFiMulti WiFiMulti; diff --git a/src/WebSockets.cpp b/src/WebSockets.cpp index 295c6f0..9f4358a 100644 --- a/src/WebSockets.cpp +++ b/src/WebSockets.cpp @@ -33,7 +33,14 @@ */ void WebSockets::clientDisconnect(WSclient_t * client, uint16_t code, char * reason, size_t reasonLen) { if(client->status == WSC_CONNECTED && code) { - sendFrame(client, WSop_close, (uint8_t *) reason, reasonLen); + if(reason) { + sendFrame(client, WSop_close, (uint8_t *) reason, reasonLen); + } else { + uint8_t buffer[2]; + buffer[0] = ((code >> 8) & 0xFF); + buffer[1] = (code & 0xFF); + sendFrame(client, WSop_close, &buffer[0], 2); + } } clientDisconnect(client); } @@ -171,6 +178,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) { if(!readWait(client, payload, payloadLen)) { DEBUG_WEBSOCKETS("[WS-Server][%d][handleWebsocket] missing data!\n", client->num); + free(payload); clientDisconnect(client, 1002); return; } @@ -183,36 +191,51 @@ void WebSockets::handleWebsocket(WSclient_t * client) { payload[i] = (payload[i] ^ maskKey[i % 4]); } } + } - switch(opCode) { - case WSop_text: - DEBUG_WEBSOCKETS("[WS-Server][%d][handleWebsocket] text: %s\n", client->num, payload); - // no break here! - case WSop_binary: - messageRecived(client, opCode, payload, payloadLen); - break; - case WSop_ping: - // send pong back - sendFrame(client, WSop_pong, payload, payloadLen); - break; - case WSop_pong: - DEBUG_WEBSOCKETS("[WS-Server][%d][handleWebsocket] get pong from Client (%s)\n", client->num, payload); - break; - case WSop_close: - { - uint16_t reasonCode = buffer[0] << 8 | buffer[1]; - DEBUG_WEBSOCKETS("[WS-Server][%d][handleWebsocket] client ask for close. Code: %d (%s)\n", client->num, reasonCode, (payload + 2)); - clientDisconnect(client, 1000); + switch(opCode) { + case WSop_text: + DEBUG_WEBSOCKETS("[WS-Server][%d][handleWebsocket] text: %s\n", client->num, payload) + ; + // no break here! + case WSop_binary: + messageRecived(client, opCode, payload, payloadLen); + break; + case WSop_ping: + // send pong back + sendFrame(client, WSop_pong, payload, payloadLen); + break; + case WSop_pong: + DEBUG_WEBSOCKETS("[WS-Server][%d][handleWebsocket] get pong from Client (%s)\n", client->num, payload) + ; + break; + case WSop_close: + { + uint16_t reasonCode = 1000; + if(payloadLen >= 2) { + reasonCode = payload[0] << 8 | payload[1]; } - break; - case WSop_continuation: - // continuation is not supported - clientDisconnect(client, 1003); - break; - default: - clientDisconnect(client, 1002); - break; - } + + DEBUG_WEBSOCKETS("[WS-Server][%d][handleWebsocket] client ask for close. Code: %d", client->num, reasonCode); + if(payloadLen > 2) { + DEBUG_WEBSOCKETS("(%s)\n", (payload+2)); + } else { + DEBUG_WEBSOCKETS("\n"); + } + clientDisconnect(client, 1000); + } + break; + case WSop_continuation: + // continuation is not supported + clientDisconnect(client, 1003); + break; + default: + clientDisconnect(client, 1002); + break; + } + + if(payload) { + free(payload); } } diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp index 5048f8d..0582350 100644 --- a/src/WebSocketsServer.cpp +++ b/src/WebSocketsServer.cpp @@ -102,7 +102,7 @@ void WebSocketsServer::sendTXT(uint8_t num, uint8_t * payload, size_t length) { } void WebSocketsServer::sendTXT(uint8_t num, String payload) { - sendTXT(num, (uint8_t *)payload.c_str(), payload.length()); + sendTXT(num, (uint8_t *) payload.c_str(), payload.length()); } /** @@ -120,9 +120,8 @@ void WebSocketsServer::broadcastTXT(uint8_t * payload, size_t length) { } } - void WebSocketsServer::broadcastTXT(String payload) { - broadcastTXT((uint8_t *)payload.c_str(), payload.length()); + broadcastTXT((uint8_t *) payload.c_str(), payload.length()); } /** @@ -311,7 +310,7 @@ void WebSocketsServer::handleHeader(WSclient_t * client) { if(headerLine.length() > 0) { DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] RX: %s\n", client->num, headerLine.c_str()); - // websocket request starts allway with GET see rfc6455 + // websocket request starts allways with GET see rfc6455 if(headerLine.startsWith("GET ")) { // cut URL out client->cUrl = headerLine.substring(4, headerLine.indexOf(' ', 4)); @@ -337,7 +336,13 @@ void WebSocketsServer::handleHeader(WSclient_t * client) { } else { DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] Header read fin.\n", client->num); - DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cURL: %s\n", client->num, client->cUrl.c_str());DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cIsUpgrade: %d\n", client->num, client->cIsUpgrade);DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cIsWebsocket: %d\n", client->num, client->cIsWebsocket);DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cKey: %s\n", client->num, client->cKey.c_str());DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cProtocol: %s\n", client->num, client->cProtocol.c_str());DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cExtensions: %s\n", client->num, client->cExtensions.c_str());DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cVersion: %d\n", client->num, client->cVersion); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cURL: %s\n", client->num, client->cUrl.c_str()); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cIsUpgrade: %d\n", client->num, client->cIsUpgrade); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cIsWebsocket: %d\n", client->num, client->cIsWebsocket); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cKey: %s\n", client->num, client->cKey.c_str()); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cProtocol: %s\n", client->num, client->cProtocol.c_str()); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cExtensions: %s\n", client->num, client->cExtensions.c_str()); + DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] - cVersion: %d\n", client->num, client->cVersion); bool ok = (client->cIsUpgrade && client->cIsWebsocket);