HttpResponse code and reason

feature/UrlUtils
Kenneth Barbour 2018-02-18 09:32:17 -05:00
parent 4220d44625
commit 8f012d68a6
4 changed files with 158 additions and 0 deletions

View File

@ -0,0 +1,87 @@
#include "HttpResponse.h"
HttpResponse::HttpResponse(): code(200) {
reason = nullptr;
}
HttpResponse::HttpResponse(unsigned int code): code(code) {
reason = nullptr;
}
HttpResponse::HttpResponse(unsigned int code, const char * reason): code(code) {
this->reason = nullptr;
setReason(reason);
}
const char * HttpResponse::setReason(const char * reason)
{
if (this->reason != nullptr) free(this->reason);
if (reason == nullptr) return this->reason = nullptr;
this->reason = (char *) malloc(strlen(reason));
strcpy(this->reason, reason);
return this->reason;
}
const char * HttpResponse::getReason()
{
if (this->reason) return this->reason;
return HttpResponse::getDefaultReason(code);
}
const char * HttpResponse::getDefaultReason(unsigned int code)
{
switch(code) {
case 100: return "Continue";
case 101: return "Switching Protocols";
case 200: return "OK";
case 201: return "Created";
case 202: return "Accepted";
case 203: return "Non-Authoritative Information";
case 204: return "No Content";
case 205: return "Reset Content";
case 206: return "Partial Content";
case 300: return "Multiple Choices";
case 301: return "Moved Permanently";
case 302: return "Found";
case 303: return "See Other";
case 304: return "Not Modified";
case 305: return "Use Proxy";
case 307: return "Temporary Redirect";
case 400: return "Bad Request";
case 401: return "Unauthorized";
case 402: return "Payment Required";
case 403: return "Forbidden";
case 404: return "Not Found";
case 405: return "Method Not Allowed";
case 406: return "Not Acceptable";
case 407: return "Proxy Authentication Required";
case 408: return "Request Time-Out";
case 409: return "Conflict";
case 410: return "Gone";
case 411: return "Length Required";
case 412: return "Precondition Failed";
case 413: return "Request Entity Too Large";
case 414: return "Request-URI Too Large";
case 415: return "Unsupported Media Type";
case 416: return "Requested range not satisfiable";
case 417: return "Expectation Failed";
case 500: return "Internal Server Error";
case 501: return "Not Implemented";
case 502: return "Bad Gateway";
case 503: return "Service Unavailable";
case 504: return "Gateway Timeout";
case 505: return "HTTP Version Not Supported";
default: return "";
}
}
HttpResponse::~HttpResponse()
{
if (reason) free(reason);
}

25
src/HttpResponse.h 100644
View File

@ -0,0 +1,25 @@
#pragma once
#include "HttpHeaders.h"
#ifdef _TEST_
#include "dummy/DummyStream.h"
#else
#include "Arduino.h"
#endif
class HttpResponse
{
public:
HttpResponse();
HttpResponse(unsigned int code);
HttpResponse(unsigned int code, const char *);
~HttpResponse();
unsigned int code;
char * reason;
HttpHeaders headers;
Stream * message;
const char * setReason(const char * reason);
const char * getReason();
static const char * getDefaultReason(unsigned int);
private:
};

View File

@ -0,0 +1,13 @@
#pragma once
typedef struct requestHandler {
HttpRequest request;
char** slugs;
respond();
} RequestHandler;
class RequestRouter
{
public:
char* match(Request);
};

View File

@ -0,0 +1,33 @@
#include "catch.hpp"
#include "HttpResponse.h"
using Catch::Matchers::Equals;
TEST_CASE("Instantiate HttpResponse", "[HttpResponse]")
{
HttpResponse response;
}
TEST_CASE("Default Response is 200 OK", "[HttpResponse]")
{
HttpResponse response;
REQUIRE( response.code == 200 );
REQUIRE_THAT(response.getReason(), Equals("OK"));
}
TEST_CASE("Set Reason","[HttpResponse]")
{
HttpResponse response;
response.setReason("Foo");
CHECK( response.code == 200 );
REQUIRE_THAT(response.getReason(), Equals("Foo"));
}
TEST_CASE("Unset reason", "[HttpResponse]")
{
HttpResponse response;
response.setReason("Foo");
REQUIRE(response.code == 200);
response.setReason(nullptr);
REQUIRE_THAT(response.getReason(), Equals("OK")); // unsetting reason should restore default
}