diff --git a/src/HttpRequest.cpp b/src/HttpRequest.cpp index f8124f8..c13c5f3 100644 --- a/src/HttpRequest.cpp +++ b/src/HttpRequest.cpp @@ -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; } diff --git a/src/HttpRequest.h b/src/HttpRequest.h index 495ca07..93fdbbc 100644 --- a/src/HttpRequest.h +++ b/src/HttpRequest.h @@ -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 diff --git a/test/test_HttpRequest.cpp b/test/test_HttpRequest.cpp index a9143fc..4e10a84 100644 --- a/test/test_HttpRequest.cpp +++ b/test/test_HttpRequest.cpp @@ -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("*/*")); }