2019-02-25 14:48:22 +01:00
|
|
|
/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
|
2014-04-12 04:21:09 +02:00
|
|
|
|
2015-06-22 11:11:21 +02:00
|
|
|
#ifndef HTTPRESPONSE_H
|
|
|
|
#define HTTPRESPONSE_H
|
2014-04-12 04:21:09 +02:00
|
|
|
|
2015-06-22 11:11:21 +02:00
|
|
|
#include "remote/httprequest.hpp"
|
|
|
|
#include "base/stream.hpp"
|
|
|
|
#include "base/fifo.hpp"
|
2017-07-27 14:57:34 +02:00
|
|
|
#include <vector>
|
2014-04-12 04:21:09 +02:00
|
|
|
|
|
|
|
namespace icinga
|
|
|
|
{
|
|
|
|
|
2015-06-22 11:11:21 +02:00
|
|
|
enum HttpResponseState
|
2014-05-03 20:02:22 +02:00
|
|
|
{
|
2015-06-22 11:11:21 +02:00
|
|
|
HttpResponseStart,
|
|
|
|
HttpResponseHeaders,
|
2015-08-28 09:49:16 +02:00
|
|
|
HttpResponseBody,
|
|
|
|
HttpResponseEnd
|
2014-05-03 20:02:22 +02:00
|
|
|
};
|
|
|
|
|
2014-04-12 04:21:09 +02:00
|
|
|
/**
|
2015-06-22 11:11:21 +02:00
|
|
|
* An HTTP response.
|
2014-04-12 04:21:09 +02:00
|
|
|
*
|
2014-05-03 20:02:22 +02:00
|
|
|
* @ingroup remote
|
2014-04-12 04:21:09 +02:00
|
|
|
*/
|
2017-12-31 07:22:16 +01:00
|
|
|
struct HttpResponse
|
2014-04-12 04:21:09 +02:00
|
|
|
{
|
|
|
|
public:
|
2015-08-29 01:16:16 +02:00
|
|
|
bool Complete;
|
|
|
|
|
|
|
|
HttpVersion ProtocolVersion;
|
|
|
|
int StatusCode;
|
|
|
|
String StatusMessage;
|
|
|
|
|
|
|
|
Dictionary::Ptr Headers;
|
|
|
|
|
2018-01-04 08:54:18 +01:00
|
|
|
HttpResponse(Stream::Ptr stream, const HttpRequest& request);
|
2014-05-03 20:02:22 +02:00
|
|
|
|
2015-08-29 01:16:16 +02:00
|
|
|
bool Parse(StreamReadContext& src, bool may_wait);
|
|
|
|
size_t ReadBody(char *data, size_t count);
|
2018-01-04 04:25:35 +01:00
|
|
|
size_t GetBodySize() const;
|
2015-08-29 01:16:16 +02:00
|
|
|
|
2015-06-22 11:11:21 +02:00
|
|
|
void SetStatus(int code, const String& message);
|
|
|
|
void AddHeader(const String& key, const String& value);
|
|
|
|
void WriteBody(const char *data, size_t count);
|
2018-01-04 04:25:35 +01:00
|
|
|
void Finish();
|
2014-12-09 13:17:27 +01:00
|
|
|
|
2018-01-04 04:25:35 +01:00
|
|
|
bool IsPeerConnected() const;
|
2015-10-19 17:31:18 +02:00
|
|
|
|
2018-02-28 11:07:19 +01:00
|
|
|
void RebindRequest(const HttpRequest& request);
|
|
|
|
|
2014-04-12 04:21:09 +02:00
|
|
|
private:
|
2015-06-22 11:11:21 +02:00
|
|
|
HttpResponseState m_State;
|
2017-11-21 13:20:55 +01:00
|
|
|
std::shared_ptr<ChunkReadContext> m_ChunkContext;
|
2018-02-28 11:07:19 +01:00
|
|
|
const HttpRequest *m_Request;
|
2015-06-22 11:11:21 +02:00
|
|
|
Stream::Ptr m_Stream;
|
|
|
|
FIFO::Ptr m_Body;
|
2017-07-27 14:57:34 +02:00
|
|
|
std::vector<String> m_Headers;
|
2015-02-26 12:41:47 +01:00
|
|
|
|
2018-01-04 04:25:35 +01:00
|
|
|
void FinishHeaders();
|
2014-04-12 04:21:09 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2015-06-22 11:11:21 +02:00
|
|
|
#endif /* HTTPRESPONSE_H */
|