39 #define MAX_HEAD_LEN 1024 45 #define MAX_SENDBUFF_LEN 2048 79 {
"html",
"text/html"},
81 {
"js",
"text/javascript"},
82 {
"txt",
"text/plain"},
83 {
"jpg",
"image/jpeg"},
84 {
"jpeg",
"image/jpeg"},
96 char *ext=url+(
strlen(url)-1);
97 while (ext!=url && *ext!=
'.') ext--;
101 while (mimeTypes[i].ext!=
NULL &&
os_strcmp(ext, mimeTypes[i].ext)!=0) i++;
110 if (connData[i].
conn==(
struct espconn *)arg)
return &connData[i];
112 INFO(
"FindConnData: Huh? Couldn't find connection for %p\n", arg);
127 if (c>=
'0' && c<=
'9')
return c-
'0';
128 if (c>=
'A' && c<=
'F')
return c-
'A'+10;
129 if (c>=
'a' && c<=
'f')
return c-
'a'+10;
139 int esced=0, escVal=0;
140 while (s<valLen && d<retLen) {
144 }
else if (esced==2) {
148 }
else if (val[s]==
'%') {
150 }
else if (val[s]==
'+') {
157 if (d<retLen) ret[d]=0;
169 if (line==
NULL)
return 0;
171 while(p!=
NULL && *p!=
'\n' && *p!=
'\r' && *p!=0) {
172 INFO(
"findArg: %s\n", p);
177 INFO(
"findArg: val %s len %d\n", p, (e-p));
183 INFO(
"Finding %s in %s: Not found :/\n", arg, line);
194 while(*p<=32 && *p!=0) p++;
203 while (*p!=0 && *p!=
'\r' && *p!=
'\n' && retLen>1) {
249 tfp_snprintf(buff, 1024,
"HTTP/1.1 302 Found\r\nLocation: %s\r\n\r\nMoved to %s\r\n", newUrl, newUrl);
271 if (len<0) len=
strlen(data);
296 if (conn==
NULL)
return;
301 INFO(
"Conn %p is done. Closing.\n", conn->
conn);
314 static const char *
httpNotFoundHeader=
"HTTP/1.0 404 Not Found\r\nServer: esp8266-httpd/0.1\r\nContent-Type: text/plain\r\n\r\nNot Found.\r\n";
327 if (builtInUrls[i].url[
os_strlen(builtInUrls[i].url)-1]==
'*' &&
330 INFO(
"Is url index %d\n", i);
343 INFO(
"%s not found. 404!\n", conn->
url);
358 while (h[i]!=
' ') i++;
376 }
else if (
os_strncmp(h,
"Content-Length: ", 16)==0) {
379 while (h[i]!=
' ') i++;
384 INFO(
"Mallocced buffer for %d bytes of post data.\n", conn->
postLen);
394 static void httpdRecvCb(
void *arg,
char *data,
unsigned short len) {
399 if (conn==
NULL)
return;
403 for (x=0; x<len; x++) {
449 if (conn==
NULL)
return;
459 INFO(
"Disconnected, conn=%p\n", conn);
460 if (conn==
NULL)
return;
467 if (connData[i].conn!=
NULL) {
474 if (connData[i].cgi!=
NULL) connData[i].
cgi(&connData[i]);
487 for (i=0; i<
MAX_CONN; i++)
if (connData[i].conn==
NULL)
break;
488 INFO(
"Con req, conn=%p, pool slot %d\n", conn, i);
490 INFO(
"Aiee, conn pool overflow!\n");
494 connData[i].
priv=&connPrivData[i];
521 builtInUrls=fixedUrls;
523 INFO(
"Httpd init, conn=%p\n", &httpdConn);
535 INFO(
"Httpd stopping, state=%d conn=%p\n", httpdConn.
state, &httpdConn);
542 INFO(
"Httpd stopped\n");
549 INFO(
"Httpd still running rescheduling httpdStop\n");
sint8 espconn_regist_sentcb(struct espconn *espconn, espconn_sent_callback sent_cb)
static ICACHE_FLASH_ATTR void httpdParseHeader(char *h, HttpdConnData *conn)
sint8 espconn_regist_recvcb(struct espconn *espconn, espconn_recv_callback recv_cb)
sint8 espconn_sent(struct espconn *espconn, uint8 *psent, uint16 length)
static struct espconn httpdConn
static ICACHE_FLASH_ATTR void httpdRecvCb(void *arg, char *data, unsigned short len)
static struct espconn conn
ICACHE_FLASH_ATTR void httpdStop()
static ICACHE_FLASH_ATTR void httpdDisconCb(void *arg)
sint8 espconn_regist_reconcb(struct espconn *espconn, espconn_reconnect_callback recon_cb)
ICACHE_FLASH_ATTR void httpdRedirect(HttpdConnData *conn, char *newUrl)
#define ICACHE_FLASH_ATTR
static os_timer_t httpdDisconnectTimer
#define HTTPD_CGI_NOTFOUND
static ICACHE_FLASH_ATTR void httpdReconCb(void *arg, sint8 err)
static ICACHE_FLASH_ATTR void httpdRetireConn(HttpdConnData *conn)
ICACHE_FLASH_ATTR int httpdFindArg(char *line, char *arg, char *buff, int buffLen)
static const char * httpNotFoundHeader
ICACHE_FLASH_ATTR void httpdInit(HttpdBuiltInUrl *fixedUrls, int port)
sint8 espconn_disconnect(struct espconn *espconn)
static ICACHE_FLASH_ATTR void xmitSendBuff(HttpdConnData *conn)
static ICACHE_FLASH_ATTR HttpdConnData * httpdFindConnData(void *arg)
static HttpdBuiltInUrl * builtInUrls
ICACHE_FLASH_ATTR static void httpdDisconnectTimerFunc(void *arg)
static ICACHE_FLASH_ATTR void httpdConnectCb(void *arg)
sint8 espconn_regist_disconcb(struct espconn *espconn, espconn_connect_callback discon_cb)
static const MimeMap mimeTypes[]
sint8 espconn_accept(struct espconn *espconn)
ICACHE_FLASH_ATTR int httpdGetHeader(HttpdConnData *conn, char *header, char *ret, int retLen)
ICACHE_FLASH_ATTR void httpdStartResponse(HttpdConnData *conn, int code)
ICACHE_FLASH_ATTR void httpdEndHeaders(HttpdConnData *conn)
sint8 espconn_delete(struct espconn *espconn)
static HttpdPriv * connPrivData
ICACHE_FLASH_ATTR const char * httpdGetMimetype(char *url)
ICACHE_FLASH_ATTR int tfp_snprintf(char *str, size_t size, const char *format,...)
ICACHE_FLASH_ATTR int cgiRedirect(HttpdConnData *connData)
ICACHE_FLASH_ATTR void httpdHeader(HttpdConnData *conn, const char *field, const char *val)
static ICACHE_FLASH_ATTR void httpdSendResp(HttpdConnData *conn)
#define os_timer_arm(a, b, c)
static int httpdHexVal(char c)
ICACHE_FLASH_ATTR int httpdSend(HttpdConnData *conn, const char *data, int len)
sint8 espconn_regist_connectcb(struct espconn *espconn, espconn_connect_callback connect_cb)
static HttpdConnData connData[MAX_CONN]
int httpdUrlDecode(char *val, int valLen, char *ret, int retLen)
static ICACHE_FLASH_ATTR void httpdSentCb(void *arg)