Skip to content

Commit 5333ebf

Browse files
committed
add function peekBytes to WiFiClient/WiFiClientSecure to allow to peek multiple bytes if possible
1 parent 8987374 commit 5333ebf

File tree

5 files changed

+72
-0
lines changed

5 files changed

+72
-0
lines changed

libraries/ESP8266WiFi/src/WiFiClient.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,27 @@ int WiFiClient::peek()
239239
return _client->peek();
240240
}
241241

242+
size_t WiFiClient::peekBytes(uint8_t *buffer, size_t length) {
243+
size_t count = 0;
244+
245+
if(!_client) {
246+
return 0;
247+
}
248+
249+
_startMillis = millis();
250+
while((available() < (int) length) && ((millis() - _startMillis) < _timeout)) {
251+
yield();
252+
}
253+
254+
if(available() < (int) length) {
255+
count = available();
256+
} else {
257+
count = length;
258+
}
259+
260+
return _client->peekBytes((char *)buffer, count);
261+
}
262+
242263
void WiFiClient::flush()
243264
{
244265
if (_client)

libraries/ESP8266WiFi/src/WiFiClient.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ class WiFiClient : public Client, public SList<WiFiClient> {
5656
virtual int read();
5757
virtual int read(uint8_t *buf, size_t size);
5858
virtual int peek();
59+
virtual size_t peekBytes(uint8_t *buffer, size_t length);
60+
size_t peekBytes(char *buffer, size_t length) {
61+
return peekBytes((uint8_t *) buffer, length);
62+
}
5963
virtual void flush();
6064
virtual void stop();
6165
virtual uint8_t connected();

libraries/ESP8266WiFi/src/WiFiClientSecure.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,17 @@ class SSLContext {
133133
return _read_ptr[0];
134134
}
135135

136+
size_t peekBytes(char *dst, size_t size) {
137+
if(!_available) {
138+
if(!_readAll())
139+
return -1;
140+
}
141+
142+
size_t will_copy = (_available < size) ? _available : size;
143+
memcpy(dst, _read_ptr, will_copy);
144+
return will_copy;
145+
}
146+
136147
int available() {
137148
auto cb = _available;
138149
if (cb == 0) {
@@ -278,6 +289,27 @@ int WiFiClientSecure::peek() {
278289
return _ssl->peek();
279290
}
280291

292+
size_t WiFiClientSecure::peekBytes(uint8_t *buffer, size_t length) {
293+
size_t count = 0;
294+
295+
if(!_ssl) {
296+
return 0;
297+
}
298+
299+
_startMillis = millis();
300+
while((available() < (int) length) && ((millis() - _startMillis) < _timeout)) {
301+
yield();
302+
}
303+
304+
if(available() < (int) length) {
305+
count = available();
306+
} else {
307+
count = length;
308+
}
309+
310+
return _ssl->peekBytes((char *)buffer, count);
311+
}
312+
281313
int WiFiClientSecure::available() {
282314
if (!_ssl)
283315
return 0;

libraries/ESP8266WiFi/src/WiFiClientSecure.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class WiFiClientSecure : public WiFiClient {
4646
int available() override;
4747
int read() override;
4848
int peek() override;
49+
size_t peekBytes(uint8_t *buffer, size_t length) override;
4950
void stop() override;
5051

5152
void setCertificate(const uint8_t* cert_data, size_t size);

libraries/ESP8266WiFi/src/include/ClientContext.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,20 @@ class ClientContext {
179179
return reinterpret_cast<char*>(_rx_buf->payload)[_rx_buf_offset];
180180
}
181181

182+
size_t peekBytes(char *dst, size_t size) {
183+
if(!_rx_buf) return 0;
184+
185+
size_t max_size = _rx_buf->tot_len - _rx_buf_offset;
186+
size = (size < max_size) ? size : max_size;
187+
188+
DEBUGV(":pd %d, %d, %d\r\n", size, _rx_buf->tot_len, _rx_buf_offset);
189+
size_t buf_size = _rx_buf->len - _rx_buf_offset;
190+
size_t copy_size = (size < buf_size) ? size : buf_size;
191+
DEBUGV(":rpi %d, %d\r\n", buf_size, copy_size);
192+
os_memcpy(dst, reinterpret_cast<char*>(_rx_buf->payload) + _rx_buf_offset, copy_size);
193+
return copy_size;
194+
}
195+
182196
void flush() {
183197
if(!_rx_buf) {
184198
return;

0 commit comments

Comments
 (0)