WebKernel class
parent
fd45238d96
commit
9486a3af86
|
@ -1,6 +1,7 @@
|
|||
#pragma once
|
||||
#include "HttpRequest.h"
|
||||
#include "Arduino.h"
|
||||
#include "Stream.h"
|
||||
|
||||
#ifndef REQUESTPARSER_BUFFER
|
||||
#define REQUESTPARSER_BUFFER 512
|
||||
|
|
|
@ -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();
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -5,3 +5,5 @@ unsigned long _millis = 0;
|
|||
unsigned long millis() { return _millis; }
|
||||
|
||||
void delay( unsigned long ms ) { _millis += ms; }
|
||||
|
||||
void yield() { delay(1); };
|
||||
|
|
|
@ -4,3 +4,5 @@
|
|||
unsigned long millis();
|
||||
|
||||
void delay(unsigned long);
|
||||
|
||||
void yield();
|
||||
|
|
Loading…
Reference in New Issue