mirror of
https://github.com/Icinga/icinga2.git
synced 2025-04-08 17:05:25 +02:00
On a non 204 response we parse the HTTP response until complete e.g. do the headers and body, not just the header. A new interface is added to the response to allow us to determine the body size so that it may be read out and buffered. The body is parsed and any error message printed out. In the event that the parsing fails the raw body is dumped out; better than nothing! fixes #4411 Signed-off-by: Michael Friedrich <michael.friedrich@icinga.com>
80 lines
2.5 KiB
C++
80 lines
2.5 KiB
C++
/******************************************************************************
|
|
* Icinga 2 *
|
|
* Copyright (C) 2012-2017 Icinga Development Team (https://www.icinga.com/) *
|
|
* *
|
|
* This program is free software; you can redistribute it and/or *
|
|
* modify it under the terms of the GNU General Public License *
|
|
* as published by the Free Software Foundation; either version 2 *
|
|
* of the License, or (at your option) any later version. *
|
|
* *
|
|
* This program is distributed in the hope that it will be useful, *
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
* GNU General Public License for more details. *
|
|
* *
|
|
* You should have received a copy of the GNU General Public License *
|
|
* along with this program; if not, write to the Free Software Foundation *
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
|
|
******************************************************************************/
|
|
|
|
#ifndef HTTPRESPONSE_H
|
|
#define HTTPRESPONSE_H
|
|
|
|
#include "remote/httprequest.hpp"
|
|
#include "base/stream.hpp"
|
|
#include "base/fifo.hpp"
|
|
|
|
namespace icinga
|
|
{
|
|
|
|
enum HttpResponseState
|
|
{
|
|
HttpResponseStart,
|
|
HttpResponseHeaders,
|
|
HttpResponseBody,
|
|
HttpResponseEnd
|
|
};
|
|
|
|
/**
|
|
* An HTTP response.
|
|
*
|
|
* @ingroup remote
|
|
*/
|
|
struct I2_REMOTE_API HttpResponse
|
|
{
|
|
public:
|
|
bool Complete;
|
|
|
|
HttpVersion ProtocolVersion;
|
|
int StatusCode;
|
|
String StatusMessage;
|
|
|
|
Dictionary::Ptr Headers;
|
|
|
|
HttpResponse(const Stream::Ptr& stream, const HttpRequest& request);
|
|
|
|
bool Parse(StreamReadContext& src, bool may_wait);
|
|
size_t ReadBody(char *data, size_t count);
|
|
size_t GetBodySize(void) const;
|
|
|
|
void SetStatus(int code, const String& message);
|
|
void AddHeader(const String& key, const String& value);
|
|
void WriteBody(const char *data, size_t count);
|
|
void Finish(void);
|
|
|
|
bool IsPeerConnected(void) const;
|
|
|
|
private:
|
|
HttpResponseState m_State;
|
|
boost::shared_ptr<ChunkReadContext> m_ChunkContext;
|
|
const HttpRequest& m_Request;
|
|
Stream::Ptr m_Stream;
|
|
FIFO::Ptr m_Body;
|
|
|
|
void FinishHeaders(void);
|
|
};
|
|
|
|
}
|
|
|
|
#endif /* HTTPRESPONSE_H */
|