-// Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2016-2019 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
///
/// @param body new body value.
void setBody(const std::string& body = "") {
- request_.context()->body_ = body.empty() ? json_body_ : body;
+ request_->context()->body_ = body.empty() ? json_body_ : body;
}
/// @brief Default value of the JSON body.
addHeaderToContext("Content-Length", json_body_.length());
addHeaderToContext("Content-Type", "application/json");
- ASSERT_THROW(request_.create(), HttpRequestError);
+ ASSERT_THROW(request_->create(), HttpRequestError);
// Now use POST. It should be accepted.
setContextBasics("POST", "/isc/org", HttpVersion(1, 0));
addHeaderToContext("Content-Length", json_body_.length());
addHeaderToContext("Content-Type", "application/json");
- EXPECT_NO_THROW(request_.create());
+ EXPECT_NO_THROW(request_->create());
}
// This test verifies that PostHttpRequest requires "Content-Length"
addHeaderToContext("Content-Length", json_body_.length());
addHeaderToContext("Content-Type", "text/html");
- ASSERT_THROW(request_.create(), HttpRequestError);
+ ASSERT_THROW(request_->create(), HttpRequestError);
// This time specify correct "Content-Type". It should pass.
setContextBasics("POST", "/isc/org", HttpVersion(1, 0));
addHeaderToContext("Content-Length", json_body_.length());
addHeaderToContext("Content-Type", "application/json");
- EXPECT_NO_THROW(request_.create());
+ EXPECT_NO_THROW(request_->create());
}
// This test verifies that PostHttpRequest requires "Content-Length"
setContextBasics("POST", "/isc/org", HttpVersion(1, 0));
addHeaderToContext("Content-Type", "text/html");
- ASSERT_THROW(request_.create(), HttpRequestError);
+ ASSERT_THROW(request_->create(), HttpRequestError);
// Specify "Content-Length". It should pass.
setContextBasics("POST", "/isc/org", HttpVersion(1, 0));
addHeaderToContext("Content-Type", "application/json");
setBody();
- ASSERT_NO_THROW(request_.finalize());
+ ASSERT_NO_THROW(request_->finalize());
// Try to retrieve pointer to the root element of the JSON body.
- ConstElementPtr json = request_.getBodyAsJson();
+ ConstElementPtr json = request_->getBodyAsJson();
ASSERT_TRUE(json);
// Iterate over JSON values and store them in a simple map.
// No colon before 123.
setBody("{ \"command\" 123 }" );
- EXPECT_THROW(request_.finalize(), HttpRequestJsonError);
+ EXPECT_THROW(request_->finalize(), HttpRequestJsonError);
}
// This test verifies that NULL pointer is returned when trying to
addHeaderToContext("Content-Length", json_body_.length());
addHeaderToContext("Content-Type", "application/json");
- ASSERT_NO_THROW(request_.finalize());
+ ASSERT_NO_THROW(request_->finalize());
- ConstElementPtr json = request_.getBodyAsJson();
+ ConstElementPtr json = request_->getBodyAsJson();
EXPECT_FALSE(json);
}
addHeaderToContext("Content-Type", "application/json");
setBody();
- ASSERT_NO_THROW(request_.finalize());
+ ASSERT_NO_THROW(request_->finalize());
ConstElementPtr element;
- ASSERT_NO_THROW(element = request_.getJsonElement("service"));
+ ASSERT_NO_THROW(element = request_->getJsonElement("service"));
ASSERT_TRUE(element);
EXPECT_EQ("dhcp4", element->stringValue());
// An attempt to retrieve non-existing element should return NULL.
- EXPECT_FALSE(request_.getJsonElement("bar"));
+ EXPECT_FALSE(request_->getJsonElement("bar"));
}
// This test verifies that it is possible to create client side request
// containing JSON body.
TEST_F(PostHttpRequestJsonTest, clientRequest) {
- request_.setDirection(HttpMessage::OUTBOUND);
+ request_->setDirection(HttpMessage::OUTBOUND);
setContextBasics("POST", "/isc/org", HttpVersion(1, 0));
addHeaderToContext("Content-Type", "application/json");
ElementPtr json = Element::fromJSON(json_body_);
- request_.setBodyAsJson(json);
+ request_->setBodyAsJson(json);
// Commit and validate the data.
- ASSERT_NO_THROW(request_.finalize());
+ ASSERT_NO_THROW(request_->finalize());
std::ostringstream expected_request_text;
expected_request_text << "POST /isc/org HTTP/1.0\r\n"
"\r\n"
<< json->str();
- EXPECT_EQ(expected_request_text.str(), request_.toString());
+ EXPECT_EQ(expected_request_text.str(), request_->toString());
}
}
addHeaderToContext(http_header.getName(), http_header.getValue());
}
// Attach JSON body.
- request_.context()->body_ = json_body;
- request_.create();
+ request_->context()->body_ = json_body;
+ request_->create();
} catch (...) {
ADD_FAILURE() << "failed to create HTTP request while testing"
" connection persistence";
}
- return (request_.isPersistent());
+ return (request_->isPersistent());
}
};
// This test verifies that a minimal request can be created.
TEST_F(HttpRequestTest, minimal) {
setContextBasics("GET", "/isc/org", HttpVersion(1, 1));
- ASSERT_NO_THROW(request_.create());
+ ASSERT_NO_THROW(request_->create());
- EXPECT_EQ(HttpRequest::Method::HTTP_GET, request_.getMethod());
- EXPECT_EQ("/isc/org", request_.getUri());
- EXPECT_EQ(1, request_.getHttpVersion().major_);
- EXPECT_EQ(1, request_.getHttpVersion().minor_);
+ EXPECT_EQ(HttpRequest::Method::HTTP_GET, request_->getMethod());
+ EXPECT_EQ("/isc/org", request_->getUri());
+ EXPECT_EQ(1, request_->getHttpVersion().major_);
+ EXPECT_EQ(1, request_->getHttpVersion().minor_);
- EXPECT_THROW(request_.getHeaderValue("Content-Length"),
+ EXPECT_THROW(request_->getHeaderValue("Content-Length"),
HttpMessageNonExistingHeader);
}
// This test verifies that empty Host header is included in the
// request if it is not explicitly specified.
TEST_F(HttpRequestTest, hostHeaderDefault) {
- HttpRequestPtr request;
- ASSERT_NO_THROW(request.reset(new HttpRequest(HttpRequest::Method::HTTP_GET,
- "/isc/org",
- HttpVersion(1, 0))));
+ ASSERT_NO_THROW(request_.reset(new HttpRequest(HttpRequest::Method::HTTP_GET,
+ "/isc/org",
+ HttpVersion(1, 0))));
- ASSERT_NO_THROW(request->finalize());
+ ASSERT_NO_THROW(request_->finalize());
- EXPECT_EQ(HttpRequest::Method::HTTP_GET, request->getMethod());
- EXPECT_EQ("/isc/org", request->getUri());
- EXPECT_EQ(1, request->getHttpVersion().major_);
- EXPECT_EQ(0, request->getHttpVersion().minor_);
+ EXPECT_EQ(HttpRequest::Method::HTTP_GET, request_->getMethod());
+ EXPECT_EQ("/isc/org", request_->getUri());
+ EXPECT_EQ(1, request_->getHttpVersion().major_);
+ EXPECT_EQ(0, request_->getHttpVersion().minor_);
std::string host_hdr;
- ASSERT_NO_THROW(host_hdr = request->getHeaderValue("Host"));
+ ASSERT_NO_THROW(host_hdr = request_->getHeaderValue("Host"));
EXPECT_TRUE(host_hdr.empty());
}
// This test verifies that it is possible to explicitly specify a
// Host header value while creating a request.
TEST_F(HttpRequestTest, hostHeaderCustom) {
- HttpRequestPtr request;
- ASSERT_NO_THROW(request.reset(new HttpRequest(HttpRequest::Method::HTTP_GET,
- "/isc/org",
- HttpVersion(1, 1),
- HostHttpHeader("www.example.org"))));
+ ASSERT_NO_THROW(request_.reset(new HttpRequest(HttpRequest::Method::HTTP_GET,
+ "/isc/org",
+ HttpVersion(1, 1),
+ HostHttpHeader("www.example.org"))));
- ASSERT_NO_THROW(request->finalize());
+ ASSERT_NO_THROW(request_->finalize());
- EXPECT_EQ(HttpRequest::Method::HTTP_GET, request->getMethod());
- EXPECT_EQ("/isc/org", request->getUri());
- EXPECT_EQ(1, request->getHttpVersion().major_);
- EXPECT_EQ(1, request->getHttpVersion().minor_);
+ EXPECT_EQ(HttpRequest::Method::HTTP_GET, request_->getMethod());
+ EXPECT_EQ("/isc/org", request_->getUri());
+ EXPECT_EQ(1, request_->getHttpVersion().major_);
+ EXPECT_EQ(1, request_->getHttpVersion().minor_);
std::string host_hdr;
- ASSERT_NO_THROW(host_hdr = request->getHeaderValue("Host"));
+ ASSERT_NO_THROW(host_hdr = request_->getHeaderValue("Host"));
EXPECT_EQ("www.example.org", host_hdr);
}
setContextBasics("POST", "/isc/org", HttpVersion(1, 0));
addHeaderToContext("Content-Length", "1024");
addHeaderToContext("Content-Type", "application/json");
- ASSERT_NO_THROW(request_.create());
+ ASSERT_NO_THROW(request_->create());
- EXPECT_EQ(HttpRequest::Method::HTTP_POST, request_.getMethod());
- EXPECT_EQ("/isc/org", request_.getUri());
- EXPECT_EQ(1, request_.getHttpVersion().major_);
- EXPECT_EQ(0, request_.getHttpVersion().minor_);
+ EXPECT_EQ(HttpRequest::Method::HTTP_POST, request_->getMethod());
+ EXPECT_EQ("/isc/org", request_->getUri());
+ EXPECT_EQ(1, request_->getHttpVersion().major_);
+ EXPECT_EQ(0, request_->getHttpVersion().minor_);
std::string content_type;
- ASSERT_NO_THROW(content_type = request_.getHeaderValue("Content-Type"));
+ ASSERT_NO_THROW(content_type = request_->getHeaderValue("Content-Type"));
EXPECT_EQ("application/json", content_type);
uint64_t content_length;
ASSERT_NO_THROW(
- content_length = request_.getHeaderValueAsUint64("Content-Length")
+ content_length = request_->getHeaderValueAsUint64("Content-Length")
);
EXPECT_EQ(1024, content_length);
}
// methods for the request and that an error is thrown if the
// selected method doesn't match.
TEST_F(HttpRequestTest, requiredMethods) {
- request_.requireHttpMethod(HttpRequest::Method::HTTP_GET);
- request_.requireHttpMethod(HttpRequest::Method::HTTP_POST);
+ request_->requireHttpMethod(HttpRequest::Method::HTTP_GET);
+ request_->requireHttpMethod(HttpRequest::Method::HTTP_POST);
setContextBasics("GET", "/isc/org", HttpVersion(1, 1));
- ASSERT_NO_THROW(request_.create());
+ ASSERT_NO_THROW(request_->create());
- request_.context()->method_ = "POST";
- ASSERT_NO_THROW(request_.create());
+ request_->context()->method_ = "POST";
+ ASSERT_NO_THROW(request_->create());
- request_.context()->method_ = "PUT";
- EXPECT_THROW(request_.create(), HttpRequestError);
+ request_->context()->method_ = "PUT";
+ EXPECT_THROW(request_->create(), HttpRequestError);
}
// This test verifies that it is possible to specify required
// HTTP version for the request and that an error is thrown if
// the selected HTTP version doesn't match.
TEST_F(HttpRequestTest, requiredHttpVersion) {
- request_.requireHttpVersion(HttpVersion(1, 0));
- request_.requireHttpVersion(HttpVersion(1, 1));
+ request_->requireHttpVersion(HttpVersion(1, 0));
+ request_->requireHttpVersion(HttpVersion(1, 1));
setContextBasics("POST", "/isc/org", HttpVersion(1, 0));
- EXPECT_NO_THROW(request_.create());
+ EXPECT_NO_THROW(request_->create());
setContextBasics("POST", "/isc/org", HttpVersion(1, 1));
- EXPECT_NO_THROW(request_.create());
+ EXPECT_NO_THROW(request_->create());
setContextBasics("POST", "/isc/org", HttpVersion(2, 0));
- EXPECT_THROW(request_.create(), HttpRequestError);
+ EXPECT_THROW(request_->create(), HttpRequestError);
}
// This test verifies that it is possible to specify required
// HTTP headers for the request and that an error is thrown if
// the required header is not included.
TEST_F(HttpRequestTest, requiredHeader) {
- request_.requireHeader("Content-Length");
+ request_->requireHeader("Content-Length");
setContextBasics("POST", "/isc/org", HttpVersion(1, 0));
- ASSERT_THROW(request_.create(), HttpRequestError);
+ ASSERT_THROW(request_->create(), HttpRequestError);
addHeaderToContext("Content-Type", "application/json");
- ASSERT_THROW(request_.create(), HttpRequestError);
+ ASSERT_THROW(request_->create(), HttpRequestError);
addHeaderToContext("Content-Length", "2048");
- EXPECT_NO_THROW(request_.create());
+ EXPECT_NO_THROW(request_->create());
}
// This test verifies that it is possible to specify required
// HTTP header value for the request and that an error is thrown
// if the value doesn't match.
TEST_F(HttpRequestTest, requiredHeaderValue) {
- request_.requireHeaderValue("Content-Type", "application/json");
+ request_->requireHeaderValue("Content-Type", "application/json");
setContextBasics("POST", "/isc/org", HttpVersion(1, 0));
addHeaderToContext("Content-Type", "text/html");
- ASSERT_THROW(request_.create(), HttpRequestError);
+ ASSERT_THROW(request_->create(), HttpRequestError);
addHeaderToContext("Content-Type", "application/json");
- EXPECT_NO_THROW(request_.create());
+ EXPECT_NO_THROW(request_->create());
}
// This test verifies that an error is thrown upon an attempt to
addHeaderToContext("Content-Type", "text/html");
addHeaderToContext("Content-Length", "1024");
- EXPECT_THROW(static_cast<void>(request_.getMethod()), HttpMessageError);
- EXPECT_THROW(static_cast<void>(request_.getHttpVersion()),
+ EXPECT_THROW(static_cast<void>(request_->getMethod()), HttpMessageError);
+ EXPECT_THROW(static_cast<void>(request_->getHttpVersion()),
HttpMessageError);
- EXPECT_THROW(static_cast<void>(request_.getUri()), HttpMessageError);
- EXPECT_THROW(static_cast<void>(request_.getHeaderValue("Content-Type")),
+ EXPECT_THROW(static_cast<void>(request_->getUri()), HttpMessageError);
+ EXPECT_THROW(static_cast<void>(request_->getHeaderValue("Content-Type")),
HttpMessageError);
- EXPECT_THROW(static_cast<void>(request_.getHeaderValueAsUint64("Content-Length")),
+ EXPECT_THROW(static_cast<void>(request_->getHeaderValueAsUint64("Content-Length")),
HttpMessageError);
- EXPECT_THROW(static_cast<void>(request_.getBody()), HttpMessageError);
+ EXPECT_THROW(static_cast<void>(request_->getBody()), HttpMessageError);
- ASSERT_NO_THROW(request_.finalize());
+ ASSERT_NO_THROW(request_->finalize());
- EXPECT_NO_THROW(static_cast<void>(request_.getMethod()));
- EXPECT_NO_THROW(static_cast<void>(request_.getHttpVersion()));
- EXPECT_NO_THROW(static_cast<void>(request_.getUri()));
- EXPECT_NO_THROW(static_cast<void>(request_.getHeaderValue("Content-Type")));
+ EXPECT_NO_THROW(static_cast<void>(request_->getMethod()));
+ EXPECT_NO_THROW(static_cast<void>(request_->getHttpVersion()));
+ EXPECT_NO_THROW(static_cast<void>(request_->getUri()));
+ EXPECT_NO_THROW(static_cast<void>(request_->getHeaderValue("Content-Type")));
EXPECT_NO_THROW(
- static_cast<void>(request_.getHeaderValueAsUint64("Content-Length"))
+ static_cast<void>(request_->getHeaderValueAsUint64("Content-Length"))
);
- EXPECT_NO_THROW(static_cast<void>(request_.getBody()));
+ EXPECT_NO_THROW(static_cast<void>(request_->getBody()));
}
// This test verifies that it is possible to fetch the request
setContextBasics("POST", "/isc/org", HttpVersion(1, 0));
addHeaderToContext("Content-Length", json_body.length());
- request_.context()->body_ = json_body;
+ request_->context()->body_ = json_body;
- ASSERT_NO_THROW(request_.finalize());
+ ASSERT_NO_THROW(request_->finalize());
- EXPECT_EQ(json_body, request_.getBody());
+ EXPECT_EQ(json_body, request_->getBody());
}
// This test verifies the behavior of the requiresBody function.
TEST_F(HttpRequestTest, requiresBody) {
- ASSERT_FALSE(request_.requiresBody());
- request_.requireHeader("Content-Length");
- EXPECT_TRUE(request_.requiresBody());
+ ASSERT_FALSE(request_->requiresBody());
+ request_->requireHeader("Content-Length");
+ EXPECT_TRUE(request_->requiresBody());
}
// This test verifies that HTTP/1.0 connections are not persistent
// This test verifies the contents of the HTTP outbound request.
TEST_F(HttpRequestTest, clientRequest) {
- request_.setDirection(HttpMessage::OUTBOUND);
+ request_->setDirection(HttpMessage::OUTBOUND);
setContextBasics("POST", "/isc/org", HttpVersion(1, 0));
// Capture current date and time.
HttpDateTime date_time;
// Add headers.
- request_.context()->headers_.push_back(HttpHeaderContext("Date", date_time.rfc1123Format()));
- request_.context()->headers_.push_back(HttpHeaderContext("Content-Type", "text/html"));
- request_.context()->headers_.push_back(HttpHeaderContext("Accept", "text/html"));
+ request_->context()->headers_.push_back(HttpHeaderContext("Date", date_time.rfc1123Format()));
+ request_->context()->headers_.push_back(HttpHeaderContext("Content-Type", "text/html"));
+ request_->context()->headers_.push_back(HttpHeaderContext("Accept", "text/html"));
// Add a body.
- request_.context()->body_ = "<html></html>";
+ request_->context()->body_ = "<html></html>";
// Commit and validate the data.
- ASSERT_NO_THROW(request_.finalize());
+ ASSERT_NO_THROW(request_->finalize());
// Check that the HTTP request in the textual format is correct. Note that
// it should include "Content-Length", even though we haven't explicitly set
"Date: " + date_time.rfc1123Format() + "\r\n"
"\r\n"
"<html></html>",
- request_.toString());
+ request_->toString());
}
// This test verifies the contents of the HTTP outbound request
TEST_F(HttpRequestTest, clientRequestNoBody) {
setContextBasics("GET", "/isc/org", HttpVersion(1, 1));
// Add headers.
- request_.context()->headers_.push_back(HttpHeaderContext("Content-Type", "text/html"));
+ request_->context()->headers_.push_back(HttpHeaderContext("Content-Type", "text/html"));
// Commit and validate the data.
- ASSERT_NO_THROW(request_.finalize());
+ ASSERT_NO_THROW(request_->finalize());
// Check that the HTTP request in the textual format is correct. Note that
// there should be no Content-Length included, because the body is empty.
EXPECT_EQ("GET /isc/org HTTP/1.1\r\n"
"Content-Type: text/html\r\n"
"\r\n",
- request_.toString());
+ request_->toString());
}
// This test verifies the first line of the HTTP request.
// Create the request.
setContextBasics("POST", "/isc/org", HttpVersion(1, 1));
// Add headers.
- request_.context()->headers_.push_back(HttpHeaderContext("Content-Type", "application/json"));
+ request_->context()->headers_.push_back(HttpHeaderContext("Content-Type", "application/json"));
// Must be finalized before can be used.
- ASSERT_NO_THROW(request_.finalize());
+ ASSERT_NO_THROW(request_->finalize());
// Check that the brief string is correct.
- EXPECT_EQ("POST /isc/org HTTP/1.1", request_.toBriefString());
+ EXPECT_EQ("POST /isc/org HTTP/1.1", request_->toBriefString());
}
}