@@ -221,14 +221,16 @@ size_t AsyncWebSocketMessage::send(AsyncClient *client) {
221221const char *AWSC_PING_PAYLOAD = " ESPAsyncWebServer-PING" ;
222222const size_t AWSC_PING_PAYLOAD_LEN = 22 ;
223223
224- AsyncWebSocketClient::AsyncWebSocketClient (AsyncWebServerRequest *request, AsyncWebSocket *server) : _tempObject(NULL ) {
225- _client = request->client ();
226- _server = server;
227- _clientId = _server->_getNextId ();
228- _status = WS_CONNECTED;
229- _pstate = 0 ;
230- _lastMessageTime = millis ();
231- _keepAlivePeriod = 0 ;
224+ AsyncWebSocketClient::AsyncWebSocketClient (AsyncClient *client, AsyncWebSocket *server)
225+ : _client(client),
226+ _server(server),
227+ _clientId(_server->_getNextId ()),
228+ _status(WS_CONNECTED),
229+ _pstate(0 ),
230+ _lastMessageTime(millis()),
231+ _keepAlivePeriod(0 ),
232+ _tempObject(NULL ) {
233+
232234 _client->setRxTimeout (0 );
233235 _client->onError (
234236 [](void *r, AsyncClient *c, int8_t error) {
@@ -272,7 +274,6 @@ AsyncWebSocketClient::AsyncWebSocketClient(AsyncWebServerRequest *request, Async
272274 },
273275 this
274276 );
275- delete request;
276277 memset (&_pinfo, 0 , sizeof (_pinfo));
277278}
278279
@@ -806,7 +807,9 @@ void AsyncWebSocket::_handleEvent(AsyncWebSocketClient *client, AwsEventType typ
806807
807808AsyncWebSocketClient *AsyncWebSocket::_newClient (AsyncWebServerRequest *request) {
808809 _clients.emplace_back (request, this );
809- _handleEvent (&_clients.back (), WS_EVT_CONNECT, request, NULL , 0 );
810+ // we've just detached AsyncTCP client from AsyncWebServerRequest,
811+ // *request was destructed along with response object in AsyncWebSocketClient's c-tor
812+ _handleEvent (&_clients.back (), WS_EVT_CONNECT, nullptr /* request */ , NULL , 0 );
810813 return &_clients.back ();
811814}
812815
@@ -1243,8 +1246,7 @@ AsyncWebSocketMessageBuffer *AsyncWebSocket::makeBuffer(const uint8_t *data, siz
12431246 * Authentication code from https://github.com/Links2004/arduinoWebSockets/blob/master/src/WebSockets.cpp#L480
12441247 */
12451248
1246- AsyncWebSocketResponse::AsyncWebSocketResponse (const String &key, AsyncWebSocket *server) {
1247- _server = server;
1249+ AsyncWebSocketResponse::AsyncWebSocketResponse (const String &key, AsyncWebSocket *server) : _server(server) {
12481250 _code = 101 ;
12491251 _sendContentLength = false ;
12501252
@@ -1290,18 +1292,25 @@ void AsyncWebSocketResponse::_respond(AsyncWebServerRequest *request) {
12901292 request->client ()->close ();
12911293 return ;
12921294 }
1295+ // unbind client's onAck callback from AsyncWebServerRequest's, we will destroy it on next callback and steal the client,
1296+ // can't do it now 'cause now we are in AsyncWebServerRequest::_onAck 's stack actually
1297+ // here we are loosing time on one RTT delay, but with current design we can't get rid of Req/Resp objects other way
1298+ _request = request;
1299+ request->client ()->onAck (
1300+ [](void *r, AsyncClient *c, size_t len, uint32_t time) {
1301+ if (len)
1302+ static_cast <AsyncWebSocketResponse*>(r)->_switchClient ();
1303+ },
1304+ this
1305+ );
12931306 String out;
12941307 _assembleHead (out, request->version ());
12951308 request->client ()->write (out.c_str (), _headLength);
12961309 _state = RESPONSE_WAIT_ACK;
12971310}
12981311
1299- size_t AsyncWebSocketResponse::_ack (AsyncWebServerRequest *request, size_t len, uint32_t time) {
1300- (void )time;
1301-
1302- if (len) {
1303- _server->_newClient (request);
1304- }
1305-
1306- return 0 ;
1307- }
1312+ void AsyncWebSocketResponse::_switchClient (){
1313+ // detach client from request
1314+ _server->_newClient (_request);
1315+ // _newClient() would also destruct _request and *this
1316+ }
0 commit comments