|
|
@ -4,10 +4,16 @@ Connector to let httpd use the espfs filesystem to serve the files in that. |
|
|
|
|
|
|
|
|
|
|
|
#include <string.h> |
|
|
|
#include <string.h> |
|
|
|
#include <osapi.h> |
|
|
|
#include <osapi.h> |
|
|
|
|
|
|
|
#include "c_types.h" |
|
|
|
|
|
|
|
#include "user_interface.h" |
|
|
|
|
|
|
|
#include "espconn.h" |
|
|
|
|
|
|
|
#include "mem.h" |
|
|
|
|
|
|
|
|
|
|
|
#include "httpd.h" |
|
|
|
#include "httpd.h" |
|
|
|
#include "espfs.h" |
|
|
|
#include "espfs.h" |
|
|
|
#include "httpdespfs.h" |
|
|
|
#include "httpdespfs.h" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int ICACHE_FLASH_ATTR cgiEspFsHook(HttpdConnData *connData) { |
|
|
|
int ICACHE_FLASH_ATTR cgiEspFsHook(HttpdConnData *connData) { |
|
|
|
EspFsFile *file=connData->cgiData; |
|
|
|
EspFsFile *file=connData->cgiData; |
|
|
|
int len; |
|
|
|
int len; |
|
|
@ -44,3 +50,87 @@ int ICACHE_FLASH_ATTR cgiEspFsHook(HttpdConnData *connData) { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct { |
|
|
|
|
|
|
|
EspFsFile *file; |
|
|
|
|
|
|
|
void *tplArg; |
|
|
|
|
|
|
|
char token[64]; |
|
|
|
|
|
|
|
int tokenPos; |
|
|
|
|
|
|
|
} TplData; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef int (* TplCallback)(HttpdConnData *connData, char *token, void **arg); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int ICACHE_FLASH_ATTR cgiEspFsTemplate(HttpdConnData *connData) { |
|
|
|
|
|
|
|
TplData *tpd=connData->cgiData; |
|
|
|
|
|
|
|
int len; |
|
|
|
|
|
|
|
int x, sp; |
|
|
|
|
|
|
|
char *p, *e; |
|
|
|
|
|
|
|
int sentTo; |
|
|
|
|
|
|
|
char buff[1025]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (connData->conn==NULL) { |
|
|
|
|
|
|
|
//Connection aborted. Clean up.
|
|
|
|
|
|
|
|
((TplCallback)(connData->cgiArg))(connData, NULL, &tpd->tplArg); |
|
|
|
|
|
|
|
espFsClose(tpd->file); |
|
|
|
|
|
|
|
os_free(tpd); |
|
|
|
|
|
|
|
return HTTPD_CGI_DONE; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (tpd==NULL) { |
|
|
|
|
|
|
|
//First call to this cgi. Open the file so we can read it.
|
|
|
|
|
|
|
|
tpd=(TplData *)os_malloc(sizeof(TplData)); |
|
|
|
|
|
|
|
tpd->file=espFsOpen(connData->url); |
|
|
|
|
|
|
|
tpd->tplArg=NULL; |
|
|
|
|
|
|
|
tpd->tokenPos=-1; |
|
|
|
|
|
|
|
if (tpd->file==NULL) { |
|
|
|
|
|
|
|
return HTTPD_CGI_NOTFOUND; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
connData->cgiData=tpd; |
|
|
|
|
|
|
|
httpdStartResponse(connData, 200); |
|
|
|
|
|
|
|
httpdHeader(connData, "Content-Type", httpdGetMimetype(connData->url)); |
|
|
|
|
|
|
|
httpdEndHeaders(connData); |
|
|
|
|
|
|
|
return HTTPD_CGI_MORE; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
len=espFsRead(tpd->file, buff, 1024); |
|
|
|
|
|
|
|
if (len>0) { |
|
|
|
|
|
|
|
sp=0; |
|
|
|
|
|
|
|
e=buff; |
|
|
|
|
|
|
|
for (x=0; x<len; x++) { |
|
|
|
|
|
|
|
if (tpd->tokenPos==-1) { |
|
|
|
|
|
|
|
//Inside ordinary text.
|
|
|
|
|
|
|
|
if (buff[x]=='%') { |
|
|
|
|
|
|
|
//Send raw data up to now
|
|
|
|
|
|
|
|
if (sp!=0) espconn_sent(connData->conn, (uint8 *)e, sp); |
|
|
|
|
|
|
|
sp=0; |
|
|
|
|
|
|
|
//Go collect token chars.
|
|
|
|
|
|
|
|
tpd->tokenPos=0; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
sp++; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
if (buff[x]=='%') { |
|
|
|
|
|
|
|
tpd->token[tpd->tokenPos++]=0; //zero-terminate token
|
|
|
|
|
|
|
|
((TplCallback)(connData->cgiArg))(connData, tpd->token, &tpd->tplArg); |
|
|
|
|
|
|
|
//Go collect normal chars again.
|
|
|
|
|
|
|
|
e=&buff[x+1]; |
|
|
|
|
|
|
|
tpd->tokenPos=-1; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
if (tpd->tokenPos<(sizeof(tpd->token)-1)) tpd->token[tpd->tokenPos++]=buff[x]; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
//Send remaining bit.
|
|
|
|
|
|
|
|
if (sp!=0) espconn_sent(connData->conn, (uint8 *)e, sp); |
|
|
|
|
|
|
|
if (len!=1024) { |
|
|
|
|
|
|
|
//We're done.
|
|
|
|
|
|
|
|
((TplCallback)(connData->cgiArg))(connData, NULL, &tpd->tplArg); |
|
|
|
|
|
|
|
espFsClose(tpd->file); |
|
|
|
|
|
|
|
return HTTPD_CGI_DONE; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
//Ok, till next time.
|
|
|
|
|
|
|
|
return HTTPD_CGI_MORE; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|