1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// Copyright (C) 2016-2020 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.

#ifndef HTTP_RESPONSE_CREATOR_H
#define HTTP_RESPONSE_CREATOR_H

#include <http/request.h>
#include <http/response.h>
#include <boost/shared_ptr.hpp><--- Include file:  not found. Please note: Cppcheck does not need standard library headers to get proper results.

namespace isc {
namespace http {

class HttpResponseCreator;

/// @brief Pointer to the @ref HttpResponseCreator object.
typedef boost::shared_ptr<HttpResponseCreator> HttpResponseCreatorPtr;

/// @brief Specifies an interface for classes creating HTTP responses
/// from HTTP requests.
///
/// HTTP is designed to carry various content types. Most commonly
/// this is text/html. In Kea, the application/json content type is used
/// to carry control commands in JSON format. The libkea-http library is
/// meant to be generic and provide means for transferring different types
/// of content, depending on the use case.
///
/// This abstract class specifies a common interface for generating HTTP
/// responses from HTTP requests using specific content type and being
/// used in some specific context. Kea modules providing HTTP services need to
/// implement their specific derivations of the @ref HttpResponseCreator
/// class. These derivations use classes derived from @ref HttpRequest as
/// an input and classes derived from @ref HttpResponse as an output of
/// @c createHttpResponse method.
class HttpResponseCreator {
public:

    /// @brief Destructor.
    ///
    /// Classes with virtual functions need virtual destructors.
    virtual ~HttpResponseCreator() { };

    /// @brief Create HTTP response from HTTP request received.
    ///
    /// This class implements a generic logic for creating a HTTP response.
    /// Derived classes do not override this method. They merely implement
    /// the methods it calls.
    ///
    /// The request processing may generally fail at one of the two stages:
    /// parsing or interpretation of the parsed request. During the former
    /// stage the request's syntax is checked, i.e. HTTP version, URI,
    /// headers etc. During the latter stage the HTTP server checks if the
    /// request is valid within the specific context, e.g. valid HTTP version
    /// used, expected content type etc.
    ///
    /// In the @ref HttpRequest terms, the request has gone through the
    /// first stage if it is "finalized" (see @ref HttpRequest::finalize).
    /// This method accepts instances of both finalized and not finalized
    /// requests. If the request isn't finalized it indicates that
    /// the request parsing has failed. In such case, this method calls
    /// @c createStockBadRequest to generate a response with HTTP 400 status
    /// code. If the request is finalized, this method calls
    /// @c createDynamicHttpResponse to generate implementation specific
    /// response to the received request.
    ///
    /// This method is marked virtual final to prevent derived classes from
    /// overriding this method. Instead, the derived classes must implement
    /// protected methods which this method calls.
    ///
    /// @param request Pointer to an object representing HTTP request.
    /// @return Pointer to the object encapsulating generated HTTP response.
    /// @throw HttpResponseError if request is a NULL pointer.
    virtual HttpResponsePtr
    createHttpResponse(HttpRequestPtr request) final;

    /// @brief Create a new request.
    ///
    /// This method creates an instance of the @ref HttpRequest or derived
    /// class. The type of the object is compatible with the instance of
    /// the @ref HttpResponseCreator implementation which creates it, i.e.
    /// can be used as an argument in the call to @ref createHttpResponse.
    ///
    /// @return Pointer to the new instance of the @ref HttpRequest.
    virtual HttpRequestPtr
    createNewHttpRequest() const = 0;

    /// @brief Creates implementation specific HTTP response.
    ///
    /// @param request Pointer to an object representing HTTP request.
    /// @param status_code Status code of the response.
    /// @return Pointer to an object representing HTTP response.
    virtual HttpResponsePtr
    createStockHttpResponse(const HttpRequestPtr& request,
                            const HttpStatusCode& status_code) const = 0;

protected:

    /// @brief Creates implementation specific HTTP response.
    ///
    /// @param request Pointer to an object representing HTTP request.
    /// @return Pointer to an object representing HTTP response.
    virtual HttpResponsePtr
    createDynamicHttpResponse(HttpRequestPtr request) = 0;

};

} // namespace http
} // namespace isc

#endif