WebKernel has an init handler that is called before dispatching a response

feature/UrlUtils
Kenneth Barbour 2018-04-03 13:53:03 -04:00
parent 0b85064f15
commit e08527dc25
3 changed files with 35 additions and 1 deletions

View File

@ -65,6 +65,8 @@ 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)

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,11 @@ class WebKernel
_dispatcher.methodNotAllowedHandler = handler;
}
void setInitHandler(void (*handler)(HttpRequest&, HttpResponse&))
{
_initHandler = handler;
}
void setTerminateHandler(void (*handler)(const HttpRequest&, const HttpResponse&))
{
_terminateHandler = handler;
@ -64,6 +71,7 @@ class WebKernel
void dispatchRequest();
void (*_initHandler)(HttpRequest&, HttpResponse&);
void (*_terminateHandler)(const HttpRequest&, const HttpResponse&);
};

View File

@ -10,6 +10,7 @@ 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)
{
@ -46,6 +47,11 @@ 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[] = {
@ -127,6 +133,24 @@ 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[] = {