using namespace icinga;
HttpResponse::HttpResponse(Stream::Ptr stream, const HttpRequest& request)
- : Complete(false), m_State(HttpResponseStart), m_Request(request), m_Stream(std::move(stream))
+ : Complete(false), m_State(HttpResponseStart), m_Request(&request), m_Stream(std::move(stream))
{ }
void HttpResponse::SetStatus(int code, const String& message)
String status = "HTTP/";
- if (m_Request.ProtocolVersion == HttpVersion10)
+ if (m_Request->ProtocolVersion == HttpVersion10)
status += "1.0";
else
status += "1.1";
void HttpResponse::FinishHeaders()
{
if (m_State == HttpResponseHeaders) {
- if (m_Request.ProtocolVersion == HttpVersion11)
+ if (m_Request->ProtocolVersion == HttpVersion11)
AddHeader("Transfer-Encoding", "chunked");
AddHeader("Server", "Icinga/" + Application::GetAppVersion());
{
ASSERT(m_State == HttpResponseHeaders || m_State == HttpResponseBody);
- if (m_Request.ProtocolVersion == HttpVersion10) {
+ if (m_Request->ProtocolVersion == HttpVersion10) {
if (!m_Body)
m_Body = new FIFO();
{
ASSERT(m_State != HttpResponseEnd);
- if (m_Request.ProtocolVersion == HttpVersion10) {
+ if (m_Request->ProtocolVersion == HttpVersion10) {
if (m_Body)
AddHeader("Content-Length", Convert::ToString(m_Body->GetAvailableBytes()));
m_State = HttpResponseEnd;
- if (m_Request.ProtocolVersion == HttpVersion10 || m_Request.Headers->Get("connection") == "close")
+ if (m_Request->ProtocolVersion == HttpVersion10 || m_Request->Headers->Get("connection") == "close")
m_Stream->Shutdown();
}
{
return !m_Stream->IsEof();
}
+
+void HttpResponse::RebindRequest(const HttpRequest& request)
+{
+ m_Request = &request;
+}
bool IsPeerConnected() const;
+ void RebindRequest(const HttpRequest& request);
+
private:
HttpResponseState m_State;
std::shared_ptr<ChunkReadContext> m_ChunkContext;
- const HttpRequest& m_Request;
+ const HttpRequest *m_Request;
Stream::Ptr m_Stream;
FIFO::Ptr m_Body;
std::vector<String> m_Headers;
void HttpServerConnection::ProcessMessageAsync(HttpRequest& request, HttpResponse& response, const ApiUser::Ptr& user)
{
+ response.RebindRequest(request);
+
try {
HttpHandler::ProcessRequest(user, request, response);
} catch (const std::exception& ex) {