@@ -46,6 +46,8 @@ extern "C" {
46
46
47
47
#endif
48
48
49
+ #define WEBSOCKETS_MAX_HEADER_SIZE (14 )
50
+
49
51
/* *
50
52
*
51
53
* @param client WSclient_t * ptr to the client struct
@@ -97,11 +99,13 @@ void WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * pay
97
99
DEBUG_WEBSOCKETS (" [WS][%d][sendFrame] text: %s\n " , client->num , (payload + (headerToPayload ? 14 : 0 )));
98
100
}
99
101
100
- uint8_t maskKey[4 ] = { 0 };
101
- uint8_t buffer[14 ] = { 0 };
102
+ uint8_t maskKey[4 ] = { 0x00 , 0x00 , 0x00 , 0x00 };
103
+ uint8_t buffer[WEBSOCKETS_MAX_HEADER_SIZE ] = { 0 };
102
104
103
105
uint8_t headerSize;
104
106
uint8_t * headerPtr;
107
+ uint8_t * payloadPtr = payload;
108
+ bool useInternBuffer = false ;
105
109
106
110
// calculate header Size
107
111
if (length < 126 ) {
@@ -116,10 +120,26 @@ void WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * pay
116
120
headerSize += 4 ;
117
121
}
118
122
123
+
124
+ #ifdef WEBSOCKETS_USE_BIG_MEM
125
+ // only for ESP since AVR has less HEAP
126
+ // try to send data in one TCP package (only if some free Heap is there)
127
+ if (!headerToPayload && ((length > 0 ) && (length < 1400 )) && (ESP.getFreeHeap () > 6000 )) {
128
+ DEBUG_WEBSOCKETS (" [WS][%d][sendFrame] pack to one TCP package...\n " , client->num );
129
+ uint8_t * dataPtr = (uint8_t *) malloc (length + WEBSOCKETS_MAX_HEADER_SIZE);
130
+ if (dataPtr) {
131
+ memcpy ((dataPtr + WEBSOCKETS_MAX_HEADER_SIZE), payload, length);
132
+ headerToPayload = true ;
133
+ useInternBuffer = true ;
134
+ payloadPtr = dataPtr;
135
+ }
136
+ }
137
+ #endif
138
+
119
139
// set Header Pointer
120
140
if (headerToPayload) {
121
141
// calculate offset in payload
122
- headerPtr = (payload + (14 - headerSize));
142
+ headerPtr = (payloadPtr + (WEBSOCKETS_MAX_HEADER_SIZE - headerSize));
123
143
} else {
124
144
headerPtr = &buffer[0 ];
125
145
}
@@ -160,33 +180,53 @@ void WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * pay
160
180
}
161
181
162
182
if (mask) {
163
- // todo generate random mask key
164
- for (uint8_t x = 0 ; x < sizeof (maskKey); x++) {
165
- // maskKey[x] = random(0xFF);
166
- maskKey[x] = 0x00 ; // fake xor (0x00 0x00 0x00 0x00)
167
- *headerPtr = maskKey[x]; headerPtr++;
168
- }
183
+ if (useInternBuffer) {
184
+ for (uint8_t x = 0 ; x < sizeof (maskKey); x++) {
185
+ maskKey[x] = random (0xFF );
186
+ *headerPtr = maskKey[x]; headerPtr++;
187
+ }
169
188
170
- // todo encode XOR (note: using payload not working for static content from flash)
171
- // for(size_t x = 0; x < length; x++) {
172
- // payload[x] = (payload[x] ^ maskKey[x % 4]);
173
- // }
189
+ uint8_t * dataMaskPtr;
190
+
191
+ if (headerToPayload) {
192
+ dataMaskPtr = (payloadPtr + WEBSOCKETS_MAX_HEADER_SIZE);
193
+ } else {
194
+ dataMaskPtr = payloadPtr;
195
+ }
196
+
197
+ for (size_t x = 0 ; x < length; x++) {
198
+ dataMaskPtr[x] = (dataMaskPtr[x] ^ maskKey[x % 4 ]);
199
+ }
200
+
201
+ } else {
202
+ *headerPtr = maskKey[0 ]; headerPtr++;
203
+ *headerPtr = maskKey[1 ]; headerPtr++;
204
+ *headerPtr = maskKey[2 ]; headerPtr++;
205
+ *headerPtr = maskKey[3 ]; headerPtr++;
206
+ }
174
207
}
175
208
176
209
if (headerToPayload) {
177
210
// header has be added to payload
178
211
// payload is forced to reserved 14 Byte but we may not need all based on the length and mask settings
179
212
// offset in payload is calculatetd 14 - headerSize
180
- client->tcp ->write (&payload[( 14 - headerSize)], (length + headerSize));
213
+ client->tcp ->write (&payloadPtr[(WEBSOCKETS_MAX_HEADER_SIZE - headerSize)], (length + headerSize));
181
214
} else {
182
215
// send header
183
216
client->tcp ->write (&buffer[0 ], headerSize);
184
217
185
- if (payload && length > 0 ) {
218
+ if (payloadPtr && length > 0 ) {
186
219
// send payload
187
- client->tcp ->write (&payload [0 ], length);
220
+ client->tcp ->write (&payloadPtr [0 ], length);
188
221
}
189
222
}
223
+
224
+ #ifdef WEBSOCKETS_USE_BIG_MEM
225
+ if (useInternBuffer && payloadPtr) {
226
+ free (payloadPtr);
227
+ }
228
+ #endif
229
+
190
230
}
191
231
192
232
/* *
0 commit comments