32#include "QNEthernet.h"
34#if defined(STD_FUNCTION_MIDDLEWARE)
36#define MIDDLEWARE_PARAM Middleware
37#define MIDDLEWARE_FUNCTION std::function<void(Request & request, Response & response)> Middleware
39#define MIDDLEWARE_PARAM Middleware *
40#define MIDDLEWARE_FUNCTION void Middleware(Request &request, Response &response)
45#if defined(__AVR_ATmega328P__) || defined(__AVR_Atmega32U4__) || defined(__AVR_ATmega16U4__) || \
46 defined(_AVR_ATmega328__)
50#ifndef SERVER_URL_BUFFER_SIZE
51#if defined(LOW_MEMORY_MCU)
52#define SERVER_URL_BUFFER_SIZE 64
54#define SERVER_URL_BUFFER_SIZE 256
58#ifndef SERVER_PUSHBACK_BUFFER_SIZE
59#if defined(LOW_MEMORY_MCU)
60#define SERVER_PUSHBACK_BUFFER_SIZE 32
62#define SERVER_PUSHBACK_BUFFER_SIZE 128
66#ifndef SERVER_OUTPUT_BUFFER_SIZE
67#if defined(LOW_MEMORY_MCU)
68#define SERVER_OUTPUT_BUFFER_SIZE 32
70#define SERVER_OUTPUT_BUFFER_SIZE 1024
74#ifndef SERVER_MAX_HEADERS
75#define SERVER_MAX_HEADERS 10
79#define P(name) static const unsigned char name[] __attribute__((section(".progmem." #name)))
81#define P(name) static const unsigned char name[] PROGMEM
86using qindesign::network::EthernetClient;
95 int connect(IPAddress, uint16_t) {
return 1; };
97 int connect(
const char *, uint16_t) {
return 1; };
99 size_t write(uint8_t
byte) {
return s->write(
byte); };
101 size_t write(
const uint8_t *buffer,
size_t length) {
return s->write(buffer, length); };
105 int read() {
return s->read(); };
107 int read(uint8_t *buffer,
size_t length) {
110 while (count < length) {
116 *buffer++ = (uint8_t)c;
123 int peek() {
return s->peek(); };
125 void flush() {
return s->flush(); };
131 operator bool() {
return true; };
146 const char *
get(
const char *name);
148 void printP(
const unsigned char *
string);
149 void printP(
const char *
string);
151 void set(
const char *name,
const char *value);
155 size_t write(uint8_t data);
156 size_t write(uint8_t *buffer,
size_t bufferLength);
157 void writeP(
const unsigned char *data,
size_t length);
160 Response(EthernetClient *
client, uint8_t *writeBuffer,
int writeBufferLength);
162 void m_printStatus(
int code);
163 bool m_shouldPrintHeaders();
164 void m_printHeaders();
169 EthernetClient *m_stream;
176 bool m_contentLenghtSet;
177 bool m_contentTypeSet;
181 bool m_sendingStatus;
182 bool m_sendingHeaders;
205 bool form(
char *name,
int nameLength,
char *value,
int valueLength);
206 char *
get(
const char *name);
211 void push(uint8_t ch);
213 bool query(
const char *name,
char *buffer,
int bufferLength);
215 int read(uint8_t *buf,
size_t size);
216 bool route(
const char *name,
char *buffer,
int bufferLength);
217 bool route(
int number,
char *buffer,
int bufferLength);
219 size_t write(uint8_t data);
220 size_t write(uint8_t *buffer,
size_t bufferLength);
231 int urlBufferLength,
unsigned long timeout,
void *
context);
232 bool m_processMethod();
234 bool m_readVersion();
236 bool m_processHeaders();
237 bool m_headerValue(
char *buffer,
int bufferLength);
238 bool m_readInt(
int &number);
239 void m_setRoute(
const char *
route,
const char *pattern);
240 int m_getUrlPathLength();
241 bool m_expect(
const char *expected);
242 bool m_expectP(
const unsigned char *expected);
248 EthernetClient *m_stream;
254 bool m_readingContent;
257 HeaderNode *m_headerTail;
263 const char *m_pattern;
290 void use(
const char *path,
Router *router);
296 struct MiddlewareNode {
301 MiddlewareNode *next;
305 void m_mountMiddleware(MiddlewareNode *tail);
306 void m_setNext(
Router *next);
308 void m_dispatchMiddleware(
Request &request,
Response &response,
int urlShift = 0);
309 bool m_routeMatch(
const char *route,
const char *pattern);
311 MiddlewareNode *m_head;
319 static int strcmpi(
const char *s1,
const char *s2);
320 static int strcmpiP(
const char *s1,
const unsigned char *s2);
322 void del(
const char *path, Router::MIDDLEWARE_PARAM middleware);
323 void del(Router::MIDDLEWARE_PARAM middleware);
324 void finally(Router::MIDDLEWARE_PARAM middleware);
325 void get(
const char *path, Router::MIDDLEWARE_PARAM middleware);
326 void get(Router::MIDDLEWARE_PARAM middleware);
327 void head(
const char *path, Router::MIDDLEWARE_PARAM middleware);
328 void head(Router::MIDDLEWARE_PARAM middleware);
329 void header(
const char *name,
char *buffer,
int bufferLength);
330 void notFound(Router::MIDDLEWARE_PARAM middleware);
331 void options(
const char *path, Router::MIDDLEWARE_PARAM middleware);
332 void options(Router::MIDDLEWARE_PARAM middleware);
333 void patch(
const char *path, Router::MIDDLEWARE_PARAM middleware);
334 void patch(Router::MIDDLEWARE_PARAM middleware);
335 void post(
const char *path, Router::MIDDLEWARE_PARAM middleware);
336 void post(Router::MIDDLEWARE_PARAM middleware);
337 void put(
const char *path, Router::MIDDLEWARE_PARAM middleware);
338 void put(Router::MIDDLEWARE_PARAM middleware);
340 void process(EthernetClient *
client,
char *urlbuffer,
int urlBufferLength,
void *context = NULL);
341 void process(EthernetClient *
client,
char *urlBuffer,
int urlBufferLength, uint8_t *writeBuffer,
342 int writeBufferLength,
void *context = NULL);
343 void process(Stream *stream,
void *context = NULL);
344 void process(Stream *stream,
char *urlbuffer,
int urlBufferLength,
void *context = NULL);
345 void process(Stream *stream,
char *urlBuffer,
int urlBufferLength, uint8_t *writeBuffer,
346 int writeBufferLength,
void *context = NULL);
349 void use(
const char *path,
Router *router);
351 void use(
const char *path, Router::MIDDLEWARE_PARAM middleware);
352 void use(Router::MIDDLEWARE_PARAM middleware);
357 Router::MIDDLEWARE_PARAM m_final;
358 Router::MIDDLEWARE_PARAM m_notFound;
360 Request::HeaderNode *m_headerTail;
361 unsigned long m_timeout;
366#ifndef ENABLE_AWOT_NAMESPACE
#define MIDDLEWARE_FUNCTION
#define SERVER_MAX_HEADERS
#define SERVER_PUSHBACK_BUFFER_SIZE
void options(const char *path, Router::Middleware *middleware)
void head(const char *path, Router::Middleware *middleware)
static int strcmpiP(const char *s1, const unsigned char *s2)
void post(const char *path, Router::Middleware *middleware)
void use(const char *path, Router *router)
void setTimeout(unsigned long timeoutMillis)
void patch(const char *path, Router::Middleware *middleware)
void process(EthernetClient *client, void *context=NULL)
void put(const char *path, Router::Middleware *middleware)
static int strcmpi(const char *s1, const char *s2)
void del(const char *path, Router::Middleware *middleware)
void header(const char *name, char *buffer, int bufferLength)
void notFound(Router::Middleware *middleware)
void get(const char *path, Router::Middleware *middleware)
size_t write(uint8_t data)
bool route(const char *name, char *buffer, int bufferLength)
bool form(char *name, int nameLength, char *value, int valueLength)
char * get(const char *name)
const char * get(const char *name)
size_t write(uint8_t data)
void writeP(const unsigned char *data, size_t length)
void set(const char *name, const char *value)
void printP(const unsigned char *string)
void sendStatus(int code)
void use(const char *path, Router *router)
void head(const char *path, Middleware *middleware)
void options(const char *path, Middleware *middleware)
void patch(const char *path, Middleware *middleware)
void del(const char *path, Middleware *middleware)
void get(const char *path, Middleware *middleware)
void put(const char *path, Middleware *middleware)
void post(const char *path, Middleware *middleware)
int connect(IPAddress, uint16_t)
int read(uint8_t *buffer, size_t length)
StreamClient(Stream *stream)
size_t write(uint8_t byte)
int connect(const char *, uint16_t)
size_t write(const uint8_t *buffer, size_t length)