diff --git a/README.md b/README.md index 6a6ebb8..5041cbf 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ a WebSocket Server and Client for Arduino based on RFC6455. This libary can run in Async TCP mode on the ESP. -The mode can be aktivated in the ```WebSockets.h``` (see WEBSOCKETS_NETWORK_TYPE define). +The mode can be activated in the ```WebSockets.h``` (see WEBSOCKETS_NETWORK_TYPE define). [ESPAsyncTCP](https://github.com/me-no-dev/ESPAsyncTCP) libary is required. diff --git a/examples/WebSocketClientSocketIO/WebSocketClientSocketIO.ino b/examples/WebSocketClientSocketIO/WebSocketClientSocketIO.ino index 6d08b02..9f54361 100644 --- a/examples/WebSocketClientSocketIO/WebSocketClientSocketIO.ino +++ b/examples/WebSocketClientSocketIO/WebSocketClientSocketIO.ino @@ -86,7 +86,7 @@ void setup() { delay(100); } - webSocket.begin("192.168.0.123", 81); + webSocket.beginSocketIO("192.168.0.123", 81); //webSocket.setAuthorization("user", "Password"); // HTTP Basic Authorization webSocket.onEvent(webSocketEvent); diff --git a/library.json b/library.json index c8a3b09..46de566 100644 --- a/library.json +++ b/library.json @@ -13,7 +13,7 @@ "type": "git", "url": "https://github.com/Links2004/arduinoWebSockets.git" }, - "version": "2.0.5", + "version": "2.0.6", "license": "LGPL-2.1", "export": { "exclude": [ diff --git a/library.properties b/library.properties index 0c5c9bd..0725e3f 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=WebSockets -version=2.0.5 +version=2.0.6 author=Markus Sattler maintainer=Markus Sattler sentence=WebSockets for Arduino (Server + Client) diff --git a/src/WebSockets.cpp b/src/WebSockets.cpp index 79d3dfc..3c3d69d 100644 --- a/src/WebSockets.cpp +++ b/src/WebSockets.cpp @@ -430,7 +430,7 @@ void WebSockets::handleWebsocketPayloadCb(WSclient_t * client, bool ok, uint8_t break; case WSop_ping: // send pong back - sendFrame(client, WSop_pong, payload, header->payloadLen); + sendFrame(client, WSop_pong, payload, header->payloadLen, true); break; case WSop_pong: DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get pong (%s)\n", client->num, payload); diff --git a/src/WebSocketsClient.cpp b/src/WebSocketsClient.cpp index 384d5a9..18c9f6c 100644 --- a/src/WebSocketsClient.cpp +++ b/src/WebSocketsClient.cpp @@ -63,6 +63,7 @@ void WebSocketsClient::begin(const char *host, uint16_t port, const char * url, _client.cVersion = 0; _client.base64Authorization = ""; _client.plainAuthorization = ""; + _client.isSocketIO = false; #ifdef ESP8266 randomSeed(RANDOM_REG32); @@ -207,6 +208,24 @@ bool WebSocketsClient::sendBIN(const uint8_t * payload, size_t length) { return sendBIN((uint8_t *) payload, length); } +/** + * sends a WS ping to Server + * @param payload uint8_t * + * @param length size_t + * @return true if ping is send out + */ +bool WebSocketsClient::sendPing(uint8_t * payload, size_t length) { + if(clientIsConnected(&_client)) { + return sendFrame(&_client, WSop_ping, payload, length, true); + } + return false; +} + +bool WebSocketsClient::sendPing(String & payload) { + return sendPing((uint8_t *) payload.c_str(), payload.length()); +} + + /** * disconnect one client * @param num uint8_t client id @@ -313,6 +332,7 @@ void WebSocketsClient::clientDisconnect(WSclient_t * client) { client->cVersion = 0; client->cIsUpgrade = false; client->cIsWebsocket = false; + client->cSessionId = ""; client->status = WSC_NOT_CONNECTED; @@ -411,8 +431,6 @@ void WebSocketsClient::sendHeader(WSclient_t * client) { "Host: " + _host + ":" + _port + "\r\n" "Connection: Upgrade\r\n" "Upgrade: websocket\r\n" - "Origin: file://\r\n" - "User-Agent: arduino-WebSocket-Client\r\n" "Sec-WebSocket-Version: 13\r\n" "Sec-WebSocket-Key: " + client->cKey + "\r\n"; @@ -426,11 +444,11 @@ void WebSocketsClient::sendHeader(WSclient_t * client) { } else { handshake = "GET " + client->cUrl + "&transport=polling HTTP/1.1\r\n" + "Host: " + _host + ":" + _port + "\r\n" "Connection: keep-alive\r\n"; } - handshake += "Host: " + _host + ":" + _port + "\r\n" - "Origin: file://\r\n" + handshake += "Origin: file://\r\n" "User-Agent: arduino-WebSocket-Client\r\n"; if(client->base64Authorization.length() > 0) { @@ -443,6 +461,7 @@ void WebSocketsClient::sendHeader(WSclient_t * client) { handshake += "\r\n"; + DEBUG_WEBSOCKETS("[WS-Client][sendHeader] handshake %s", (uint8_t*)handshake.c_str()); client->tcp->write((uint8_t*)handshake.c_str(), handshake.length()); #if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) @@ -489,7 +508,11 @@ void WebSocketsClient::handleHeader(WSclient_t * client, String * headerLine) { } else if(headerName.equalsIgnoreCase("Sec-WebSocket-Version")) { client->cVersion = headerValue.toInt(); } else if(headerName.equalsIgnoreCase("Set-Cookie")) { - client->cSessionId = headerValue.substring(headerValue.indexOf('=') + 1); + if (headerValue.indexOf("HttpOnly") > -1) { + client->cSessionId = headerValue.substring(headerValue.indexOf('=') + 1, headerValue.indexOf(";")); + } else { + client->cSessionId = headerValue.substring(headerValue.indexOf('=') + 1); + } } } else { DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header error (%s)\n", headerLine->c_str()); diff --git a/src/WebSocketsClient.h b/src/WebSocketsClient.h index f1db64f..bdbbb3b 100644 --- a/src/WebSocketsClient.h +++ b/src/WebSocketsClient.h @@ -68,6 +68,9 @@ class WebSocketsClient: private WebSockets { bool sendBIN(uint8_t * payload, size_t length, bool headerToPayload = false); bool sendBIN(const uint8_t * payload, size_t length); + bool sendPing(uint8_t * payload = NULL, size_t length = 0); + bool sendPing(String & payload); + void disconnect(void); void setAuthorization(const char * user, const char * password); diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp index 34ccf61..9e6037e 100644 --- a/src/WebSocketsServer.cpp +++ b/src/WebSocketsServer.cpp @@ -283,6 +283,57 @@ bool WebSocketsServer::broadcastBIN(const uint8_t * payload, size_t length) { return broadcastBIN((uint8_t *) payload, length); } + +/** + * sends a WS ping to Client + * @param num uint8_t client id + * @param payload uint8_t * + * @param length size_t + * @return true if ping is send out + */ +bool WebSocketsServer::sendPing(uint8_t num, uint8_t * payload, size_t length) { + if(num >= WEBSOCKETS_SERVER_CLIENT_MAX) { + return false; + } + WSclient_t * client = &_clients[num]; + if(clientIsConnected(client)) { + return sendFrame(client, WSop_ping, payload, length); + } + return false; +} + +bool WebSocketsServer::sendPing(uint8_t num, String & payload) { + return sendPing(num, (uint8_t *) payload.c_str(), payload.length()); +} + +/** + * sends a WS ping to all Client + * @param payload uint8_t * + * @param length size_t + * @return true if ping is send out + */ +bool WebSocketsServer::broadcastPing(uint8_t * payload, size_t length) { + WSclient_t * client; + bool ret = true; + for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { + client = &_clients[i]; + if(clientIsConnected(client)) { + if(!sendFrame(client, WSop_ping, payload, length)) { + ret = false; + } + } +#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) + delay(0); +#endif + } + return ret; +} + +bool WebSocketsServer::broadcastPing(String & payload) { + return broadcastPing((uint8_t *) payload.c_str(), payload.length()); +} + + /** * disconnect all clients */ diff --git a/src/WebSocketsServer.h b/src/WebSocketsServer.h index 8bf9496..33037ed 100644 --- a/src/WebSocketsServer.h +++ b/src/WebSocketsServer.h @@ -32,7 +32,7 @@ -class WebSocketsServer: private WebSockets { +class WebSocketsServer: protected WebSockets { public: #ifdef __AVR__ @@ -80,6 +80,12 @@ public: bool broadcastBIN(uint8_t * payload, size_t length, bool headerToPayload = false); bool broadcastBIN(const uint8_t * payload, size_t length); + bool sendPing(uint8_t num, uint8_t * payload = NULL, size_t length = 0); + bool sendPing(uint8_t num, String & payload); + + bool broadcastPing(uint8_t * payload = NULL, size_t length = 0); + bool broadcastPing(String & payload); + void disconnect(void); void disconnect(uint8_t num);