diff --git a/src/common/networking_linux.c b/src/common/networking_linux.c index 67e03887d..7a8054918 100644 --- a/src/common/networking_linux.c +++ b/src/common/networking_linux.c @@ -122,13 +122,14 @@ const char* ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buf setsockopt(state->sockfd, SOL_SOCKET, SO_RCVTIMEO, &timev, sizeof(timev)); } - ssize_t received = recv(state->sockfd, buffer->chars + buffer->length, ffStrbufGetFree(buffer), 0); - - if(received > 0) - { + uint32_t recvStart; + do { + recvStart = buffer->length; + ssize_t received = recv(state->sockfd, buffer->chars + buffer->length, ffStrbufGetFree(buffer), 0); + if (received <= 0) break; buffer->length += (uint32_t) received; buffer->chars[buffer->length] = '\0'; - } + } while (ffStrbufGetFree(buffer) > 0 && strstr(buffer->chars + recvStart, "\r\n\r\n") == NULL); close(state->sockfd); return ffStrbufStartsWithS(buffer, "HTTP/1.1 200 OK\r\n") ? NULL : "Invalid response"; diff --git a/src/common/networking_windows.c b/src/common/networking_windows.c index 8c9bd96ea..27a884216 100644 --- a/src/common/networking_windows.c +++ b/src/common/networking_windows.c @@ -130,13 +130,14 @@ const char* ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buf setsockopt(state->sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*) &timeout, sizeof(timeout)); } - ssize_t received = recv(state->sockfd, buffer->chars + buffer->length, (int)ffStrbufGetFree(buffer), 0); - - if(received > 0) - { - buffer->length += (uint32_t) received; + uint32_t recvStart; + do { + recvStart = buffer->length; + ssize_t received = recv(state->sockfd, buffer->chars + buffer->length, (int) ffStrbufGetFree(buffer), 0); + if (received <= 0) break; + buffer->length = recvStart + (uint32_t) received; buffer->chars[buffer->length] = '\0'; - } + } while (ffStrbufGetFree(buffer) > 0 && strstr(buffer->chars + recvStart, "\r\n\r\n") == NULL); closesocket(state->sockfd); return ffStrbufStartsWithS(buffer, "HTTP/1.1 200 OK\r\n") ? NULL : "Invalid response";