added assignment operator and const correctness

documentation
Kenneth Barbour 2018-11-29 14:16:44 -05:00
parent a2d06559f4
commit 42b1566785
3 changed files with 71 additions and 11 deletions

View File

@ -3,6 +3,17 @@
HttpRequest::HttpRequest(): method(), url(), httpver(), message(), message_length(0) {}
HttpRequest& HttpRequest::operator=(const HttpRequest& other)
{
if (&other == this) return *this;
this->setMethod(other.getMethod());
this->setUrl(other.getUrl());
this->setHttpVersion(other.getHttpVersion());
this->setMessage(other.getMessage());
memcpy(&this->headers, &other.headers, sizeof(HttpHeaders));
return *this;
}
const char * HttpRequest::setMethod(const char * method)
{
strncpy(this->method, method, HTTPREQUEST_METHOD_SIZE);
@ -27,7 +38,7 @@ const char * HttpRequest::getHttpVersion() const
const char * HttpRequest::setUrl(const char * url, size_t n)
{
if (this->url) free(this->url);
if (this->url != nullptr) free(this->url);
this->url = (char *) malloc(n + 1);
strncpy(this->url, url, n+1);
return this->url;
@ -35,8 +46,13 @@ const char * HttpRequest::setUrl(const char * url, size_t n)
const char * HttpRequest::setUrl(const char * url)
{
size_t len = strlen(url);
return this->setUrl(url, len);
if (url == nullptr) {
if (this->url != nullptr) free(this->url);
this->url = nullptr;
return this->url;
}
size_t len = strlen(url);
return this->setUrl(url, len);
}
const char * HttpRequest::getUrl() const
@ -44,10 +60,15 @@ const char * HttpRequest::getUrl() const
return this->url;
}
const char * HttpRequest::setMessage(const char * message)
const char * HttpRequest::setMessage(const char * str)
{
size_t len = strlen(message);
return this->setMessage(message, len);
if (str == nullptr) {
this->message = nullptr;
message_length = 0;
return this->message;
}
size_t len = strlen(str);
return this->setMessage(str, len);
}
const char * HttpRequest::setMessage(const char * message, unsigned int n)
@ -59,7 +80,7 @@ const char * HttpRequest::setMessage(const char * message, unsigned int n)
return this->message;
}
const char * HttpRequest::getMessage()
const char * HttpRequest::getMessage() const
{
return this->message;
}

View File

@ -28,8 +28,9 @@ class HttpRequest
const char * getHttpVersion() const;
const char * setMessage(const char *);
const char * setMessage(const char *, unsigned int);
const char * getMessage();
const char * getMessage() const;
unsigned int getMessageLength() { return message_length; };
HttpRequest& operator=(const HttpRequest& other);
char method [HTTPREQUEST_METHOD_SIZE];
char * url;
char httpver [HTTPREQUEST_HTTPVER_SIZE]; // TODO: private

View File

@ -4,7 +4,7 @@
#include "DummyStream.h"
using Catch::Matchers::Equals;
TEST_CASE("Test get/set method","[HttpRequest]")
{
@ -20,6 +20,22 @@ TEST_CASE("Test get/set url","[HttpRequest]")
CHECK_THAT(req.getUrl(), Equals("/foo"));
}
TEST_CASE("Set url to nullptr", "[HttpRequest]")
{
HttpRequest req;
req.setUrl(nullptr);
bool isnull = (req.getUrl() == nullptr);
CHECK(isnull);
}
TEST_CASE("Set url multiple times", "[HttpRequest][HttpRequest::setUrl]")
{
HttpRequest req;
req.setUrl("/foo");
req.setUrl("/barbaz");
CHECK_THAT(req.getUrl(), Equals("/barbaz"));
}
TEST_CASE("Test get/set short url", "[HttpRequest]")
{
HttpRequest req;
@ -35,12 +51,34 @@ TEST_CASE("Test get/set message","[HttpRequest]")
CHECK(req.getMessageLength() == 9);
}
TEST_CASE("HttpRequest reassignment", "[HttpRequest]")
TEST_CASE("HttpRequest empty reassignment", "[HttpRequest][HttpRequest-reassign]")
{
HttpRequest req;
req.setUrl("/");
req.setMethod("GET");
req = HttpRequest();
CHECK(req.getUrl() == nullptr);
bool isnull = (req.getUrl() == nullptr);
CHECK(isnull);
}
TEST_CASE("HttpRequest reassignment", "[HttpRequest][HttpRequest-reassign]")
{
HttpRequest req;
req.setUrl("/foo/bar");
req.setMethod("POST");
req.setMessage("foo=bar&baz=qux");
req.headers.set("Accept","*/*");
HttpRequest req2;
req2.setUrl("/not/foo");
req2.setMethod("GET");
req2.headers.set("Content-Type","bar");
req2 = req;
CHECK_THAT(req2.getMethod(), Equals("POST"));
CHECK_THAT(req2.getMessage(), Equals("foo=bar&baz=qux"));
CHECK_THAT(req2.getUrl(), Equals("/foo/bar"));
CHECK(req2.headers.has("Accept"));
CHECK(!req2.headers.has("Content-Type"));
CHECK_THAT(req2.headers.get("Accept"), Equals("*/*"));
}