Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion cores/esp32/Stream.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,10 @@ class Stream: public Print
// parsing methods

void setTimeout(unsigned long timeout); // sets maximum milliseconds to wait for stream data, default is 1 second

unsigned long getTimeout(void)
{
return _timeout;
}
bool find(const char *target); // reads data from the stream until the target string is found
bool find(uint8_t *target)
{
Expand Down
39 changes: 35 additions & 4 deletions libraries/WebServer/src/Parsing.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -304,11 +304,42 @@ void WebServer::_uploadWriteByte(uint8_t b){

int WebServer::_uploadReadByte(WiFiClient& client){
int res = client.read();
if(res == -1){
while(!client.available() && client.connected())
delay(2);
res = client.read();
if(res < 0) {
// keep trying until you either read a valid byte or timeout
unsigned long startMillis = millis();
long timeoutIntervalMillis = client.getTimeout();
unsigned long currentMillis = startMillis;
boolean timedOut = false;
for(;;) {
// loosely modeled after blinkWithoutDelay pattern
while(!timedOut && !client.available() && client.connected()){
delay(2);
currentMillis = millis();
timedOut = currentMillis - startMillis >= timeoutIntervalMillis;
}

res = client.read();
if(res >= 0) {
return res; // exit on a valid read
}
// NOTE: it is possible to get here and have all of the following
// assertions hold true
//
// -- client.available() > 0
// -- client.connected == true
// -- res == -1
//
// a simple retry strategy overcomes this which is to say the
// assertion is not permanent, but the reason that this works
// is elusive, and possibly indicative of a more subtle underlying
// issue

if(timedOut) {
return res; // exit on a timeout
}
}
}

return res;
}

Expand Down
14 changes: 7 additions & 7 deletions libraries/WiFi/src/WiFiClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ int WiFiClient::setOption(int option, int *value)
{
int res = setsockopt(fd(), IPPROTO_TCP, option, (char *) value, sizeof(int));
if(res < 0) {
log_e("%d", errno);
log_e("setOption fail on fd %d, errno: %d", fd(), errno);
}
return res;
}
Expand All @@ -289,7 +289,7 @@ int WiFiClient::getOption(int option, int *value)
size_t size = sizeof(int);
int res = getsockopt(fd(), IPPROTO_TCP, option, (char *)value, &size);
if(res < 0) {
log_e("%d", errno);
log_e("getOption fail on fd %d, errno: %d", fd(), errno);
}
return res;
}
Expand Down Expand Up @@ -362,7 +362,7 @@ size_t WiFiClient::write(const uint8_t *buf, size_t size)
}
}
else if(res < 0) {
log_e("%d", errno);
log_e("write fail on fd %d, errno: %d", fd(), errno);
if(errno != EAGAIN) {
//if resource was busy, can try again, otherwise give up
stop();
Expand Down Expand Up @@ -406,7 +406,7 @@ int WiFiClient::read(uint8_t *buf, size_t size)
int res = -1;
res = _rxBuffer->read(buf, size);
if(_rxBuffer->failed()) {
log_e("%d", errno);
log_e("read fail on fd %d, errno: %d", fd(), errno);
stop();
}
return res;
Expand All @@ -416,7 +416,7 @@ int WiFiClient::peek()
{
int res = _rxBuffer->peek();
if(_rxBuffer->failed()) {
log_e("%d", errno);
log_e("peek fail on fd %d, errno: %d", fd(), errno);
stop();
}
return res;
Expand All @@ -430,7 +430,7 @@ int WiFiClient::available()
}
int res = _rxBuffer->available();
if(_rxBuffer->failed()) {
log_e("%d", errno);
log_e("available fail on fd %d, errno: %d", fd(), errno);
stop();
}
return res;
Expand All @@ -452,7 +452,7 @@ void WiFiClient::flush() {
toRead = (a>WIFI_CLIENT_FLUSH_BUFFER_SIZE)?WIFI_CLIENT_FLUSH_BUFFER_SIZE:a;
res = recv(fd(), buf, toRead, MSG_DONTWAIT);
if(res < 0) {
log_e("%d", errno);
log_e("flush fail on fd %d, errno: %d", fd(), errno);
stop();
break;
}
Expand Down