From 8886ab68c115c6ff6e87426da36c56c19d68ecad Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Wed, 21 Dec 2016 22:27:55 +0100 Subject: [PATCH] [5088] Http response creator and unit tests implemented. --- src/lib/http/Makefile.am | 2 +- src/lib/http/request.h | 10 +++ src/lib/http/response_creator.cc | 26 +++++++ src/lib/http/response_creator.h | 10 ++- src/lib/http/response_json.h | 2 + src/lib/http/tests/Makefile.am | 1 + .../http/tests/response_creator_unittests.cc | 77 +++++++++++++++++++ 7 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 src/lib/http/response_creator.cc create mode 100644 src/lib/http/tests/response_creator_unittests.cc diff --git a/src/lib/http/Makefile.am b/src/lib/http/Makefile.am index 50cda161c4..9cf7d4156d 100644 --- a/src/lib/http/Makefile.am +++ b/src/lib/http/Makefile.am @@ -32,7 +32,7 @@ libkea_http_la_SOURCES += request.cc request.h libkea_http_la_SOURCES += request_context.h libkea_http_la_SOURCES += request_parser.cc request_parser.h libkea_http_la_SOURCES += response.cc response.h -libkea_http_la_SOURCES += response_creator.h +libkea_http_la_SOURCES += response_creator.cc response_creator.h libkea_http_la_SOURCES += response_json.cc response_json.h nodist_libkea_http_la_SOURCES = http_messages.cc http_messages.h diff --git a/src/lib/http/request.h b/src/lib/http/request.h index 1ea843edf7..e821685ba6 100644 --- a/src/lib/http/request.h +++ b/src/lib/http/request.h @@ -199,6 +199,16 @@ public: /// @brief Returns HTTP message body as string. std::string getBody() const; + /// @brief Checks if the request has been successfully finalized. + /// + /// The request is gets finalized on successfull call to + /// @ref HttpRequest::finalize. + /// + /// @return true if the request has been finalized, false otherwise. + bool isFinalized() const { + return (finalized_); + } + //@} protected: diff --git a/src/lib/http/response_creator.cc b/src/lib/http/response_creator.cc new file mode 100644 index 0000000000..fbf9fd8b51 --- /dev/null +++ b/src/lib/http/response_creator.cc @@ -0,0 +1,26 @@ +// Copyright (C) 2016 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/. + +#include + +namespace isc { +namespace http { + +HttpResponsePtr +HttpResponseCreator::createHttpResponse(const ConstHttpRequestPtr& request) { + if (!request) { + isc_throw(HttpResponseError, "internal server error: HTTP request is null"); + } + + if (!request->isFinalized()) { + return (createStockBadRequest(request)); + } + + return (createDynamicHttpResponse(request)); +} + +} +} diff --git a/src/lib/http/response_creator.h b/src/lib/http/response_creator.h index 2b83c584f6..9284232ad1 100644 --- a/src/lib/http/response_creator.h +++ b/src/lib/http/response_creator.h @@ -18,7 +18,15 @@ public: virtual ~HttpResponseCreator() { }; - virtual HttpResponsePtr create(const ConstHttpRequestPtr& request) = 0; + HttpResponsePtr createHttpResponse(const ConstHttpRequestPtr& request); + +protected: + + virtual HttpResponsePtr + createStockBadRequest(const ConstHttpRequestPtr& request) const = 0; + + virtual HttpResponsePtr + createDynamicHttpResponse(const ConstHttpRequestPtr& request) = 0; }; diff --git a/src/lib/http/response_json.h b/src/lib/http/response_json.h index 43b3b4f882..cf79d3e437 100644 --- a/src/lib/http/response_json.h +++ b/src/lib/http/response_json.h @@ -25,6 +25,8 @@ public: }; +typedef boost::shared_ptr HttpResponseJsonPtr; + } } diff --git a/src/lib/http/tests/Makefile.am b/src/lib/http/tests/Makefile.am index 706065d130..2af55d2dea 100644 --- a/src/lib/http/tests/Makefile.am +++ b/src/lib/http/tests/Makefile.am @@ -24,6 +24,7 @@ libhttp_unittests_SOURCES = date_time_unittests.cc libhttp_unittests_SOURCES += post_request_json_unittests.cc libhttp_unittests_SOURCES += request_parser_unittests.cc libhttp_unittests_SOURCES += request_test.h +libhttp_unittests_SOURCES += response_creator_unittests.cc libhttp_unittests_SOURCES += response_test.h libhttp_unittests_SOURCES += request_unittests.cc libhttp_unittests_SOURCES += response_unittests.cc diff --git a/src/lib/http/tests/response_creator_unittests.cc b/src/lib/http/tests/response_creator_unittests.cc new file mode 100644 index 0000000000..72400a8f8b --- /dev/null +++ b/src/lib/http/tests/response_creator_unittests.cc @@ -0,0 +1,77 @@ +// Copyright (C) 2016 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/. + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace isc::http; +using namespace isc::http::test; + +namespace { + +typedef TestHttpResponseBase Response; +typedef boost::shared_ptr ResponsePtr; + +class TestHttpResponseCreator : public HttpResponseCreator { +private: + + virtual HttpResponsePtr + createStockBadRequest(const ConstHttpRequestPtr& request) const { + HttpVersion http_version(request->context()->http_version_major_, + request->context()->http_version_minor_); + ResponsePtr response(new Response(http_version, + HttpStatusCode::BAD_REQUEST)); + return (response); + } + + virtual HttpResponsePtr + createDynamicHttpResponse(const ConstHttpRequestPtr& request) { + ResponsePtr response(new Response(request->getHttpVersion(), + HttpStatusCode::OK)); + return (response); + } +}; + +TEST(HttpResponseCreatorTest, badRequest) { + HttpResponsePtr response; + HttpRequestPtr request(new HttpRequest()); + TestHttpResponseCreator creator; + ASSERT_NO_THROW(response = creator.createHttpResponse(request)); + ASSERT_TRUE(response); + + EXPECT_EQ("HTTP/0.0 400 Bad Request\r\n" + "Content-Type: application/json\r\n" + "Date: Tue, 19 Dec 2016 18:53:35 GMT\r\n" + "Content-Length: 40\r\n\r\n" + "{ \"result\": 400, \"text\": \"Bad Request\" }", response->toString()); +} + +TEST(HttpResponseCreatorTest, goodRequest) { + HttpResponsePtr response; + HttpRequestPtr request(new HttpRequest()); + request->context()->http_version_major_ = 1; + request->context()->http_version_minor_ = 0; + request->context()->method_ = "GET"; + request->context()->uri_ = "/foo"; + ASSERT_NO_THROW(request->finalize()); + + TestHttpResponseCreator creator; + ASSERT_NO_THROW(response = creator.createHttpResponse(request)); + ASSERT_TRUE(response); + + EXPECT_EQ("HTTP/1.0 200 OK\r\n" + "Content-Type: application/json\r\n" + "Date: Tue, 19 Dec 2016 18:53:35 GMT\r\n\r\n", + response->toString()); +} + +} -- 2.47.3