]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[5088] Http response creator and unit tests implemented.
authorMarcin Siodelski <marcin@isc.org>
Wed, 21 Dec 2016 21:27:55 +0000 (22:27 +0100)
committerMarcin Siodelski <marcin@isc.org>
Thu, 22 Dec 2016 13:56:10 +0000 (14:56 +0100)
src/lib/http/Makefile.am
src/lib/http/request.h
src/lib/http/response_creator.cc [new file with mode: 0644]
src/lib/http/response_creator.h
src/lib/http/response_json.h
src/lib/http/tests/Makefile.am
src/lib/http/tests/response_creator_unittests.cc [new file with mode: 0644]

index 50cda161c4f956f14d13811dda3a592ebedbec0d..9cf7d4156d40f9c088608e10d90d07e09acac04e 100644 (file)
@@ -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
index 1ea843edf7d9e43b29754723f9b44149b285f8cd..e821685ba672aeb9a8c2db90bd6afab8fa5288d4 100644 (file)
@@ -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 (file)
index 0000000..fbf9fd8
--- /dev/null
@@ -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 <http/response_creator.h>
+
+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));
+}
+
+}
+}
index 2b83c584f60ef0547e7e3fb6edf5ffcf3a947856..9284232ad1061939075ad33adbe6f05da4f5425f 100644 (file)
@@ -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;
 
 };
 
index 43b3b4f8823cf7b7b05bbe21ab7889f6bddc2542..cf79d3e43744f08c66e365dd2e5e32d1ec1ff96d 100644 (file)
@@ -25,6 +25,8 @@ public:
 
 };
 
+typedef boost::shared_ptr<HttpResponseJson> HttpResponseJsonPtr;
+
 }
 }
 
index 706065d1306d9969afb4e7649b565ac9ea07c22c..2af55d2dea765bb60e22e197d197ff08f4ff823e 100644 (file)
@@ -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 (file)
index 0000000..72400a8
--- /dev/null
@@ -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 <config.h>
+#include <http/request.h>
+#include <http/response.h>
+#include <http/response_creator.h>
+#include <http/response_json.h>
+#include <http/tests/response_test.h>
+#include <boost/shared_ptr.hpp>
+#include <gtest/gtest.h>
+
+using namespace isc::http;
+using namespace isc::http::test;
+
+namespace {
+
+typedef TestHttpResponseBase<HttpResponseJson> Response;
+typedef boost::shared_ptr<Response> 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());
+}
+
+}