⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 httpd.c

📁 ENC28J60 System HTTP
💻 C
📖 第 1 页 / 共 3 页
字号:
					if (httpd_conn[socketnum].file_id != 0xFF){						//found ! -> remove file !						filesystem_delete_file(httpd_conn[socketnum].file_id - 0xFF);						httpd_conn[socketnum].file_id = HTTPD_STATE_FILE_REMOVED;					}				}			}						//detect \r\n\r\n			unsigned int inpos = datapos;			unsigned int inpos_old =0;			while( inpos<(datapos+datalen)){				if (buffer[inpos] == '\r'){					if ( ((httpd_conn[socketnum].substate & 0x07) == HTTPD_SUBSTATE_NONE) || 							 ((httpd_conn[socketnum].substate & 0x07) == HTTPD_SUBSTATE_RN) ){							httpd_conn[socketnum].substate++;					}else{							httpd_conn[socketnum].substate = (httpd_conn[socketnum].substate & 0xF8) | HTTPD_SUBSTATE_NONE;					}				}else if (buffer[inpos] == '\n'){					if ( ((httpd_conn[socketnum].substate & 0x07) == HTTPD_SUBSTATE_R) || 							 ((httpd_conn[socketnum].substate & 0x07) == HTTPD_SUBSTATE_RNR) ){							httpd_conn[socketnum].substate++;					}else{							httpd_conn[socketnum].substate = (httpd_conn[socketnum].substate & 0xF8) | HTTPD_SUBSTATE_NONE;					}				}else{					httpd_conn[socketnum].substate = (httpd_conn[socketnum].substate & 0xF8) | HTTPD_SUBSTATE_NONE;				}				if ((httpd_conn[socketnum].substate & 0x07) == HTTPD_SUBSTATE_RNRN){					if (httpd_conn[socketnum].file_id == HTTPD_STATE_FILE_POST){						//file_name + 2nd rnrn found -> ready						if (httpd_conn[socketnum].substate & HTTPD_SUBSTATE_POST_FN_OK)							break;						inpos_old = inpos;						//we need to grab filename now & wait for another \r\n\r\n						while(inpos<(datapos+datalen)){							///WARNING: this only works if the packet with filename is not							///splitted into two packets !!							if (string_compare_progmem_noeof("filename=\"", &buffer[inpos])){								//now the filename starts at inpos+strlen(filename=")																//try to find the filename extension:								unsigned int fextpos = inpos + 10;								while((buffer[fextpos] != '.') &&(inpos<(datapos+datalen)))									fextpos++;														//terminate filename (replace .EXT by \0EXT)								buffer[fextpos] = '\0';								#if HTTPD_DEBUG								softuart_puts_progmem("HTTP: POST ");								softuart_putnewline();								#endif 								//now open the file								filesystem_open_file_wr(&buffer[inpos+10],&buffer[fextpos+1]);								break;							}							inpos++;						}						//now find the next \r\n\r\n						httpd_conn[socketnum].substate = HTTPD_SUBSTATE_POST_FN_OK | HTTPD_SUBSTATE_NONE;					}else{						//normal GET cmd, return data after \r\n\r\n						break;					}				}				inpos++;			}			///handle http authentication for everything in /adm/:			//we check this only for the first \r\n\r\n otherwise we get problems			//with the http post stuff. maybe move the second rnrn detection to a seperate			//post substate!			if (!authorized && string_compare_progmem_noeof("adm/", file_name) ){						//authorization required!						#if HTTPD_DEBUG_AUTH						softuart_puts_progmem("HTTPD: auth failed!");						softuart_putnewline();						#endif						//not authorzed, send auth request & failure message						//when this is an http post, this is not correct...						//but simply ignore this, no normal user would be unauthorized & try to upload (he cant see up.htm)						//so this should only happens to a hacker ;)						pos = TCP_POS_TXDATA;						pos = httpd_add_progmem_data(HTTPD_RESPONSE_401,NULL, buffer, pos, 0, NIC_BUFFERSIZE-pos);						httpd_conn[socketnum].state = HTTPD_STATE_FINISHED;						*appstate = TCP_APPSTATE_HAS_TXDATA;						return (pos-TCP_POS_TXDATA);			}						if ((httpd_conn[socketnum].substate & 0x07) == HTTPD_SUBSTATE_RNRN){				//request end, send data !				pos = TCP_POS_TXDATA;				//POST test hack				if (httpd_conn[socketnum].file_id == HTTPD_STATE_FILE_POST){					//wait for filename detection!					if (httpd_conn[socketnum].substate  == HTTPD_SUBSTATE_RNRN)						break; 					if (httpd_conn[socketnum].substate & HTTPD_SUBSTATE_POST_FN_OK){						//filename detected !					}else{						#if HTTPD_DEBUG						softuart_puts_progmem("HTTP: POST (unknown filename)");						softuart_putnewline();						#endif						//open default file						filesystem_open_file_wr("upload","txt");					}					inpos++;					filesystem_write_data(&buffer[inpos], datalen-(inpos-datapos),0);										httpd_conn[socketnum].state = HTTPD_STATE_POST;					httpd_conn[socketnum].data_position -= datalen-(inpos_old-datapos)-1;					//set appstate & exit here !!					*appstate = TCP_APPSTATE_EMPTYACK;					return (pos-TCP_POS_TXDATA);				}else{					//add ok					pos = httpd_add_progmem_data(HTTPD_RESPONSE_OK,NULL, buffer, pos, 0, NIC_BUFFERSIZE-pos);										//add content type, detects jpg,png,bmp,gif,html -> default is html!					//we need to check first char only !!					switch(file_ext[0]){						case ('j'): //if (string_compare_progmem_noeof("jpg", file_ext))							pos = httpd_add_progmem_data(HTTPD_CTYPE_JPG,NULL, buffer, pos, 0, NIC_BUFFERSIZE-pos);							break;						case ('p'): //else if (string_compare_progmem_noeof("png", file_ext))							pos = httpd_add_progmem_data(HTTPD_CTYPE_PNG,NULL, buffer, pos, 0, NIC_BUFFERSIZE-pos);							break;						case ('b'): //else if (string_compare_progmem_noeof("bmp", file_ext))							pos = httpd_add_progmem_data(HTTPD_CTYPE_BMP,NULL, buffer, pos, 0, NIC_BUFFERSIZE-pos);							break;						case ('g'): //else if (string_compare_progmem_noeof("gif", file_ext))							pos = httpd_add_progmem_data(HTTPD_CTYPE_GIF,NULL, buffer, pos, 0, NIC_BUFFERSIZE-pos);							break;						default: //htm!							pos = httpd_add_progmem_data(HTTPD_CTYPE_HTML,NULL, buffer, pos, 0, NIC_BUFFERSIZE-pos);							break;					}									//add \r\n\r\n					pos = httpd_add_progmem_data(HTTPD_RNRN,NULL, buffer, pos, 0, NIC_BUFFERSIZE-pos);					*appstate = TCP_APPSTATE_HAS_TXDATA;					//http conn active now -> send data					httpd_conn[socketnum].state      = HTTPD_STATE_ACTIVE;					//store seq offset!					httpd_conn[socketnum].seq_offset = pos - datapos + 1;					return (pos-TCP_POS_TXDATA);				}			}			*appstate = TCP_APPSTATE_EMPTYACK;			return (0);			break;		case(HTTPD_STATE_ACTIVE):			#if HTTPD_DEBUG2			softuart_put_uint16(httpd_conn[socketnum].seq_offset);			#endif			offset = (tcp_sockets[socketnum].seq - httpd_conn[socketnum].seq_offset);			*appstate = TCP_APPSTATE_HAS_TXDATA;			if (httpd_conn[socketnum].file_id <= 0xFF){				///this file is not stored on dataflash				switch ((httpd_conn[socketnum].file_id)&0xFF){					///index.html					case(HTTPD_STATE_FILE_INDEX):						ret = httpd_add_progmem_data(HTTPD_FILE_INDEX_HTML,HTTPD_FILE_SITE_START_HTML,buffer,TCP_POS_TXDATA, offset, NIC_BUFFERSIZE-TCP_POS_TXDATA); 						break;					///graph0					case(HTTPD_STATE_FILE_GRAPH0):						ret = plot_generate_bmp(buffer, TCP_POS_TXDATA, NIC_BUFFERSIZE-TCP_POS_TXDATA, offset, PLOT_SOURCE_EEPROM);						break;					///upload test					case(HTTPD_STATE_FILE_UP):						ret = httpd_add_progmem_data(HTTPD_FILE_INDEX_HTML,HTTPD_FILE_SITE_UPLOAD_HTML,buffer,TCP_POS_TXDATA, offset, NIC_BUFFERSIZE-TCP_POS_TXDATA);						break;					///list	fs files					case(HTTPD_STATE_FILE_FS_LS):						ret = httpd_add_progmem_data(HTTPD_FILE_INDEX_HTML,HTTPD_FILE_SITE_FSLS_HTML,buffer,TCP_POS_TXDATA, offset, 	NIC_BUFFERSIZE-TCP_POS_TXDATA);						break;					///upload finished, up ok					case(HTTPD_STATE_FILE_UP_DONE):						ret = httpd_add_progmem_data(HTTPD_FILE_INDEX_HTML,HTTPD_FILE_SITE_UPOK_HTML,buffer,TCP_POS_TXDATA, offset, 	NIC_BUFFERSIZE-TCP_POS_TXDATA);						break;					///upload finished, up err					case(HTTPD_STATE_FILE_UP_ERR):						ret = httpd_add_progmem_data(HTTPD_FILE_INDEX_HTML,HTTPD_FILE_SITE_UPERR_HTML,buffer,TCP_POS_TXDATA, offset, 	NIC_BUFFERSIZE-TCP_POS_TXDATA);						break;					///removed fs file					case(HTTPD_STATE_FILE_REMOVED):						ret = httpd_add_progmem_data(HTTPD_FILE_INDEX_HTML,HTTPD_FILE_SITE_RMOK_HTML,buffer,TCP_POS_TXDATA, offset, 	NIC_BUFFERSIZE-TCP_POS_TXDATA);						break;					///format filesystem question					case(HTTPD_STATE_FILE_MKFS):						ret = httpd_add_progmem_data(HTTPD_FILE_INDEX_HTML, HTTPD_FILE_SITE_MKFS_HTML,buffer,TCP_POS_TXDATA, offset, 	NIC_BUFFERSIZE-TCP_POS_TXDATA);						break;					///do format					case(HTTPD_STATE_FILE_MKFS2):						ret = httpd_add_progmem_data(HTTPD_FILE_INDEX_HTML, HTTPD_FILE_SITE_MKFS2_HTML,buffer,TCP_POS_TXDATA, offset, 	NIC_BUFFERSIZE-TCP_POS_TXDATA);						break;					///cam/pic (webcam picture)					case(HTTPD_STATE_FILE_CAM_PIC):						ret = mca25_grab_data(&buffer[TCP_POS_TXDATA], NIC_BUFFERSIZE-TCP_POS_TXDATA, offset, socketnum);						if (ret == 0xFFFE){							//cam is busy -> show busy jpg !							ret = httpd_add_progmem_data_bin(HTTPD_CAM_BUSY_JPG,buffer,TCP_POS_TXDATA, offset, NIC_BUFFERSIZE-TCP_POS_TXDATA, sizeof(HTTPD_CAM_BUSY_JPG));							httpd_conn[socketnum].file_id = 6;						}else if (ret == 0xFFFF){							ret = 1;						}						//add offset						if (ret != 0)							ret = TCP_POS_TXDATA + ret;												break;					///cam/busy  ->  cam busy jpg					case(HTTPD_STATE_FILE_CAM_BUSY):						ret = httpd_add_progmem_data_bin(HTTPD_CAM_BUSY_JPG,buffer,TCP_POS_TXDATA, offset, NIC_BUFFERSIZE-TCP_POS_TXDATA, sizeof(HTTPD_CAM_BUSY_JPG));						break;					///site/cam  ->  include cam html code					case(HTTPD_STATE_FILE_SITE_CAM):						ret = httpd_add_progmem_data(HTTPD_FILE_INDEX_HTML,HTTPD_FILE_SITE_CAM_HTML,buffer,TCP_POS_TXDATA, offset, NIC_BUFFERSIZE-TCP_POS_TXDATA);						break;					///site/temp  ->  include templog					case(HTTPD_STATE_FILE_SITE_TEMP):						ret = httpd_add_progmem_data(HTTPD_FILE_INDEX_HTML,HTTPD_FILE_SITE_TEMP_HTML,buffer,TCP_POS_TXDATA, offset, NIC_BUFFERSIZE-TCP_POS_TXDATA);						break;					///site/io  ->  port io site					case(HTTPD_STATE_FILE_SITE_IO):						ret = httpd_add_progmem_data(HTTPD_FILE_INDEX_HTML,HTTPD_FILE_SITE_IO_HTML,buffer,TCP_POS_TXDATA, offset, NIC_BUFFERSIZE-TCP_POS_TXDATA);						break;					///set/xx_1 -> show green io pic					case(HTTPD_STATE_FILE_SET_IO_1_PIC):						ret = httpd_add_progmem_data_bin(HTTPD_BUTTON_GREEN,buffer,TCP_POS_TXDATA, offset, NIC_BUFFERSIZE-TCP_POS_TXDATA, sizeof(HTTPD_BUTTON_GREEN));						break;					///set/xx_0 -> show red io pic					case(HTTPD_STATE_FILE_SET_IO_0_PIC):						ret = httpd_add_progmem_data_bin(HTTPD_BUTTON_RED,buffer,TCP_POS_TXDATA, offset, NIC_BUFFERSIZE-TCP_POS_TXDATA, sizeof(HTTPD_BUTTON_RED));						break;					///servo moving					case(HTTPD_STATE_FILE_SERVO_OK):						ret = httpd_add_progmem_data(HTTPD_FILE_INDEX_HTML,HTTPD_FILE_SITE_SERVO_OK,buffer,TCP_POS_TXDATA, offset, NIC_BUFFERSIZE-TCP_POS_TXDATA);						break;					///get/set servo pos					case(HTTPD_STATE_FILE_SERVO_POS):						ret = servo_generate_bmp(buffer, TCP_POS_TXDATA, NIC_BUFFERSIZE-TCP_POS_TXDATA, offset, PLOT_SOURCE_EEPROM);						break;					///add file icon gif					case(HTTPD_STATE_FILE_SITE_FILE_ICON_PIC):						ret = httpd_add_progmem_data_bin(HTTPD_FILE_ICON_GIF,buffer,TCP_POS_TXDATA, offset, NIC_BUFFERSIZE-TCP_POS_TXDATA, sizeof(HTTPD_BUTTON_RED));						break;					///404 - not found !					default:						#if HTTPD_DEBUG						softuart_puts_progmem("HTTP: 404 file not found!");						softuart_putnewline();						#endif						ret = httpd_add_progmem_data(HTTPD_FILE_NOT_FOUND,NULL,buffer,TCP_POS_TXDATA, offset, NIC_BUFFERSIZE-TCP_POS_TXDATA);						break;				}			}else{				///this file is stored on dataflash!				//-> send data from file x:				if ((httpd_conn[socketnum].data_position != offset) || (offset == 0)){					//we must (re)seek to position offset!					ret = filesystem_get_data(buffer, TCP_POS_TXDATA, NIC_BUFFERSIZE-TCP_POS_TXDATA, offset, (httpd_conn[socketnum].file_id - 0xFF),&httpd_conn[socketnum].data_ptr);					//this is wrong if this is the last packet, 					//but it does not matter, after the last packet we do not need datapos any more					httpd_conn[socketnum].data_position = offset + (NIC_BUFFERSIZE-TCP_POS_TXDATA); 				}else{					//data_ptr -> flash page					//data_position % 256 -> position inside page					unsigned char indpos = httpd_conn[socketnum].data_position & 0xFF; // %256; 					ret = filesystem_get_data_startat(buffer, TCP_POS_TXDATA, NIC_BUFFERSIZE-TCP_POS_TXDATA, &httpd_conn[socketnum].data_ptr, indpos);					//this is wrong if this is the last packet, 					//but it does not matter, after the last packet we do not need datapos any more					httpd_conn[socketnum].data_position += (NIC_BUFFERSIZE-TCP_POS_TXDATA);				}							}			#if HTTPD_DEBUG2			softuart_puts_progmem("\r\nret=");			softuart_put_uint8(ret);			#endif			if (ret != 0){				httpd_conn[socketnum].state = HTTPD_STATE_FINISHED;				return ret-TCP_POS_TXDATA;			}			return NIC_BUFFERSIZE-TCP_POS_TXDATA;			break;		case(HTTPD_STATE_FINISHED):			//if this was an filesystem format request, do it !			//takes a very long time !!!			if (httpd_conn[socketnum].file_id == HTTPD_STATE_FILE_MKFS2){				LED_STATUS_OFF();				filesystem_format();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -