| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -94,8 +94,9 @@ static HttpdConnData ICACHE_FLASH_ATTR *httpdFindConnData(void *arg) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						for (i=0; i<MAX_CONN; i++) { | 
					 | 
					 | 
					 | 
						for (i=0; i<MAX_CONN; i++) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							if (connData[i].conn==(struct espconn *)arg) return &connData[i]; | 
					 | 
					 | 
					 | 
							if (connData[i].conn==(struct espconn *)arg) return &connData[i]; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						} | 
					 | 
					 | 
					 | 
						} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						//Shouldn't happen.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						os_printf("FindConnData: Huh? Couldn't find connection for %p\n", arg); | 
					 | 
					 | 
					 | 
						os_printf("FindConnData: Huh? Couldn't find connection for %p\n", arg); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						return NULL; //WtF?
 | 
					 | 
					 | 
					 | 
						return NULL; | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					//Retires a connection for re-use
 | 
					 | 
					 | 
					 | 
					//Retires a connection for re-use
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -174,7 +175,6 @@ int ICACHE_FLASH_ATTR httpdGetHeader(HttpdConnData *conn, char *header, char *re | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						p=p+strlen(p)+1; //skip HTTP part
 | 
					 | 
					 | 
					 | 
						p=p+strlen(p)+1; //skip HTTP part
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						while (p<(conn->priv->head+conn->priv->headPos)) { | 
					 | 
					 | 
					 | 
						while (p<(conn->priv->head+conn->priv->headPos)) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							while(*p<=32 && *p!=0) p++; //skip crap at start
 | 
					 | 
					 | 
					 | 
							while(*p<=32 && *p!=0) p++; //skip crap at start
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					//		os_printf("Looking for %s, Header: '%s'\n", header, p);
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							//See if this is the header
 | 
					 | 
					 | 
					 | 
							//See if this is the header
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							if (os_strncmp(p, header, strlen(header))==0 && p[strlen(header)]==':') { | 
					 | 
					 | 
					 | 
							if (os_strncmp(p, header, strlen(header))==0 && p[strlen(header)]==':') { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
								//Skip 'key:' bit of header line
 | 
					 | 
					 | 
					 | 
								//Skip 'key:' bit of header line
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -264,7 +264,6 @@ static void ICACHE_FLASH_ATTR httpdSentCb(void *arg) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						HttpdConnData *conn=httpdFindConnData(arg); | 
					 | 
					 | 
					 | 
						HttpdConnData *conn=httpdFindConnData(arg); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						char sendBuff[MAX_SENDBUFF_LEN]; | 
					 | 
					 | 
					 | 
						char sendBuff[MAX_SENDBUFF_LEN]; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					//	os_printf("Sent callback on conn %p\n", conn);
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if (conn==NULL) return; | 
					 | 
					 | 
					 | 
						if (conn==NULL) return; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						conn->priv->sendBuff=sendBuff; | 
					 | 
					 | 
					 | 
						conn->priv->sendBuff=sendBuff; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						conn->priv->sendBuffLen=0; | 
					 | 
					 | 
					 | 
						conn->priv->sendBuffLen=0; | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -294,7 +293,7 @@ static void ICACHE_FLASH_ATTR httpdProcessRequest(HttpdConnData *conn) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if (r!=HTTPD_CGI_NOTFOUND) { | 
					 | 
					 | 
					 | 
						if (r!=HTTPD_CGI_NOTFOUND) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							if (r==HTTPD_CGI_DONE) conn->cgi=NULL; //If cgi finishes immediately: mark conn for destruction.
 | 
					 | 
					 | 
					 | 
							if (r==HTTPD_CGI_DONE) conn->cgi=NULL; //If cgi finishes immediately: mark conn for destruction.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							xmitSendBuff(conn); | 
					 | 
					 | 
					 | 
							xmitSendBuff(conn); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						}else{ | 
					 | 
					 | 
					 | 
						} else { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							//Can't find :/
 | 
					 | 
					 | 
					 | 
							//Can't find :/
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							os_printf("%s not found. 404!\n", conn->url); | 
					 | 
					 | 
					 | 
							os_printf("%s not found. 404!\n", conn->url); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							httpdSend(conn, httpNotFoundHeader, -1); | 
					 | 
					 | 
					 | 
							httpdSend(conn, httpNotFoundHeader, -1); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -309,15 +308,15 @@ static void ICACHE_FLASH_ATTR httpdParseHeader(char *h, HttpdConnData *conn) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						char first_line = false; | 
					 | 
					 | 
					 | 
						char first_line = false; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  // os_printf("Got header %s\n", h);
 | 
					 | 
					 | 
					 | 
					  // os_printf("Got header %s\n", h);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if (os_strncmp(h, "GET ", 4)==0){ | 
					 | 
					 | 
					 | 
						if (os_strncmp(h, "GET ", 4)==0) { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							conn->requestType = HTTPD_METHOD_GET; | 
					 | 
					 | 
					 | 
							conn->requestType = HTTPD_METHOD_GET; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							first_line = true; | 
					 | 
					 | 
					 | 
							first_line = true; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						}else if(os_strncmp(h, "POST ", 5)==0) { | 
					 | 
					 | 
					 | 
						} else if (os_strncmp(h, "POST ", 5)==0) { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							conn->requestType = HTTPD_METHOD_POST; | 
					 | 
					 | 
					 | 
							conn->requestType = HTTPD_METHOD_POST; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							first_line = true; | 
					 | 
					 | 
					 | 
							first_line = true; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						} | 
					 | 
					 | 
					 | 
						} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if(first_line){ | 
					 | 
					 | 
					 | 
						if (first_line) { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							char *e; | 
					 | 
					 | 
					 | 
							char *e; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							
 | 
					 | 
					 | 
					 | 
							
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							//Skip past the space after POST/GET
 | 
					 | 
					 | 
					 | 
							//Skip past the space after POST/GET
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -366,20 +365,20 @@ static void ICACHE_FLASH_ATTR httpdParseHeader(char *h, HttpdConnData *conn) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							conn->post->len=atoi(h+i+1); | 
					 | 
					 | 
					 | 
							conn->post->len=atoi(h+i+1); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							// Allocate the buffer
 | 
					 | 
					 | 
					 | 
							// Allocate the buffer
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							if(conn->post->len > MAX_POST){ | 
					 | 
					 | 
					 | 
							if (conn->post->len > MAX_POST) { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
								// we'll stream this in in chunks
 | 
					 | 
					 | 
					 | 
								// we'll stream this in in chunks
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
								conn->post->buffSize = MAX_POST; | 
					 | 
					 | 
					 | 
								conn->post->buffSize = MAX_POST; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							}else{ | 
					 | 
					 | 
					 | 
							} else { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
								conn->post->buffSize = conn->post->len; | 
					 | 
					 | 
					 | 
								conn->post->buffSize = conn->post->len; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							} | 
					 | 
					 | 
					 | 
							} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							os_printf("Mallocced buffer for %d + 1 bytes of post data.\n", conn->post->buffSize); | 
					 | 
					 | 
					 | 
							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->buff=(char*)os_malloc(conn->post->buffSize + 1); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							conn->post->buffLen=0; | 
					 | 
					 | 
					 | 
							conn->post->buffLen=0; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						} else if (os_strncmp(h, "Content-Type: ", 14)==0) { | 
					 | 
					 | 
					 | 
						} else if (os_strncmp(h, "Content-Type: ", 14)==0) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							if(os_strstr(h, "multipart/form-data")){ | 
					 | 
					 | 
					 | 
							if (os_strstr(h, "multipart/form-data")) { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
								// It's multipart form data so let's pull out the boundary for future use
 | 
					 | 
					 | 
					 | 
								// It's multipart form data so let's pull out the boundary for future use
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
								char *b; | 
					 | 
					 | 
					 | 
								char *b; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
								if((b = os_strstr(h, "boundary=")) != NULL){ | 
					 | 
					 | 
					 | 
								if ((b = os_strstr(h, "boundary=")) != NULL) { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
									conn->post->multipartBoundary = b + 7; // move the pointer 2 chars before boundary then fill them with dashes
 | 
					 | 
					 | 
					 | 
									conn->post->multipartBoundary = b + 7; // move the pointer 2 chars before boundary then fill them with dashes
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
									conn->post->multipartBoundary[0] = '-'; | 
					 | 
					 | 
					 | 
									conn->post->multipartBoundary[0] = '-'; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
									conn->post->multipartBoundary[1] = '-'; | 
					 | 
					 | 
					 | 
									conn->post->multipartBoundary[1] = '-'; | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -449,7 +448,7 @@ static void ICACHE_FLASH_ATTR httpdReconCb(void *arg, sint8 err) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					static void ICACHE_FLASH_ATTR httpdDisconCb(void *arg) { | 
					 | 
					 | 
					 | 
					static void ICACHE_FLASH_ATTR httpdDisconCb(void *arg) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#if 0 | 
					 | 
					 | 
					 | 
					#if 0 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						//Stupid esp sdk passes through wrong arg here, namely the one of the *listening* socket.
 | 
					 | 
					 | 
					 | 
						//The esp sdk passes through wrong arg here, namely the one of the *listening* socket.
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						//If it ever gets fixed, be sure to update the code in this snippet; it's probably out-of-date.
 | 
					 | 
					 | 
					 | 
						//If it ever gets fixed, be sure to update the code in this snippet; it's probably out-of-date.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						HttpdConnData *conn=httpdFindConnData(arg); | 
					 | 
					 | 
					 | 
						HttpdConnData *conn=httpdFindConnData(arg); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						os_printf("Disconnected, conn=%p\n", conn); | 
					 | 
					 | 
					 | 
						os_printf("Disconnected, conn=%p\n", conn); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -501,7 +500,7 @@ static void ICACHE_FLASH_ATTR httpdConnectCb(void *arg) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						espconn_regist_sentcb(conn, httpdSentCb); | 
					 | 
					 | 
					 | 
						espconn_regist_sentcb(conn, httpdSentCb); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					//Httpd initialization routine. Call this to kick off webserver functionality.
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					void ICACHE_FLASH_ATTR httpdInit(HttpdBuiltInUrl *fixedUrls, int port) { | 
					 | 
					 | 
					 | 
					void ICACHE_FLASH_ATTR httpdInit(HttpdBuiltInUrl *fixedUrls, int port) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						int i; | 
					 | 
					 | 
					 | 
						int i; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |