From 9817448c59414b65cce7674dc2b2f81f6c53331b Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 28 Feb 2013 23:48:19 -0800 Subject: [PATCH] If needed, call send() multiple times in HTTP. --- base/buffer.cpp | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/base/buffer.cpp b/base/buffer.cpp index 5b3dabe77b..ee91fd3917 100644 --- a/base/buffer.cpp +++ b/base/buffer.cpp @@ -109,16 +109,26 @@ bool Buffer::Flush(int fd) { } bool Buffer::FlushSocket(uintptr_t sock) { - // TODO: send may need retries! - size_t sent = send(sock, &data_[0], data_.size(), 0); - // bool success = fd_util::WriteLine(fd, data_.data(), data_.size()); - if (sent == data_.size()) { - data_.resize(0); - return true; - } else { - ELOG("FlushSocket failed"); - return false; + for (size_t pos = 0, end = data_.size(); pos < end; ) { + size_t sent = send(sock, &data_[pos], end - pos, 0); + if (sent < 0) { + ELOG("FlushSocket failed"); + return false; + } + pos += sent; + + // Buffer full, don't spin. + if (sent == 0) { +#ifdef _WIN32 + Sleep(1); +#else + sleep(1); +#endif + } } + + data_.resize(0); + return true; } void Buffer::ReadAll(int fd) {