Skip to content

Commit b3bdc6b

Browse files
committed
AsyncWebSocket: Use DynamicBuffer for APIs
This makes it clear that the buffers are copied or moved to the library. Using a shared buffer implies the client might be permitted to hang on to it - this is not generally permissible as the websocket might write to the buffer while sending it.
1 parent 9bfbeb7 commit b3bdc6b

File tree

2 files changed

+27
-29
lines changed

2 files changed

+27
-29
lines changed

src/AsyncWebSocket.cpp

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -778,7 +778,7 @@ void AsyncWebSocketClient::text(const __FlashStringHelper *data){
778778
free(message);
779779
}
780780
}
781-
void AsyncWebSocketClient::text(AsyncWebSocketSharedBuffer buffer)
781+
void AsyncWebSocketClient::text(AsyncWebSocketBuffer buffer)
782782
{
783783
_queueMessage(new AsyncWebSocketMultiMessage(std::move(buffer)));
784784
}
@@ -815,7 +815,7 @@ void AsyncWebSocketClient::binary(const __FlashStringHelper *data, size_t len){
815815
}
816816

817817
}
818-
void AsyncWebSocketClient::binary(AsyncWebSocketSharedBuffer buffer)
818+
void AsyncWebSocketClient::binary(AsyncWebSocketBuffer buffer)
819819
{
820820
_queueMessage(new AsyncWebSocketMultiMessage(std::move(buffer), WS_BINARY));
821821
}
@@ -944,22 +944,19 @@ void AsyncWebSocket::text(uint32_t id, const char * message, size_t len){
944944
c->text(message, len);
945945
}
946946

947-
void AsyncWebSocket::textAll(const AsyncWebSocketSharedBuffer& buffer){
947+
void AsyncWebSocket::textAll(AsyncWebSocketBuffer buffer){
948948
if (!buffer) return;
949-
for(const auto& c: _clients){
950-
if(c->status() == WS_CONNECTED){
951-
c->text(buffer);
952-
}
953-
}
949+
messageAll(AsyncWebSocketMultiMessage(std::move(buffer)));
954950
}
955951

956952
void AsyncWebSocket::textAll(const char * message, size_t len){
957-
textAll(AsyncWebSocketSharedBuffer(message, len));
953+
if ((!message) || (len ==0)) return;
954+
messageAll(AsyncWebSocketMultiMessage(SharedBuffer{message, len}));
958955
}
959956

960957
void AsyncWebSocket::textAll(const AsyncWebSocketMessageBuffer* buffer){
961958
if (!buffer) return;
962-
textAll(buffer->_buf);
959+
textAll(std::move(buffer->_buf));
963960
delete buffer;
964961
}
965962

@@ -970,20 +967,17 @@ void AsyncWebSocket::binary(uint32_t id, const char * message, size_t len){
970967
}
971968

972969
void AsyncWebSocket::binaryAll(const char * message, size_t len){
973-
binaryAll(SharedBuffer(message, len));
970+
binaryAll(DynamicBuffer(message, len));
974971
}
975972

976-
void AsyncWebSocket::binaryAll(const AsyncWebSocketSharedBuffer &buffer)
973+
void AsyncWebSocket::binaryAll(AsyncWebSocketBuffer buffer)
977974
{
978-
for(const auto& c: _clients){
979-
if(c->status() == WS_CONNECTED)
980-
c->binary(buffer);
981-
}
975+
messageAll(AsyncWebSocketMultiMessage(std::move(buffer), WS_BINARY));
982976
}
983977

984978
void AsyncWebSocket::binaryAll(const AsyncWebSocketMessageBuffer* buffer){
985979
if (!buffer) return;
986-
binaryAll(buffer->_buf);
980+
binaryAll(std::move(buffer->_buf));
987981
delete buffer;
988982
}
989983

@@ -1023,7 +1017,7 @@ size_t AsyncWebSocket::printfAll(const char *format, ...) {
10231017
va_end(arg);
10241018
delete[] temp;
10251019

1026-
AsyncWebSocketSharedBuffer buffer(len);
1020+
AsyncWebSocketBuffer buffer(len);
10271021
if (!buffer) {
10281022
return 0;
10291023
}
@@ -1061,7 +1055,7 @@ size_t AsyncWebSocket::printfAll_P(PGM_P formatP, ...) {
10611055
va_end(arg);
10621056
delete[] temp;
10631057

1064-
AsyncWebSocketSharedBuffer buffer(len);
1058+
AsyncWebSocketBuffer buffer(len);
10651059
if (!buffer) {
10661060
return 0;
10671061
}
@@ -1198,7 +1192,7 @@ void AsyncWebSocket::handleRequest(AsyncWebServerRequest *request){
11981192
// Deprecated API
11991193
AsyncWebSocketMessageBuffer* AsyncWebSocket::makeBuffer(size_t size)
12001194
{
1201-
AsyncWebSocketSharedBuffer buffer(size);
1195+
AsyncWebSocketBuffer buffer(size);
12021196
if (buffer.size() == 0) {
12031197
return nullptr;
12041198
}
@@ -1207,7 +1201,7 @@ AsyncWebSocketMessageBuffer* AsyncWebSocket::makeBuffer(size_t size)
12071201

12081202
AsyncWebSocketMessageBuffer* AsyncWebSocket::makeBuffer(const uint8_t * data, size_t size)
12091203
{
1210-
AsyncWebSocketSharedBuffer buffer((const char*) data, size);
1204+
AsyncWebSocketBuffer buffer((const char*) data, size);
12111205
if (buffer.size() == 0) {
12121206
return nullptr;
12131207
}

src/AsyncWebSocket.h

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -89,20 +89,22 @@ typedef enum { WS_CONTINUATION, WS_TEXT, WS_BINARY, WS_DISCONNECT = 0x08, WS_PIN
8989
typedef enum { WS_MSG_SENDING, WS_MSG_SENT, WS_MSG_ERROR } AwsMessageStatus;
9090
typedef enum { WS_EVT_CONNECT, WS_EVT_DISCONNECT, WS_EVT_PONG, WS_EVT_ERROR, WS_EVT_DATA } AwsEventType;
9191

92+
typedef DynamicBuffer AsyncWebSocketBuffer;
9293
typedef SharedBuffer AsyncWebSocketSharedBuffer;
9394

94-
// API compatibility class - use AsyncWebSocketSharedBuffer directly
95+
// API compatibility class.
96+
// Use AsyncWebSocketBuffer directly instead of this where possible.
9597
class AsyncWebSocketMessageBuffer {
9698
private:
97-
AsyncWebSocketSharedBuffer _buf;
99+
DynamicBuffer _buf;
98100

99101
public:
100102
AsyncWebSocketMessageBuffer() {};
101103
AsyncWebSocketMessageBuffer(size_t size) : _buf(size) {};
102104
AsyncWebSocketMessageBuffer(uint8_t * data, size_t size) : _buf(reinterpret_cast<char*>(data), size) {};
103-
AsyncWebSocketMessageBuffer(const AsyncWebSocketMessageBuffer &r) { if (r._buf) _buf = SharedBuffer(r._buf.copy()); }
105+
AsyncWebSocketMessageBuffer(const AsyncWebSocketMessageBuffer &r) { if (r._buf) _buf = r._buf; }
104106
AsyncWebSocketMessageBuffer(AsyncWebSocketMessageBuffer &&) = default;
105-
AsyncWebSocketMessageBuffer(AsyncWebSocketSharedBuffer b) : _buf(std::move(b)) {};
107+
AsyncWebSocketMessageBuffer(DynamicBuffer b) : _buf(std::move(b)) {};
106108
~AsyncWebSocketMessageBuffer() {};
107109

108110
void operator ++(int i) {};
@@ -160,6 +162,7 @@ class AsyncWebSocketMultiMessage: public AsyncWebSocketMessage {
160162
AsyncWebSocketSharedBuffer _WSbuffer;
161163
public:
162164
AsyncWebSocketMultiMessage(AsyncWebSocketSharedBuffer buffer, uint8_t opcode=WS_TEXT, bool mask=false);
165+
AsyncWebSocketMultiMessage(AsyncWebSocketBuffer buffer, uint8_t opcode=WS_TEXT, bool mask=false) : AsyncWebSocketMultiMessage(AsyncWebSocketSharedBuffer(std::move(buffer)), opcode, mask){};
163166
virtual ~AsyncWebSocketMultiMessage() override;
164167
virtual bool betweenFrames() const override { return _acked == _ack; }
165168
virtual void ack(size_t len, uint32_t time) override ;
@@ -233,7 +236,7 @@ class AsyncWebSocketClient {
233236
void text(char * message);
234237
void text(const String &message);
235238
void text(const __FlashStringHelper *data);
236-
void text(AsyncWebSocketSharedBuffer buffer);
239+
void text(AsyncWebSocketBuffer buffer);
237240
void text(AsyncWebSocketMessageBuffer* buffer) __attribute__((deprecated)); // frees buffer
238241

239242
void binary(const char * message, size_t len);
@@ -242,7 +245,7 @@ class AsyncWebSocketClient {
242245
void binary(char * message);
243246
void binary(const String &message);
244247
void binary(const __FlashStringHelper *data, size_t len);
245-
void binary(AsyncWebSocketSharedBuffer buffer);
248+
void binary(AsyncWebSocketBuffer buffer);
246249
void binary(AsyncWebSocketMessageBuffer* buffer) __attribute__((deprecated)); // frees buffer
247250

248251
bool canSend() { return _messageQueue.length() < WS_MAX_QUEUED_MESSAGES; }
@@ -295,14 +298,15 @@ class AsyncWebSocket: public AsyncWebHandler {
295298
void text(uint32_t id, char * message);
296299
void text(uint32_t id, const String &message);
297300
void text(uint32_t id, const __FlashStringHelper *message);
301+
void text(uint32_t id, AsyncWebSocketBuffer buffer);
298302

299303
void textAll(const char * message, size_t len);
300304
void textAll(const char * message);
301305
void textAll(uint8_t * message, size_t len);
302306
void textAll(char * message);
303307
void textAll(const String &message);
304308
void textAll(const __FlashStringHelper *message); // need to convert
305-
void textAll(const AsyncWebSocketSharedBuffer& buffer);
309+
void textAll(AsyncWebSocketBuffer buffer); // must be moved, or will be copied
306310
void textAll(const AsyncWebSocketMessageBuffer* buffer) __attribute__((deprecated)); // frees buffer
307311

308312
void binary(uint32_t id, const char * message, size_t len);
@@ -318,7 +322,7 @@ class AsyncWebSocket: public AsyncWebHandler {
318322
void binaryAll(char * message);
319323
void binaryAll(const String &message);
320324
void binaryAll(const __FlashStringHelper *message, size_t len);
321-
void binaryAll(const AsyncWebSocketSharedBuffer& buffer);
325+
void binaryAll(AsyncWebSocketBuffer buffer);
322326
void binaryAll(const AsyncWebSocketMessageBuffer* buffer) __attribute__((deprecated)); // frees buffer
323327

324328
void message(uint32_t id, AsyncWebSocketMessage *message);

0 commit comments

Comments
 (0)