diff --git a/src/Json.c b/src/Json.c index 41b3ea8..50ac50d 100644 --- a/src/Json.c +++ b/src/Json.c @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -705,7 +706,12 @@ JsonFree(HashMap * object) static int JsonConsumeWhitespace(JsonParserState * state) { + static const int nRetries = 5; + static const int delay = 2; + int c; + int tries = 0; + int readFlg = 0; while (1) { @@ -721,7 +727,17 @@ JsonConsumeWhitespace(JsonParserState * state) if (errno == EAGAIN) { clearerr(state->stream); - continue; + tries++; + + if (tries >= nRetries || readFlg) + { + break; + } + else + { + UtilSleepMillis(delay); + continue; + } } else { @@ -729,6 +745,13 @@ JsonConsumeWhitespace(JsonParserState * state) } } + /* As soon as we've successfully read a byte, treat + * future EAGAINs as EOF, because some clients don't + * properly shutdown their sockets. + */ + readFlg = 1; + tries = 0; + if (!isspace(c)) { break;