diff --git a/user/httpdespfs.c b/user/httpdespfs.c index 0636145..17370af 100644 --- a/user/httpdespfs.c +++ b/user/httpdespfs.c @@ -4,10 +4,16 @@ Connector to let httpd use the espfs filesystem to serve the files in that. #include #include +#include "c_types.h" +#include "user_interface.h" +#include "espconn.h" +#include "mem.h" + #include "httpd.h" #include "espfs.h" #include "httpdespfs.h" + int ICACHE_FLASH_ATTR cgiEspFsHook(HttpdConnData *connData) { EspFsFile *file=connData->cgiData; 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; xtokenPos==-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; + } +} + diff --git a/user/httpdespfs.h b/user/httpdespfs.h index 1c14b5d..8523eff 100644 --- a/user/httpdespfs.h +++ b/user/httpdespfs.h @@ -5,5 +5,6 @@ #include "espfs.h" int cgiEspFsHook(HttpdConnData *connData); +int ICACHE_FLASH_ATTR cgiEspFsTemplate(HttpdConnData *connData); #endif \ No newline at end of file