diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 11:36:04 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 11:36:04 +0000 |
commit | 040eee1aa49b49df4698d83a05af57c220127fd1 (patch) | |
tree | f635435954e6ccde5eee9893889e24f30ca68346 /src/lib/http/response_creator.h | |
parent | Initial commit. (diff) | |
download | isc-kea-upstream.tar.xz isc-kea-upstream.zip |
Adding upstream version 2.2.0.upstream/2.2.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/lib/http/response_creator.h')
-rw-r--r-- | src/lib/http/response_creator.h | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/src/lib/http/response_creator.h b/src/lib/http/response_creator.h new file mode 100644 index 0000000..ac212fe --- /dev/null +++ b/src/lib/http/response_creator.h @@ -0,0 +1,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> + +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 |