Merge branch 'feature/kernel_lifecycle'
commit
06a56b611d
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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&);
|
||||
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue