diff --git a/src/HttpRequest.h b/src/HttpRequest.h index 642bbf3..6af38a0 100644 --- a/src/HttpRequest.h +++ b/src/HttpRequest.h @@ -24,15 +24,15 @@ class HttpRequest const char * setUrl(const char *); const char * setUrl(const char *, size_t); const char * getUrl(); - const char * setHttpVer(const char *); - const char * getHttpVer(); + const char * setHttpVer(const char *); // TODO: setHttpVersion() + const char * getHttpVer(); // TODO: getHttpVersion() const char * setMessage(const char *); const char * setMessage(const char *, unsigned int); const char * getMessage(); unsigned int getMessageLength() { return message_length; }; char method [HTTPREQUEST_METHOD_SIZE]; char * url; - char httpver [HTTPREQUEST_HTTPVER_SIZE]; + char httpver [HTTPREQUEST_HTTPVER_SIZE]; // TODO: private HttpHeaders headers; protected: long int message_length; diff --git a/src/HttpResponse.cpp b/src/HttpResponse.cpp index 07a0f24..070af10 100644 --- a/src/HttpResponse.cpp +++ b/src/HttpResponse.cpp @@ -1,21 +1,50 @@ #include "HttpResponse.h" -HttpResponse::HttpResponse(Buffer & buffer): buffer(&buffer), code(200), reason() {}; +/** + * TODO: this is the only constructor really needed unless _TEST_ + */ +HttpResponse::HttpResponse(Buffer & buffer): + buffer(&buffer), + code(200), + reason(), + httpver() +{}; -HttpResponse::HttpResponse(Buffer & buffer, unsigned int code): buffer(&buffer), code(code), reason() {}; +HttpResponse::HttpResponse(Buffer & buffer, unsigned int code): + buffer(&buffer), + code(code), + reason(), + httpver() +{}; -HttpResponse::HttpResponse(Buffer & buffer, unsigned int code, const char * reason) - :buffer(&buffer), code(code), reason() +HttpResponse::HttpResponse(Buffer & buffer, unsigned int code, const char * reason): + buffer(&buffer), + code(code), + reason(), + httpver() { setReason(reason); } -HttpResponse::HttpResponse(): buffer(), code(200), reason() {}; +HttpResponse::HttpResponse(): + buffer(), + code(200), + reason(), + httpver() +{}; -HttpResponse::HttpResponse(unsigned int code): buffer(), code(code), reason() {} +HttpResponse::HttpResponse(unsigned int code): + buffer(), + code(code), + reason(), + httpver() +{} -HttpResponse::HttpResponse(unsigned int code, const char * reason) - : buffer(), code(code), reason() +HttpResponse::HttpResponse(unsigned int code, const char * reason): + buffer(), + code(code), + reason(), + httpver() { setReason(reason); } @@ -36,6 +65,18 @@ const char * HttpResponse::getReason() const return HttpResponse::getDefaultReason(code); } +const char * HttpResponse::setHttpVersion(const char * version) +{ + strncpy(httpver, version, HTTPRESPONSE_HTTPVER_SIZE - 1); + httpver[HTTPRESPONSE_HTTPVER_SIZE - 1] = '\0'; + return httpver; +} + +const char * HttpResponse::getHttpVersion() const +{ + return httpver; +} + const char * HttpResponse::getDefaultReason(unsigned int code) { switch(code) { @@ -101,6 +142,8 @@ size_t HttpResponse::write(uint8_t * data, size_t len) size_t HttpResponse::printTo(Print& client) const { size_t len = 0; + len += client.print(getHttpVersion()); + len += client.print(' '); len += client.print((int) code); len += client.print(' '); len += client.println(getReason()); diff --git a/src/HttpResponse.h b/src/HttpResponse.h index 204a63d..696ca9f 100644 --- a/src/HttpResponse.h +++ b/src/HttpResponse.h @@ -11,11 +11,13 @@ #include "Print.h" #include "Printable.h" +#define HTTPRESPONSE_HTTPVER_SIZE 9 + class HttpResponse: public Print, public Printable { public: - HttpResponse(Buffer&); - HttpResponse(Buffer&, unsigned int); + HttpResponse(Buffer&); // TODO: only cnstr needed by WebKernel, add httpver param + HttpResponse(Buffer&, unsigned int); // TODO: remove unnecessary constructors HttpResponse(Buffer&, unsigned int, const char *); HttpResponse(); HttpResponse(unsigned int code); @@ -23,6 +25,8 @@ class HttpResponse: public Print, public Printable ~HttpResponse(); unsigned int code; HttpHeaders headers; + const char * setHttpVersion(const char *); + const char * getHttpVersion() const; const char * setReason(const char * reason); const char * getReason() const; static const char * getDefaultReason(unsigned int); @@ -35,4 +39,5 @@ class HttpResponse: public Print, public Printable private: Buffer * buffer; char * reason; + char httpver[HTTPRESPONSE_HTTPVER_SIZE]; }; diff --git a/src/WebKernel.cpp b/src/WebKernel.cpp index 9f9ad7b..bb2a9a3 100644 --- a/src/WebKernel.cpp +++ b/src/WebKernel.cpp @@ -37,6 +37,7 @@ void WebKernel::handleClients() _client.flush(); case S_DISPATCHING: HttpResponse response(_resp_buffer); + response.setHttpVersion(_request.getHttpVer()); _dispatcher.handle(_request, response); response.headers.set("Connection","close"); _client.print(response); diff --git a/test/test_HttpResponse.cpp b/test/test_HttpResponse.cpp index e397b65..d59ce6d 100644 --- a/test/test_HttpResponse.cpp +++ b/test/test_HttpResponse.cpp @@ -39,11 +39,31 @@ TEST_CASE("HttpResponse printTo", "[HttpResponse]") Buffer message(response_buffer, 100); Buffer client(print_buffer, 100); HttpResponse r(message); + r.setHttpVersion("HTTP/1.1"); r.code = 200; r.write("Response Body"); r.headers.set("Cookie","1234"); client.print(r); - CHECK_THAT((char *)print_buffer, Equals("200 OK\r\nCookie: 1234\r\n\r\nResponse Body")); + CHECK_THAT((char *)print_buffer, Equals("HTTP/1.1 200 OK\r\nCookie: 1234\r\n\r\nResponse Body")); +} + +TEST_CASE("HttpResponse get/setHttpVersion", "[HttpResponse]") +{ + HttpResponse r; + + SECTION("Empty") { + r.setHttpVersion(""); + CHECK_THAT(r.getHttpVersion(), Equals("")); + } + + SECTION("HTTP/1.1") { + r.setHttpVersion("HTTP/1.1"); + CHECK_THAT(r.getHttpVersion(), Equals("HTTP/1.1")); + } + + SECTION("Overflow buffer") { + r.setHttpVersion("AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPP"); + } }