|
|
|
@ -49,6 +49,7 @@ struct HttpdPriv { |
|
|
|
|
//Connection pool
|
|
|
|
|
static HttpdPriv connPrivData[MAX_CONN]; |
|
|
|
|
static HttpdConnData connData[MAX_CONN]; |
|
|
|
|
static HttpdPostData connPostData[MAX_CONN]; |
|
|
|
|
|
|
|
|
|
//Listening connection data
|
|
|
|
|
static struct espconn httpdConn; |
|
|
|
@ -99,8 +100,8 @@ static HttpdConnData ICACHE_FLASH_ATTR *httpdFindConnData(void *arg) { |
|
|
|
|
|
|
|
|
|
//Retires a connection for re-use
|
|
|
|
|
static void ICACHE_FLASH_ATTR httpdRetireConn(HttpdConnData *conn) { |
|
|
|
|
if (conn->postBuff!=NULL) os_free(conn->postBuff); |
|
|
|
|
conn->postBuff=NULL; |
|
|
|
|
if (conn->post->buff!=NULL) os_free(conn->post->buff); |
|
|
|
|
conn->post->buff=NULL; |
|
|
|
|
conn->cgi=NULL; |
|
|
|
|
conn->conn=NULL; |
|
|
|
|
} |
|
|
|
@ -362,27 +363,27 @@ static void ICACHE_FLASH_ATTR httpdParseHeader(char *h, HttpdConnData *conn) { |
|
|
|
|
//Skip trailing spaces
|
|
|
|
|
while (h[i]!=' ') i++; |
|
|
|
|
//Get POST data length
|
|
|
|
|
conn->postLen=atoi(h+i+1); |
|
|
|
|
conn->post->len=atoi(h+i+1); |
|
|
|
|
|
|
|
|
|
// Allocate the buffer
|
|
|
|
|
if(conn->postLen > MAX_POST){ |
|
|
|
|
if(conn->post->len > MAX_POST){ |
|
|
|
|
// we'll stream this in in chunks
|
|
|
|
|
conn->postBuffSize = MAX_POST; |
|
|
|
|
conn->post->buffSize = MAX_POST; |
|
|
|
|
}else{ |
|
|
|
|
conn->postBuffSize = conn->postLen; |
|
|
|
|
conn->post->buffSize = conn->post->len; |
|
|
|
|
} |
|
|
|
|
os_printf("Mallocced buffer for %d + 1 bytes of post data.\n", conn->postBuffSize); |
|
|
|
|
conn->postBuff=(char*)os_malloc(conn->postBuffSize + 1); |
|
|
|
|
conn->postBuffLen=0; |
|
|
|
|
os_printf("Mallocced buffer for %d + 1 bytes of post data.\n", conn->post->buffSize); |
|
|
|
|
conn->post->buff=(char*)os_malloc(conn->post->buffSize + 1); |
|
|
|
|
conn->post->buffLen=0; |
|
|
|
|
} else if (os_strncmp(h, "Content-Type: ", 14)==0) { |
|
|
|
|
if(os_strstr(h, "multipart/form-data")){ |
|
|
|
|
// It's multipart form data so let's pull out the boundary for future use
|
|
|
|
|
char *b; |
|
|
|
|
if((b = os_strstr(h, "boundary=")) != NULL){ |
|
|
|
|
conn->multipartBoundary = b + 7; // move the pointer 2 chars before boundary then fill them with dashes
|
|
|
|
|
conn->multipartBoundary[0] = '-'; |
|
|
|
|
conn->multipartBoundary[1] = '-'; |
|
|
|
|
os_printf("boundary = %s\n", conn->multipartBoundary); |
|
|
|
|
conn->post->multipartBoundary = b + 7; // move the pointer 2 chars before boundary then fill them with dashes
|
|
|
|
|
conn->post->multipartBoundary[0] = '-'; |
|
|
|
|
conn->post->multipartBoundary[1] = '-'; |
|
|
|
|
os_printf("boundary = %s\n", conn->post->multipartBoundary); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -400,14 +401,14 @@ static void ICACHE_FLASH_ATTR httpdRecvCb(void *arg, char *data, unsigned short |
|
|
|
|
conn->priv->sendBuffLen=0; |
|
|
|
|
|
|
|
|
|
for (x=0; x<len; x++) { |
|
|
|
|
if (conn->postLen<0) { |
|
|
|
|
if (conn->post->len<0) { |
|
|
|
|
//This byte is a header byte.
|
|
|
|
|
if (conn->priv->headPos!=MAX_HEAD_LEN) conn->priv->head[conn->priv->headPos++]=data[x]; |
|
|
|
|
conn->priv->head[conn->priv->headPos]=0; |
|
|
|
|
//Scan for /r/n/r/n
|
|
|
|
|
if (data[x]=='\n' && (char *)os_strstr(conn->priv->head, "\r\n\r\n")!=NULL) { |
|
|
|
|
//Indicate we're done with the headers.
|
|
|
|
|
conn->postLen=0; |
|
|
|
|
conn->post->len=0; |
|
|
|
|
//Reset url data
|
|
|
|
|
conn->url=NULL; |
|
|
|
|
//Find end of next header line
|
|
|
|
@ -420,21 +421,20 @@ static void ICACHE_FLASH_ATTR httpdRecvCb(void *arg, char *data, unsigned short |
|
|
|
|
p=e+2; |
|
|
|
|
} |
|
|
|
|
//If we don't need to receive post data, we can send the response now.
|
|
|
|
|
if (conn->postLen==0) { |
|
|
|
|
if (conn->post->len==0) { |
|
|
|
|
httpdProcessRequest(conn); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else if (conn->postLen!=0) { |
|
|
|
|
} else if (conn->post->len!=0) { |
|
|
|
|
//This byte is a POST byte.
|
|
|
|
|
conn->postBuff[conn->postBuffLen++]=data[x]; |
|
|
|
|
conn->postReceived++; |
|
|
|
|
if (conn->postBuffLen >= conn->postBuffSize || conn->postReceived == conn->postLen) { |
|
|
|
|
conn->post->buff[conn->post->buffLen++]=data[x]; |
|
|
|
|
conn->post->received++; |
|
|
|
|
if (conn->post->buffLen >= conn->post->buffSize || conn->post->received == conn->post->len) { |
|
|
|
|
//Received a chunk of post data
|
|
|
|
|
conn->postBuff[conn->postBuffLen]=0; //zero-terminate, in case the cgi handler knows it can use strings
|
|
|
|
|
//os_printf("Post data: %s\n", conn->postBuff);
|
|
|
|
|
conn->post->buff[conn->post->buffLen]=0; //zero-terminate, in case the cgi handler knows it can use strings
|
|
|
|
|
//Send the response.
|
|
|
|
|
httpdProcessRequest(conn); |
|
|
|
|
conn->postBuffLen = 0; |
|
|
|
|
conn->post->buffLen = 0; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -489,9 +489,11 @@ static void ICACHE_FLASH_ATTR httpdConnectCb(void *arg) { |
|
|
|
|
connData[i].priv=&connPrivData[i]; |
|
|
|
|
connData[i].conn=conn; |
|
|
|
|
connData[i].priv->headPos=0; |
|
|
|
|
connData[i].postBuff=NULL; |
|
|
|
|
connData[i].postBuffLen=0; |
|
|
|
|
connData[i].postLen=-1; |
|
|
|
|
connData[i].post=&connPostData[i]; |
|
|
|
|
connData[i].post->buff=NULL; |
|
|
|
|
connData[i].post->buffLen=0; |
|
|
|
|
connData[i].post->received=0; |
|
|
|
|
connData[i].post->len=-1; |
|
|
|
|
|
|
|
|
|
espconn_regist_recvcb(conn, httpdRecvCb); |
|
|
|
|
espconn_regist_reconcb(conn, httpdReconCb); |
|
|
|
|