WebKernel class

feature/UrlUtils
Kenneth Barbour 2018-03-09 18:20:16 -05:00 committed by Kenneth Barbour
parent fd45238d96
commit 9486a3af86
5 changed files with 85 additions and 2 deletions

View File

@ -1,6 +1,7 @@
#pragma once
#include "HttpRequest.h"
#include "Arduino.h"
#include "Stream.h"
#ifndef REQUESTPARSER_BUFFER
#define REQUESTPARSER_BUFFER 512

55
src/WebKernel.cpp 100644
View File

@ -0,0 +1,55 @@
#include "WebKernel.h"
void WebKernel::handleClients()
{
bool shouldYield = true;
bool keepClient = false;
if (_state == S_IDLE) {
WiFiClient client = _server.available();
if (!client) return;
_client = client;
_request = HttpRequest();
_state = S_RECEIVING;
_stateChange = millis();
}
if (_client.connected()) {
switch (_state) {
case S_IDLE:
break;
case S_RECEIVING:
if (!_parser.parse()) {
if (millis() - _stateChange <= WEBKERNEL_MAX_WAIT)
keepClient = false;
shouldYield = true;
break;
}
_state = S_DISPATCHING;
_stateChange = millis();
_client.flush();
case S_DISPATCHING:
HttpResponse response;
_dispatcher.handle(_request, response);
response.headers.set("Connection","close");
_client.print(response);
break;
}
} else {
keepClient = false;
}
if (millis() - _stateChange <= WEBKERNEL_MAX_WAIT) keepClient = false;
if (!keepClient) {
_client.stop();
_state = S_IDLE;
}
if (shouldYield)
yield();
}

View File

@ -1,22 +1,45 @@
#pragma once
#include "Arduino.h"
#include "WiFiServer.h"
#include "RequestParser.h"
#include "RequestRouter.h"
#include "RouteDispatcher.h"
#define WEBKERNEL_MAX_WAIT 1000
enum WebKernelState {
S_IDLE,
S_RECEIVING,
S_DISPATCHING
};
class WebKernel
{
public:
WebKernel(uint16_t port, Route* routes, uint8_t num):
_server(port),
_router(routes, num)
_client(),
_request(),
_router(routes, num),
_state(S_IDLE),
_dispatcher(_router),
_parser(_request, _client)
{};
void begin() { _server.begin(); }
void handleClients();
#ifdef _TEST_
void mock_nextClient(const char * next) { _server._next = next; }
#endif
protected:
WiFiServer _server;
WiFiServer _server;
WiFiClient _client;
HttpRequest _request;
RequestRouter _router;
RequestParser _parser;
RouteDispatcher _dispatcher;
WebKernelState _state;
unsigned long int _stateChange;
};

View File

@ -5,3 +5,5 @@ unsigned long _millis = 0;
unsigned long millis() { return _millis; }
void delay( unsigned long ms ) { _millis += ms; }
void yield() { delay(1); };

View File

@ -4,3 +4,5 @@
unsigned long millis();
void delay(unsigned long);
void yield();