📄 http_svr.c
字号:
// copy the buffer with page size
memcpy(TCP_TX_BUF, HTTP_WebSide, HTTP_BytesToSend);
// bytes to transmit
TCP_Tx_Data_Count = HTTP_BytesToSend;
// schedule buffer for transfer
TCP_TransmitTxBuffer();
// and we can close the connection
TCP_Close();
// everything sent
HTTP_BytesToSend = 0;
}
}
// release buffer after parsing
TCP_ReleaseRxBuffer();
}
}
}
/******************************************************************************
* HTTP_SVR: HTTP_parse_cgi_buffer()
*
* Purpose:
* extracts CGI information from TCB Buffer
*
* Actions:
*
*****************************************************************************/
MC void HTTP_parse_cgi_buffer(BYTE* TCP_buffer, WORD length)
{
char stime[10];
int i;
for(i=0; i < length; i++ )
{
if (*TCP_buffer == '=')
{
// test for day:
if (!memcmp(TCP_buffer-3, "day", 3))
{
memcpy(stime, TCP_buffer+1, 4);
sscanf(stime, "%d", &sys_day);
}
// test for hour:
if (!memcmp(TCP_buffer-4, "hour", 3))
{
memcpy(stime, TCP_buffer+1, 4);
sscanf(stime, "%d", &sys_hour);
}
// test for min:
if (!memcmp(TCP_buffer-3, "min", 3))
{
memcpy(stime, TCP_buffer+1, 4);
sscanf(stime, "%d", &sys_min);
}
// test for sec:
if (!memcmp(TCP_buffer-3, "sec", 3))
{
memcpy(stime, TCP_buffer+1, 4);
sscanf(stime, "%d", &sys_sec);
}
}
TCP_buffer++;
}
}
/******************************************************************************
* HTTP_SVR: HTTP_insert_dynamic()
*
* Purpose:
* inserts information into buffer
*
* Actions:
*
*****************************************************************************/
MC void HTTP_insert_dynamic(BYTE* HTTP_page, WORD length)
{
DWORD time;
char stime[10];
int i;
// search for "day"
for(i=0; i < length; i++ )
{
if (*HTTP_page == 'd')
{
// test for day:
if (!memcmp(HTTP_page, "day: ", 5))
{
// read clock and paste
time = _inpd(RTC_STAT);
sys_day = (time>>24);
sprintf(stime, "%03d", sys_day);
memcpy(HTTP_page+5, stime, 3);
}
}
if (*HTTP_page == 't')
{
// test for time:
if (!memcmp(HTTP_page, "time: ", 6))
{
// read clock and paste
time = _inpd(RTC_STAT);
sys_hour = ((time&0x00ff0000)>>16);
sys_min = ((time&0x0000ff00)>>8);
sys_sec = time&0x00000000ff;
sprintf(stime, "%02d", sys_hour);
memcpy(HTTP_page+6, stime, 2);
sprintf(stime, "%02d", sys_min);
memcpy(HTTP_page+9, stime, 2);
sprintf(stime, "%02d", sys_sec);
memcpy(HTTP_page+12, stime, 2);
}
}
HTTP_page++;
}
}
/******************************************************************************
* HTTP_SVR: HTTP_parse_cf()
*
* Purpose:
* prints a proper directory
*
* Actions:
*
*****************************************************************************/
MC DWORD HTTP_parse_cf()
{
int dirsize = 0;
BYTE *dirptr = (BYTE*) HTTP_Buffer;
char stemp[10];
int i = 0;
// print title
memcpy(dirptr, "<html><title> Directory </title><body>\r\n", 40);
dirptr += 40;
dirsize += 40;
// print header
memcpy(dirptr, "EZ-LAN Server Directory List <p><hr><br><pre>\r\n", 47);
dirptr += 47;
dirsize += 47;
// parse entries
for(i=0; i<ATA_CurDirEnt; i++)
{
if (ATA_DS[i].DIR_Name[0] == '\0')
{
break;
}
// currently only extract 8.3 names
if ((ATA_DS[i].DIR_Attr != 0x08) & (ATA_DS[i].DIR_Attr != 0x10) & (ATA_DS[i].DIR_Attr != 0x0f))
{
// new line string
memcpy(dirptr, "<A HREF=\"/cf/", 13);
dirptr += 13;
// name for link
memcpy(dirptr, &ATA_DS[i].DIR_Name, 12);
dirptr += 12;
// closing link
memcpy(dirptr, "\">", 2);
dirptr += 2;
// name for display
memcpy(dirptr, &ATA_DS[i].DIR_Name, 12);
dirptr += 12;
// two spaces and closing link
memcpy(dirptr, "</A> ", 6);
dirptr += 6;
// size of file
sprintf(stemp, "%08d", ATA_DS[i].DIR_FileSize);
memcpy(dirptr, stemp, 8);
dirptr += 8;
// closing line
memcpy(dirptr, " bytes\r\n", 8);
dirptr += 8;
//total size
dirsize += 61;
}
}
// close page
memcpy(dirptr, "</pre></body></html>\r\n", 22);
dirsize += 22;
// set the length page and pointer
return(dirsize-1);
}
/******************************************************************************
* HTTP_SVR: HTTP_send_cffile()
*
* Purpose:
* transmits a file
*
* Actions:
*
*****************************************************************************/
MC void HTTP_send_cffile(BYTE* filename)
{
int i, j, x;
WORD wtmp;
BYTE wbyte[4];
// search for file in list
for(i=0; i<ATA_CurDirEnt; i++)
{
x = strlen((const char*)ATA_DS[i].DIR_Name)-1;
if (!memcmp(&ATA_DS[i].DIR_Name, filename, x))
{
// get file length
ATA_CurFileSize = ATA_DS[i].DIR_FileSize;
// load ptr to first cluster
ATA_CurFilePtr = ATA_DS[i].DIR_FstClusLO;
// get file extension
for (j=0; j<x; j++)
{
if (ATA_DS[i].DIR_Name[j] == 0x2e)
{
memcpy(&wbyte, &ATA_DS[i].DIR_Name[j+1], 3);
j=x;
}
}
// send right header
if (!memcmp(&wbyte, "JPG", 3)) HTTP_FileType = JPEG;
if (!memcmp(&wbyte, "PDF", 3)) HTTP_FileType = PDF;
if (!memcmp(&wbyte, "HTM", 3)) HTTP_FileType = HTML;
break;
}
}
// read cluster
ATA_read_cluster(ATA_CurFilePtr, HTTP_Buffer);
// check for next cluster pointer
// is the FAT sector present?
if ((ATA_CurFilePtr>>8) != ATA_CurFATPtr)
{
ATA_CurFATPtr = ATA_CurFilePtr>>8;
ATA_read_fat_sector(ATA_CurFATPtr);
}
// determine pointer to next cluster
ATA_CurFilePtr = ATA_CurFATBuffer[(ATA_CurFilePtr & 0xff)];
// signal we're sending a file
HTTP_Status |= HTTP_FILE_SEND;
}
// end of file
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -