Merge branch 'feature/kernel_lifecycle'

feature/UrlUtils
Kenneth Barbour 2018-04-04 12:53:48 -04:00
commit 06a56b611d
3 changed files with 67 additions and 1 deletions

View File

@ -65,6 +65,10 @@ void WebKernel::dispatchRequest()
{
HttpResponse response;
response.setHttpVersion(_request.getHttpVersion());
if (_initHandler != nullptr)
_initHandler(_request, response);
_dispatcher.handle(_request, response);
response.send(_client);
if (_terminateHandler != nullptr)
_terminateHandler(_request, response);
}

View File

@ -26,7 +26,9 @@ class WebKernel
_router(routes, num),
_state(S_IDLE),
_dispatcher(_router),
_parser(_request, _client)
_parser(_request, _client),
_initHandler(nullptr),
_terminateHandler(nullptr)
{};
void begin() { _server.begin(); }
void handleClients();
@ -41,6 +43,16 @@ class WebKernel
_dispatcher.methodNotAllowedHandler = handler;
}
void setInitHandler(void (*handler)(HttpRequest&, HttpResponse&))
{
_initHandler = handler;
}
void setTerminateHandler(void (*handler)(const HttpRequest&, const HttpResponse&))
{
_terminateHandler = handler;
}
#ifdef _TEST_
void mock_nextClient(const char * next) { _server._next = next; }
WiFiClient& mock_currentClient() { return _client; }
@ -59,4 +71,7 @@ class WebKernel
void dispatchRequest();
void (*_initHandler)(HttpRequest&, HttpResponse&);
void (*_terminateHandler)(const HttpRequest&, const HttpResponse&);
};

View File

@ -9,6 +9,8 @@ char error_message[24] = {};
char response_buffer[100] = {};
Buffer message((uint8_t*)response_buffer, 100);
bool term = false;
bool init = false;
void do_foo(HttpRequest& request, HttpResponse& response)
{
@ -40,6 +42,16 @@ void handle_methodNotAllowed(HttpRequest& request, HttpResponse& response)
strcpy(error_message, "Method Not Allowed");
}
void handle_terminate(const HttpRequest& request, const HttpResponse& response)
{
term = true;
}
void handle_init(HttpRequest& request, HttpResponse& response)
{
init = true;
}
TEST_CASE("Test WebKernel", "[WebKernel]")
{
Route routes[] = {
@ -120,3 +132,38 @@ TEST_CASE("Test WebKernel error handling", "[WebKernel]")
{
}
TEST_CASE("WebKernel init handler", "[WebKernel]")
{
Route routes[] = {
{ GET, "/foo", do_foo },
{ GET, "/bar", do_bar }
};
WebKernel kernel(80, routes, 2);
foo = bar = 0;
term = false;
init = false;
kernel.setInitHandler(handle_init);
kernel.mock_nextClient("GET /foo HTTP/1.1\r\nHost: localhost\r\n\r\n");
kernel.handleClients();
CHECK(init == true);
}
TEST_CASE("WebKernel terminate handler", "[WebKernel]")
{
Route routes[] = {
{ GET, "/foo", do_foo },
{ GET, "/bar", do_bar }
};
WebKernel kernel(80, routes, 2);
foo = bar = 0;
term = false;
kernel.mock_nextClient("GET /foo HTTP/1.1\r\nHost: localhost\r\n\r\n");
kernel.setTerminateHandler(handle_terminate);
kernel.handleClients();
CHECK(term == true);
}