WebKernel has a terminate handler that is called after dispatching and sending a response

feature/UrlUtils
Kenneth Barbour 2018-04-03 13:10:53 -04:00
parent 43ccbf4a52
commit 0b85064f15
3 changed files with 32 additions and 0 deletions

View File

@ -67,4 +67,6 @@ void WebKernel::dispatchRequest()
response.setHttpVersion(_request.getHttpVersion());
_dispatcher.handle(_request, response);
response.send(_client);
if (_terminateHandler != nullptr)
_terminateHandler(_request, response);
}

View File

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

View File

@ -9,6 +9,7 @@ char error_message[24] = {};
char response_buffer[100] = {};
Buffer message((uint8_t*)response_buffer, 100);
bool term = false;
void do_foo(HttpRequest& request, HttpResponse& response)
{
@ -40,6 +41,11 @@ void handle_methodNotAllowed(HttpRequest& request, HttpResponse& response)
strcpy(error_message, "Method Not Allowed");
}
void handle_terminate(const HttpRequest& request, const HttpResponse& response)
{
term = true;
}
TEST_CASE("Test WebKernel", "[WebKernel]")
{
Route routes[] = {
@ -120,3 +126,20 @@ TEST_CASE("Test WebKernel error handling", "[WebKernel]")
{
}
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);
}