📄 httpd.c
字号:
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 + -