/*
This file is part of libhttpserver
Copyright (C) 2011-2019 Sebastiano Merlino
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA
*/
#if !defined (_HTTPSERVER_HPP_INSIDE_) && !defined (HTTPSERVER_COMPILATION)
#error "Only or can be included directly."
#endif
#ifndef _HTTP_RESPONSE_HPP_
#define _HTTP_RESPONSE_HPP_
#include
#include
#include
#include
#include
#include
#include "httpserver/http_utils.hpp"
struct MHD_Connection;
struct MHD_Response;
namespace httpserver
{
/**
* Class representing an abstraction for an Http Response. It is used from classes using these apis to send information through http protocol.
**/
class http_response
{
public:
http_response():
response_code(-1)
{
}
explicit http_response(int response_code, const std::string& content_type):
response_code(response_code)
{
this->headers[http::http_utils::http_header_content_type] = content_type;
}
/**
* Copy constructor
* @param b The http_response object to copy attributes value from.
**/
http_response(const http_response& b):
response_code(b.response_code),
headers(b.headers),
footers(b.footers),
cookies(b.cookies)
{
}
http_response(http_response&& other) noexcept:
response_code(other.response_code),
headers(std::move(other.headers)),
footers(std::move(other.footers)),
cookies(std::move(other.cookies))
{
}
http_response& operator=(const http_response& b)
{
if (this == &b) return *this;
this->response_code = b.response_code;
this->headers = b.headers;
this->footers = b.footers;
this->cookies = b.cookies;
return *this;
}
http_response& operator=(http_response&& b)
{
if (this == &b) return *this;
this->response_code = b.response_code;
this->headers = std::move(b.headers);
this->footers = std::move(b.footers);
this->cookies = std::move(b.cookies);
return *this;
}
virtual ~http_response()
{
}
/**
* Method used to get a specified header defined for the response
* @param key The header identification
* @return a string representing the value assumed by the header
**/
const std::string& get_header(const std::string& key)
{
return this->headers[key];
}
/**
* Method used to get a specified footer defined for the response
* @param key The footer identification
* @return a string representing the value assumed by the footer
**/
const std::string& get_footer(const std::string& key)
{
return this->footers[key];
}
const std::string& get_cookie(const std::string& key)
{
return this->cookies[key];
}
/**
* Method used to get all headers passed with the request.
* @return a map containing all headers.
**/
const std::map& get_headers() const
{
return this->headers;
}
/**
* Method used to get all footers passed with the request.
* @return a map containing all footers.
**/
const std::map& get_footers() const
{
return this->footers;
}
const std::map& get_cookies() const
{
return this->cookies;
}
/**
* Method used to get the response code from the response
* @return The response code
**/
int get_response_code() const
{
return this->response_code;
}
void with_header(const std::string& key, const std::string& value)
{
headers[key] = value;
}
void with_footer(const std::string& key, const std::string& value)
{
footers[key] = value;
}
void with_cookie(const std::string& key, const std::string& value)
{
cookies[key] = value;
}
void shoutCAST();
virtual MHD_Response* get_raw_response();
virtual void decorate_response(MHD_Response* response);
virtual int enqueue_response(MHD_Connection* connection, MHD_Response* response);
protected:
std::string content;
int response_code;
std::map headers;
std::map footers;
std::map cookies;
friend std::ostream &operator