Fixing the code to work under SDK 0.9.4. This commit should work.

v0.9.0
Jeroen Domburg 10 years ago
parent e56fdc4d6a
commit 876a68a67d
  1. 9
      README
  2. 2
      user/auth.c
  3. 4
      user/cgi.c
  4. 10
      user/cgiwifi.c
  5. 54
      user/httpd.c
  6. 1
      user/httpd.h
  7. 6
      user/httpdespfs.c

@ -76,3 +76,12 @@ WRITING CODE FOR THE WEBSERVER
the SDK works, this shouldn't be too hard :P the SDK works, this shouldn't be too hard :P
CHANGE FROM SDK 0.9.3 (and earlier) TO SDK 0.9.4:
Change all occurences of
espconn_sent(connData->conn, (uint8 *)buff, len);
to
httpdSend(connData, buff, len)
please. The reason for this is that you can't do multiple espconn_sent calls serially anymore, so
httpd needs to buffer the writes now.

@ -62,7 +62,7 @@ int ICACHE_FLASH_ATTR authBasic(HttpdConnData *connData) {
httpdHeader(connData, "Content-Type", "text/plain"); httpdHeader(connData, "Content-Type", "text/plain");
httpdHeader(connData, "WWW-Authenticate", "Basic realm=\""HTTP_AUTH_REALM"\""); httpdHeader(connData, "WWW-Authenticate", "Basic realm=\""HTTP_AUTH_REALM"\"");
httpdEndHeaders(connData); httpdEndHeaders(connData);
espconn_sent(connData->conn, (uint8 *)forbidden, os_strlen(forbidden)); httpdSend(connData, forbidden, -1);
//Okay, all done. //Okay, all done.
return HTTPD_CGI_DONE; return HTTPD_CGI_DONE;
} }

@ -62,7 +62,7 @@ void ICACHE_FLASH_ATTR tplLed(HttpdConnData *connData, char *token, void **arg)
os_strcpy(buff, "off"); os_strcpy(buff, "off");
} }
} }
espconn_sent(connData->conn, (uint8 *)buff, os_strlen(buff)); httpdSend(connData, buff, -1);
} }
static long hitCounter=0; static long hitCounter=0;
@ -76,7 +76,7 @@ void ICACHE_FLASH_ATTR tplCounter(HttpdConnData *connData, char *token, void **a
hitCounter++; hitCounter++;
os_sprintf(buff, "%ld", hitCounter); os_sprintf(buff, "%ld", hitCounter);
} }
espconn_sent(connData->conn, (uint8 *)buff, os_strlen(buff)); httpdSend(connData, buff, -1);
} }

@ -115,21 +115,21 @@ int ICACHE_FLASH_ATTR cgiWiFiScan(HttpdConnData *connData) {
if (cgiWifiAps.scanInProgress==1) { if (cgiWifiAps.scanInProgress==1) {
//We're still scanning. Tell Javascript code that. //We're still scanning. Tell Javascript code that.
len=os_sprintf(buff, "{\n \"result\": { \n\"inProgress\": \"1\"\n }\n}\n"); len=os_sprintf(buff, "{\n \"result\": { \n\"inProgress\": \"1\"\n }\n}\n");
espconn_sent(connData->conn, (uint8 *)buff, len); httpdSend(connData, buff, len);
} else { } else {
//We have a scan result. Pass it on. //We have a scan result. Pass it on.
len=os_sprintf(buff, "{\n \"result\": { \n\"inProgress\": \"0\", \n\"APs\": [\n"); len=os_sprintf(buff, "{\n \"result\": { \n\"inProgress\": \"0\", \n\"APs\": [\n");
espconn_sent(connData->conn, (uint8 *)buff, len); httpdSend(connData, buff, len);
if (cgiWifiAps.apData==NULL) cgiWifiAps.noAps=0; if (cgiWifiAps.apData==NULL) cgiWifiAps.noAps=0;
for (i=0; i<cgiWifiAps.noAps; i++) { for (i=0; i<cgiWifiAps.noAps; i++) {
//Fill in json code for an access point //Fill in json code for an access point
len=os_sprintf(buff, "{\"essid\": \"%s\", \"rssi\": \"%d\", \"enc\": \"%d\"}%s\n", len=os_sprintf(buff, "{\"essid\": \"%s\", \"rssi\": \"%d\", \"enc\": \"%d\"}%s\n",
cgiWifiAps.apData[i]->ssid, cgiWifiAps.apData[i]->rssi, cgiWifiAps.apData[i]->ssid, cgiWifiAps.apData[i]->rssi,
cgiWifiAps.apData[i]->enc, (i==cgiWifiAps.noAps-1)?"":","); cgiWifiAps.apData[i]->enc, (i==cgiWifiAps.noAps-1)?"":",");
espconn_sent(connData->conn, (uint8 *)buff, len); httpdSend(connData, buff, len);
} }
len=os_sprintf(buff, "]\n}\n}\n"); len=os_sprintf(buff, "]\n}\n}\n");
espconn_sent(connData->conn, (uint8 *)buff, len); httpdSend(connData, buff, len);
//Also start a new scan. //Also start a new scan.
wifiStartScan(); wifiStartScan();
} }
@ -256,7 +256,7 @@ void ICACHE_FLASH_ATTR tplWlan(HttpdConnData *connData, char *token, void **arg)
os_strcpy(buff, "Click <a href=\"setmode.cgi?mode=2\">here</a> to go to standalone AP mode."); os_strcpy(buff, "Click <a href=\"setmode.cgi?mode=2\">here</a> to go to standalone AP mode.");
} }
} }
espconn_sent(connData->conn, (uint8 *)buff, os_strlen(buff)); httpdSend(connData, buff, -1);
} }

@ -31,6 +31,9 @@ Esp8266 http server - core routines
#define MAX_CONN 8 #define MAX_CONN 8
//Max post buffer len //Max post buffer len
#define MAX_POST 1024 #define MAX_POST 1024
//Max send buffer len
#define MAX_SENDBUFF_LEN 2048
//This gets set at init time. //This gets set at init time.
static HttpdBuiltInUrl *builtInUrls; static HttpdBuiltInUrl *builtInUrls;
@ -40,6 +43,8 @@ struct HttpdPriv {
char head[MAX_HEAD_LEN]; char head[MAX_HEAD_LEN];
int headPos; int headPos;
int postPos; int postPos;
char *sendBuff;
int sendBuffLen;
}; };
//Connection pool //Connection pool
@ -194,10 +199,8 @@ int ICACHE_FLASH_ATTR httpdGetHeader(HttpdConnData *conn, char *header, char *re
void ICACHE_FLASH_ATTR httpdStartResponse(HttpdConnData *conn, int code) { void ICACHE_FLASH_ATTR httpdStartResponse(HttpdConnData *conn, int code) {
char buff[128]; char buff[128];
int l; int l;
espconn_sent(conn->conn, (uint8 *)"Hello", 5);
espconn_sent(conn->conn, (uint8 *)"World", 5);
l=os_sprintf(buff, "HTTP/1.0 %d OK\r\nServer: esp8266-httpd/"HTTPDVER"\r\n", code); l=os_sprintf(buff, "HTTP/1.0 %d OK\r\nServer: esp8266-httpd/"HTTPDVER"\r\n", code);
espconn_sent(conn->conn, (uint8 *)buff, l); httpdSend(conn, buff, l);
} }
//Send a http header. //Send a http header.
@ -206,12 +209,12 @@ void ICACHE_FLASH_ATTR httpdHeader(HttpdConnData *conn, const char *field, const
int l; int l;
l=os_sprintf(buff, "%s: %s\r\n", field, val); l=os_sprintf(buff, "%s: %s\r\n", field, val);
espconn_sent(conn->conn, (uint8 *)buff, l); httpdSend(conn, buff, l);
} }
//Finish the headers. //Finish the headers.
void ICACHE_FLASH_ATTR httpdEndHeaders(HttpdConnData *conn) { void ICACHE_FLASH_ATTR httpdEndHeaders(HttpdConnData *conn) {
espconn_sent(conn->conn, (uint8 *)"\r\n", 2); httpdSend(conn, "\r\n", -1);
} }
//ToDo: sprintf->snprintf everywhere... esp doesn't have snprintf tho' :/ //ToDo: sprintf->snprintf everywhere... esp doesn't have snprintf tho' :/
@ -220,7 +223,7 @@ void ICACHE_FLASH_ATTR httpdRedirect(HttpdConnData *conn, char *newUrl) {
char buff[1024]; char buff[1024];
int l; int l;
l=os_sprintf(buff, "HTTP/1.1 302 Found\r\nLocation: %s\r\n\r\nMoved to %s\r\n", newUrl, newUrl); l=os_sprintf(buff, "HTTP/1.1 302 Found\r\nLocation: %s\r\n\r\nMoved to %s\r\n", newUrl, newUrl);
espconn_sent(conn->conn, (uint8 *)buff, l); httpdSend(conn, buff, l);
} }
//Use this as a cgi function to redirect one url to another. //Use this as a cgi function to redirect one url to another.
@ -229,29 +232,54 @@ int ICACHE_FLASH_ATTR cgiRedirect(HttpdConnData *connData) {
//Connection aborted. Clean up. //Connection aborted. Clean up.
return HTTPD_CGI_DONE; return HTTPD_CGI_DONE;
} }
httpdRedirect(connData, (char*)connData->cgiArg); httpdRedirect(connData, (char*)connData->cgiArg);
return HTTPD_CGI_DONE; return HTTPD_CGI_DONE;
} }
//Add data to the send buffer. len is the length of the data. If len is -1
//the data is seen as a C-string.
//Returns 1 for success, 0 for out-of-memory.
int ICACHE_FLASH_ATTR httpdSend(HttpdConnData *conn, const char *data, int len) {
if (len<0) len=strlen(data);
if (conn->priv->sendBuffLen+len>MAX_SENDBUFF_LEN) return 0;
os_memcpy(conn->priv->sendBuff+conn->priv->sendBuffLen, data, len);
conn->priv->sendBuffLen+=len;
return 1;
}
//Helper function to send any data in conn->priv->sendBuff
static void ICACHE_FLASH_ATTR xmitSendBuff(HttpdConnData *conn) {
if (conn->priv->sendBuffLen!=0) {
espconn_sent(conn->conn, (uint8_t*)conn->priv->sendBuff, conn->priv->sendBuffLen);
conn->priv->sendBuffLen=0;
}
}
//Callback called when the data on a socket has been successfully //Callback called when the data on a socket has been successfully
//sent. //sent.
static void ICACHE_FLASH_ATTR httpdSentCb(void *arg) { static void ICACHE_FLASH_ATTR httpdSentCb(void *arg) {
int r; int r;
HttpdConnData *conn=httpdFindConnData(arg); HttpdConnData *conn=httpdFindConnData(arg);
char sendBuff[MAX_SENDBUFF_LEN];
// os_printf("Sent callback on conn %p\n", conn); // os_printf("Sent callback on conn %p\n", conn);
if (conn==NULL) return; if (conn==NULL) return;
conn->priv->sendBuff=sendBuff;
conn->priv->sendBuffLen=0;
if (conn->cgi==NULL) { //Marked for destruction? if (conn->cgi==NULL) { //Marked for destruction?
os_printf("Conn %p is done. Closing.\n", conn->conn); os_printf("Conn %p is done. Closing.\n", conn->conn);
espconn_disconnect(conn->conn); espconn_disconnect(conn->conn);
httpdRetireConn(conn); httpdRetireConn(conn);
return; return; //No need to call xmitSendBuff.
} }
r=conn->cgi(conn); //Execute cgi fn. r=conn->cgi(conn); //Execute cgi fn.
if (r==HTTPD_CGI_DONE) { if (r==HTTPD_CGI_DONE) {
conn->cgi=NULL; //mark for destruction. conn->cgi=NULL; //mark for destruction.
} }
xmitSendBuff(conn);
} }
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"; 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";
@ -283,7 +311,7 @@ static void ICACHE_FLASH_ATTR httpdSendResp(HttpdConnData *conn) {
} }
//Can't find :/ //Can't find :/
os_printf("%s not found. 404!\n", conn->url); os_printf("%s not found. 404!\n", conn->url);
espconn_sent(conn->conn, (uint8 *)httpNotFoundHeader, os_strlen(httpNotFoundHeader)); httpdSend(conn, httpNotFoundHeader, -1);
conn->cgi=NULL; //mark for destruction conn->cgi=NULL; //mark for destruction
} }
@ -329,13 +357,16 @@ static void ICACHE_FLASH_ATTR httpdParseHeader(char *h, HttpdConnData *conn) {
} }
} }
//Callback called when there's data available on a socket. //Callback called when there's data available on a socket.
static void ICACHE_FLASH_ATTR httpdRecvCb(void *arg, char *data, unsigned short len) { static void ICACHE_FLASH_ATTR httpdRecvCb(void *arg, char *data, unsigned short len) {
int x; int x;
char *p, *e; char *p, *e;
char sendBuff[MAX_SENDBUFF_LEN];
HttpdConnData *conn=httpdFindConnData(arg); HttpdConnData *conn=httpdFindConnData(arg);
if (conn==NULL) return; if (conn==NULL) return;
conn->priv->sendBuff=sendBuff;
conn->priv->sendBuffLen=0;
for (x=0; x<len; x++) { for (x=0; x<len; x++) {
if (conn->priv->headPos!=-1) { if (conn->priv->headPos!=-1) {
@ -371,10 +402,11 @@ static void ICACHE_FLASH_ATTR httpdRecvCb(void *arg, char *data, unsigned short
os_printf("Post data: %s\n", conn->postBuff); os_printf("Post data: %s\n", conn->postBuff);
//Send the response. //Send the response.
httpdSendResp(conn); httpdSendResp(conn);
return; break;
} }
} }
} }
xmitSendBuff(conn);
} }
static void ICACHE_FLASH_ATTR httpdReconCb(void *arg, sint8 err) { static void ICACHE_FLASH_ATTR httpdReconCb(void *arg, sint8 err) {

@ -47,5 +47,6 @@ void ICACHE_FLASH_ATTR httpdStartResponse(HttpdConnData *conn, int code);
void ICACHE_FLASH_ATTR httpdHeader(HttpdConnData *conn, const char *field, const char *val); void ICACHE_FLASH_ATTR httpdHeader(HttpdConnData *conn, const char *field, const char *val);
void ICACHE_FLASH_ATTR httpdEndHeaders(HttpdConnData *conn); void ICACHE_FLASH_ATTR httpdEndHeaders(HttpdConnData *conn);
int ICACHE_FLASH_ATTR httpdGetHeader(HttpdConnData *conn, char *header, char *ret, int retLen); int ICACHE_FLASH_ATTR httpdGetHeader(HttpdConnData *conn, char *header, char *ret, int retLen);
int ICACHE_FLASH_ATTR httpdSend(HttpdConnData *conn, const char *data, int len);
#endif #endif

@ -115,7 +115,7 @@ int ICACHE_FLASH_ATTR cgiEspFsTemplate(HttpdConnData *connData) {
//Inside ordinary text. //Inside ordinary text.
if (buff[x]=='%') { if (buff[x]=='%') {
//Send raw data up to now //Send raw data up to now
if (sp!=0) espconn_sent(connData->conn, (uint8 *)e, sp); if (sp!=0) httpdSend(connData, e, sp);
sp=0; sp=0;
//Go collect token chars. //Go collect token chars.
tpd->tokenPos=0; tpd->tokenPos=0;
@ -127,7 +127,7 @@ int ICACHE_FLASH_ATTR cgiEspFsTemplate(HttpdConnData *connData) {
if (tpd->tokenPos==0) { if (tpd->tokenPos==0) {
//This is the second % of a %% escape string. //This is the second % of a %% escape string.
//Send a single % and resume with the normal program flow. //Send a single % and resume with the normal program flow.
espconn_sent(connData->conn, (uint8 *)"%", 1); httpdSend(connData, "%", 1);
} else { } else {
//This is an actual token. //This is an actual token.
tpd->token[tpd->tokenPos++]=0; //zero-terminate token tpd->token[tpd->tokenPos++]=0; //zero-terminate token
@ -143,7 +143,7 @@ int ICACHE_FLASH_ATTR cgiEspFsTemplate(HttpdConnData *connData) {
} }
} }
//Send remaining bit. //Send remaining bit.
if (sp!=0) espconn_sent(connData->conn, (uint8 *)e, sp); if (sp!=0) httpdSend(connData, e, sp);
if (len!=1024) { if (len!=1024) {
//We're done. //We're done.
((TplCallback)(connData->cgiArg))(connData, NULL, &tpd->tplArg); ((TplCallback)(connData->cgiArg))(connData, NULL, &tpd->tplArg);

Loading…
Cancel
Save