63 lines
1.7 KiB
C
63 lines
1.7 KiB
C
|
|
#include <avr/pgmspace.h>
|
|
|
|
#define HANDLER(meth, num) void handle_ ## meth (Adafruit_CC3000_ClientRef &client) { \
|
|
uint8_t buffer[64]; \
|
|
memset(buffer, 0, 63); \
|
|
\
|
|
for (uint8_t p = 0; p < 63; p++) { \
|
|
buffer[p] = client.read(); \
|
|
\
|
|
if (buffer[p] == ' ' || buffer[p] == '?') { \
|
|
buffer[p] = 0; \
|
|
break; \
|
|
} \
|
|
} \
|
|
\
|
|
debug_log("GOT URL: "); \
|
|
debug_log((const char *) buffer); \
|
|
\
|
|
uint16_t length = sizeof(meth ## _LIST)/sizeof(meth ## _LIST[0]); \
|
|
\
|
|
debug_log("GET_LIST SIZE: "); \
|
|
debug_log(length); \
|
|
\
|
|
for (size_t i = 0; i < length; i++) { \
|
|
debug_log("Checking: "); \
|
|
debug_log(i); \
|
|
char path[64]; \
|
|
strncpy_P(path, meth ## _LIST[i].path, 63); \
|
|
debug_log("Path: "); \
|
|
debug_log(path); \
|
|
debug_logf((int) meth ## _LIST[i].path, HEX); \
|
|
debug_logf((int) root_path, HEX); \
|
|
\
|
|
if (!strncmp_P((const char *)buffer, meth ## _LIST[i].path, 63)) { \
|
|
skip_headers(client, num); \
|
|
(* meth ## _LIST[i].function)(client, num); \
|
|
client.println(F("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n")); \
|
|
return; \
|
|
} \
|
|
} \
|
|
\
|
|
give_404(client, 0); \
|
|
}
|
|
|
|
|
|
|
|
#define PUSH(x) for(int i=0; i<3; i++) buffer[i] = buffer[i+1]; buffer[3]=x;
|
|
#define CHECK_BUF (buffer[0] == '\r' && buffer[1] == '\n' && buffer[2] == '\r' && buffer[3] == '\n')
|
|
|
|
METHOD(skip_headers) {
|
|
uint8_t buffer[4] = {0,0,0,0};
|
|
uint8_t c;
|
|
|
|
// Look for a \r\n\r\n pattern in the incoming data, that'll be the end of the headers
|
|
while(! CHECK_BUF) {
|
|
c = client.read();
|
|
PUSH(c);
|
|
}
|
|
}
|
|
|
|
HANDLER(GET, 0);
|
|
HANDLER(POST, 1);
|