Fixing the code to work under SDK 0.9.4. This commit should work.
This commit is contained in:
@@ -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.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+5
-5
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+43
-11
@@ -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
|
||||||
+3
-3
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user