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
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, "WWW-Authenticate", "Basic realm=\""HTTP_AUTH_REALM"\"");
httpdEndHeaders(connData);
espconn_sent(connData->conn, (uint8 *)forbidden, os_strlen(forbidden));
httpdSend(connData, forbidden, -1);
//Okay, all done.
return HTTPD_CGI_DONE;
}

@ -62,7 +62,7 @@ void ICACHE_FLASH_ATTR tplLed(HttpdConnData *connData, char *token, void **arg)
os_strcpy(buff, "off");
}
}
espconn_sent(connData->conn, (uint8 *)buff, os_strlen(buff));
httpdSend(connData, buff, -1);
}
static long hitCounter=0;
@ -76,7 +76,7 @@ void ICACHE_FLASH_ATTR tplCounter(HttpdConnData *connData, char *token, void **a
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) {
//We're still scanning. Tell Javascript code that.
len=os_sprintf(buff, "{\n \"result\": { \n\"inProgress\": \"1\"\n }\n}\n");
espconn_sent(connData->conn, (uint8 *)buff, len);
httpdSend(connData, buff, len);
} else {
//We have a scan result. Pass it on.
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;
for (i=0; i<cgiWifiAps.noAps; i++) {
//Fill in json code for an access point
len=os_sprintf(buff, "{\"essid\": \"%s\", \"rssi\": \"%d\", \"enc\": \"%d\"}%s\n",
cgiWifiAps.apData[i]->ssid, cgiWifiAps.apData[i]->rssi,
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");
espconn_sent(connData->conn, (uint8 *)buff, len);
httpdSend(connData, buff, len);
//Also start a new scan.
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.");
}
}
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
//Max post buffer len
#define MAX_POST 1024
//Max send buffer len
#define MAX_SENDBUFF_LEN 2048
//This gets set at init time.
static HttpdBuiltInUrl *builtInUrls;
@ -40,6 +43,8 @@ struct HttpdPriv {
char head[MAX_HEAD_LEN];
int headPos;
int postPos;
char *sendBuff;
int sendBuffLen;
};
//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) {
char buff[128];
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);
espconn_sent(conn->conn, (uint8 *)buff, l);
httpdSend(conn, buff, l);
}
//Send a http header.
@ -206,12 +209,12 @@ void ICACHE_FLASH_ATTR httpdHeader(HttpdConnData *conn, const char *field, const
int l;
l=os_sprintf(buff, "%s: %s\r\n", field, val);
espconn_sent(conn->conn, (uint8 *)buff, l);
httpdSend(conn, buff, l);
}
//Finish the headers.
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' :/
@ -220,7 +223,7 @@ void ICACHE_FLASH_ATTR httpdRedirect(HttpdConnData *conn, char *newUrl) {
char buff[1024];
int l;
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.
@ -229,29 +232,54 @@ int ICACHE_FLASH_ATTR cgiRedirect(HttpdConnData *connData) {
//Connection aborted. Clean up.
return HTTPD_CGI_DONE;
}
httpdRedirect(connData, (char*)connData->cgiArg);
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
//sent.
static void ICACHE_FLASH_ATTR httpdSentCb(void *arg) {
int r;
HttpdConnData *conn=httpdFindConnData(arg);
char sendBuff[MAX_SENDBUFF_LEN];
// os_printf("Sent callback on conn %p\n", conn);
if (conn==NULL) return;
conn->priv->sendBuff=sendBuff;
conn->priv->sendBuffLen=0;
if (conn->cgi==NULL) { //Marked for destruction?
os_printf("Conn %p is done. Closing.\n", conn->conn);
espconn_disconnect(conn->conn);
httpdRetireConn(conn);
return;
return; //No need to call xmitSendBuff.
}
r=conn->cgi(conn); //Execute cgi fn.
if (r==HTTPD_CGI_DONE) {
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";
@ -283,7 +311,7 @@ static void ICACHE_FLASH_ATTR httpdSendResp(HttpdConnData *conn) {
}
//Can't find :/
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
}
@ -329,13 +357,16 @@ static void ICACHE_FLASH_ATTR httpdParseHeader(char *h, HttpdConnData *conn) {
}
}
//Callback called when there's data available on a socket.
static void ICACHE_FLASH_ATTR httpdRecvCb(void *arg, char *data, unsigned short len) {
int x;
char *p, *e;
char sendBuff[MAX_SENDBUFF_LEN];
HttpdConnData *conn=httpdFindConnData(arg);
if (conn==NULL) return;
conn->priv->sendBuff=sendBuff;
conn->priv->sendBuffLen=0;
for (x=0; x<len; x++) {
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);
//Send the response.
httpdSendResp(conn);
return;
break;
}
}
}
xmitSendBuff(conn);
}
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 httpdEndHeaders(HttpdConnData *conn);
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

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

Loading…
Cancel
Save