Parcourir la source

[5088] Http response creator and unit tests implemented.

Marcin Siodelski il y a 8 ans
Parent
commit
8886ab68c1

+ 1 - 1
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

+ 10 - 0
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:

+ 26 - 0
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 <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));
+}
+
+}
+}

+ 9 - 1
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;
 
 };
 

+ 2 - 0
src/lib/http/response_json.h

@@ -25,6 +25,8 @@ public:
 
 };
 
+typedef boost::shared_ptr<HttpResponseJson> HttpResponseJsonPtr;
+
 }
 }
 

+ 1 - 0
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

+ 77 - 0
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 <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());
+}
+
+}