mirror of https://github.com/Icinga/icinga2.git
Merge pull request #5760 from Icinga/fix/http-client-bugs
Fix incorrect socket handling for the HTTP client
This commit is contained in:
commit
a72a7b7c89
|
@ -145,6 +145,9 @@ bool StreamReadContext::FillFromStream(const Stream::Ptr& stream, bool may_wait)
|
||||||
if (!Buffer)
|
if (!Buffer)
|
||||||
throw std::bad_alloc();
|
throw std::bad_alloc();
|
||||||
|
|
||||||
|
if (stream->IsEof())
|
||||||
|
break;
|
||||||
|
|
||||||
size_t rc = stream->Read(Buffer + Size, 4096, true);
|
size_t rc = stream->Read(Buffer + Size, 4096, true);
|
||||||
|
|
||||||
Size += rc;
|
Size += rc;
|
||||||
|
|
|
@ -158,12 +158,7 @@ bool HttpResponse::Parse(StreamReadContext& src, bool may_wait)
|
||||||
|
|
||||||
if (line == "") {
|
if (line == "") {
|
||||||
m_State = HttpResponseBody;
|
m_State = HttpResponseBody;
|
||||||
|
m_Body = new FIFO();
|
||||||
/* we're done if the request doesn't contain a message body */
|
|
||||||
if (!Headers->Contains("content-length") && !Headers->Contains("transfer-encoding"))
|
|
||||||
Complete = true;
|
|
||||||
else
|
|
||||||
m_Body = new FIFO();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@ -203,27 +198,41 @@ bool HttpResponse::Parse(StreamReadContext& src, bool may_wait)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (src.Eof)
|
bool hasLengthIndicator = false;
|
||||||
|
size_t lengthIndicator = 0;
|
||||||
|
Value contentLengthHeader;
|
||||||
|
|
||||||
|
if (Headers->Get("content-length", &contentLengthHeader)) {
|
||||||
|
hasLengthIndicator = true;
|
||||||
|
lengthIndicator = Convert::ToLong(contentLengthHeader);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasLengthIndicator && src.Eof)
|
||||||
BOOST_THROW_EXCEPTION(std::invalid_argument("Unexpected EOF in HTTP body"));
|
BOOST_THROW_EXCEPTION(std::invalid_argument("Unexpected EOF in HTTP body"));
|
||||||
|
|
||||||
if (src.MustRead) {
|
if (src.MustRead) {
|
||||||
if (!src.FillFromStream(m_Stream, false)) {
|
if (!src.FillFromStream(m_Stream, may_wait))
|
||||||
src.Eof = true;
|
src.Eof = true;
|
||||||
BOOST_THROW_EXCEPTION(std::invalid_argument("Unexpected EOF in HTTP body"));
|
|
||||||
}
|
|
||||||
|
|
||||||
src.MustRead = false;
|
src.MustRead = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t length_indicator = Convert::ToLong(Headers->Get("content-length"));
|
if (!hasLengthIndicator)
|
||||||
|
lengthIndicator = src.Size;
|
||||||
|
|
||||||
if (src.Size < length_indicator) {
|
if (src.Size < lengthIndicator) {
|
||||||
src.MustRead = true;
|
src.MustRead = true;
|
||||||
return false;
|
return may_wait;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_Body->Write(src.Buffer, lengthIndicator);
|
||||||
|
src.DropData(lengthIndicator);
|
||||||
|
|
||||||
|
if (!hasLengthIndicator && !src.Eof) {
|
||||||
|
src.MustRead = true;
|
||||||
|
return may_wait;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_Body->Write(src.Buffer, length_indicator);
|
|
||||||
src.DropData(length_indicator);
|
|
||||||
Complete = true;
|
Complete = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue