]> granicus.if.org Git - icinga2/commitdiff
Fix incorrect socket handling for the HTTP client 5760/head
authorGunnar Beutner <gunnar.beutner@icinga.com>
Tue, 14 Nov 2017 13:13:24 +0000 (14:13 +0100)
committerGunnar Beutner <gunnar.beutner@icinga.com>
Wed, 15 Nov 2017 08:53:38 +0000 (09:53 +0100)
lib/base/stream.cpp
lib/remote/httpresponse.cpp

index 9390d97b9da0fdef82fff36d985bb9519ed176d1..57791d30522b0e2ab39012bcfb25ea361bb2f8a9 100644 (file)
@@ -145,6 +145,9 @@ bool StreamReadContext::FillFromStream(const Stream::Ptr& stream, bool may_wait)
                if (!Buffer)
                        throw std::bad_alloc();
 
+               if (stream->IsEof())
+                       break;
+
                size_t rc = stream->Read(Buffer + Size, 4096, true);
 
                Size += rc;
index 7f77ed3865ee65286516a04bc27a1f11d5659e5f..ab7458655a2f9422461e1bba9b3d0389392a9a25 100644 (file)
@@ -159,12 +159,7 @@ bool HttpResponse::Parse(StreamReadContext& src, bool may_wait)
 
                        if (line == "") {
                                m_State = HttpResponseBody;
-
-                               /* 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();
+                               m_Body = new FIFO();
 
                                return true;
 
@@ -204,27 +199,41 @@ bool HttpResponse::Parse(StreamReadContext& src, bool may_wait)
                                return true;
                        }
                } 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"));
 
                        if (src.MustRead) {
-                               if (!src.FillFromStream(m_Stream, false)) {
+                               if (!src.FillFromStream(m_Stream, may_wait))
                                        src.Eof = true;
-                                       BOOST_THROW_EXCEPTION(std::invalid_argument("Unexpected EOF in HTTP body"));
-                               }
 
                                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;
-                               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;
                        return true;
                }