📄 http.c
字号:
#ifndef _HTTP_C
#define _HTTP_C
#include "http.h"
#include "lwip/api.h"
#include "lwip/ip_addr.h"
#include "target.h"
#include "stdlib.h"
#define MAX_CONNECTION_BUFFER 4096
#define MAX_DYNAMIC_HANDLERS 2
#define MAX_LINE 80
#define MAX_LOG 1024
#define MAX_FILE_NUM 10
typedef _US ERROR_CODE;
extern char *testFile;
extern char filedata[];
extern char log[MAX_LOG];
extern _UL curWrite;
char * defultFunction(void);
char buffer[MAX_CONNECTION_BUFFER] = {0};
char filename[MAX_FILE_NAME_LENTH] = {0};
char * notfound = {"HTTP/1.1 Not Found \r\n\r\n"};
char * notimplemented = {"HTTP/1.1 501 not implemented\n\n"};
char * success = {"HTTP/1.1 200 OK\n"};
char * created = {"HTTP/1.1 201 Created\n"};
char * defaulted = {"0xFFFFFF"};
char * status[3] = {"停止","运行","故障"};
char * Unauthorized ={"HTTP/1.1 401 Unauthorized \r\n\r\n"};
char * Forbidden ={"HTTP/1.1 403 Forbidden \r\n\r\n"};
char * UserCheckFail = {"HTTP/1.1 200 OK\nConetent-Type: text/html\n\n User check: %s!\n\n"};
char * param = {"parameter error"};
char sendbuffer[200] = {0};
char * unkown = {"未知"};
//解析变量缓存区
char varbuf[50] = {0};
//发送文件缓冲区
char sendFilebuf[MAX_SENDBUF_SIZE] = {0};
//数字转字符串临时变量
char tempitostr[9] = {0};
char * temp = {"256"};
char * zero = {"0度以下"};
char temper = 0;
//数据采集显示允许标志
_UC SampleFlag = 0;
extern char * g_loginFile;
extern char * test;
extern char * g_dispFile;
extern char * regErrFile;
extern char * registerFile;
extern char * regSuccess;
extern char *regMaxout;
void parseAndsendTTFile(struct netconn * newconn,struct fileSetStruct * file);
char * itostr(_UL data);
char* tempFunction(void);
char* statusFunction(void);
char* loadFunction(void);
char * content_types[6] =
{
"text/plain",
"text/html",
"text/plain",
"image/gif",
"image/gif",
"text/html",
};
struct UserInfo userdata[MAX_USER_NUM] = {0};
struct fileSetStruct fileSet[MAX_FILE_NUM] = {0};
struct dynamicContentStruct dynamicContent[MAX_DYNAMIC_CONTENT]=
{
{"status", statusFunction},
{"temp", tempFunction},
{"load", loadFunction},
{"",defultFunction}
};
struct dynamichandlerStruct dynamichandler[MAX_DYNAMIC_HANDLERS]=
{
};
char * itostr(_UL data)
{
_UL i = 0;
_UL temdata = 0;
_UL length = 0;
_UL modData=0;
temdata = data;
memset(tempitostr,0,9);
Uart_Printf("data = %lu\n",data);
//计算该数转化为十进制长度
for (length=0;;length++)
{
temdata = temdata/10;
//Uart_Printf("temdata = %lu\n",temdata);
if (0 != temdata)
{
continue;
}
else
{
break;
}
}
//补上个位的长度
length++;
//Uart_Printf("length = %d\n",length);
temdata = data;
//Uart_Printf("data = %lu\n",temdata);
for (i=0;(i<length)&&(length<9);i++)
{
modData = temdata%10;
//Uart_Printf("eee= %lu\n",modData);
tempitostr[length - 1 - i] = modData+'0';
temdata = temdata/10;
//Uart_Printf("temdata = %lu\n",temdata);
}
//Uart_Printf("tempitostr = %s\n",tempitostr);
return tempitostr;
}
char* statusFunction(void)
{
return (char * )status[SampleFlag];
}
char* tempFunction(void)
{
_UL i;
char * ptr;
ptr = NULL;
i = 0;
if (temper<155)
{
return zero;
}
i = (temper - 155)/2;
if (1 != SampleFlag)
{
return unkown;
}
ptr = itostr(i);
if (NULL != ptr)
{
return ptr;
}
else
{
return (char * )temp;
}
}
char* loadFunction(void)
{
_UL i = 30;
char * ptr;
ptr = NULL;
//Uart_Printf("i = %d\n",i);
if (1 != SampleFlag)
{
return unkown;
}
ptr = itostr(i);
if (NULL != ptr)
{
return ptr;
}
else
{
return (char * )temp;
}
}
char* defultFunction(void)
{
return (char * )temp;
}
char *page=
{//"HTTP/1.1 200 OK\nConetent-Type: text/html\n\n"
"<HTML><HEAD><TITLE>登录</TITLE></HEAD>"
"<BODY><H1>输入您的注册信息:</H1>"
//"<FORM ACTION=\"/login\" METHOD= \"POST\">"
//"用户名:<INPUT TYPE=TEXT NAME=\"username\" SIZE=10>"
"<FORM ACTION=/login METHOD= POST>"
"用户名:<INPUT TYPE=TEXT NAME=username SIZE=10>"
"密码:<INPUT TYPE=password NAME=psw SIZE=6>"
"<INPUT TYPE=submit value=登录 NAME=Go>"
"</FORM></BODY></HTML>\r\n\r\n"
};
void initFileInfo(void)
{
//Uart_Printf("initFileInfo");
//reg file: login.html
strcpy(fileSet[0].name,"login.html");
fileSet[0].pfileStart = g_loginFile;
fileSet[0].size = strlen(g_loginFile);
fileSet[0].isVerify = 0;
//reg file: disp.html
strcpy(fileSet[1].name,"disp.html");
fileSet[1].pfileStart = g_dispFile;
fileSet[1].size = strlen(g_dispFile);
fileSet[1].isVerify = 1;
//reg file: regError.html
strcpy(fileSet[2].name,"regerror.html");
fileSet[2].pfileStart = regErrFile;
fileSet[2].size = strlen(regErrFile);
fileSet[2].isVerify = 0;
//reg file: registerFile
strcpy(fileSet[3].name,"register.html");
fileSet[3].pfileStart = registerFile;
fileSet[3].size = strlen(registerFile);
fileSet[3].isVerify = 0;
//reg file: regSuccess
strcpy(fileSet[4].name,"regSuccess.html");
fileSet[4].pfileStart = regSuccess;
fileSet[4].size = strlen(regSuccess);
fileSet[4].isVerify = 0;
//reg file: regMaxout
strcpy(fileSet[5].name,"regMaxout.html");
fileSet[5].pfileStart = regMaxout;
fileSet[5].size = strlen(regMaxout);
fileSet[5].isVerify = 0;
//fileSet[0].pfileStart = test;
//fileSet[0].size = strlen(test);
//fileSet[0].pfileStart = testFile;
//fileSet[0].size = strlen(testFile);
//Uart_Printf("fileSet[0].size = %lu\n",fileSet[0].size);
}
_UL lookupFile(char * filename,struct fileSetStruct *file)
{
_UL i;
for (i=0;i<MAX_FILE_NUM;i++)
{
if (!strcmp(fileSet[i].name,filename))
{//找到文件
*file = fileSet[i];
return 1;
}
}
return 0;
}
_UL checkContentType(struct fileSetStruct * file)
{
char suffix[20];
_UL i;
_UL offset;
for (i=0;file->name[i]!= 0;i++)
{
if (file->name[i] == '.')
{
break;
}
}
if (file->name[i] == 0)
{
return (TEXT_PLAIN);
}
else
{
i++;
offset = i;
for (i=0;file->name[offset+i] != 0;i++)
{//文件名后缀
suffix[i] = file->name[offset+i];
}
suffix[i] = 0;
if ( !strncmp(suffix,"html",4)
||!strncmp(suffix,"HTML",4)
||!strncmp(suffix,"htm", 3)
||!strncmp(suffix,"HTM", 3) )
{
return (TEXT_HTML);
}
else if( !strncmp(suffix,"class",5)
||!strncmp(suffix,"CLASS",5)
||!strncmp(suffix,"jar", 3)
||!strncmp(suffix,"JAR", 3) )
{
return (OCTET_STREAM);
}
else if( !strncmp(suffix,"jpeg",4)
||!strncmp(suffix,"JPEG",4)
||!strncmp(suffix,"jpg", 3)
||!strncmp(suffix,"JPG", 3) )
{
return (JPEG_IMAGE);
}
else if( !strncmp(suffix,"gif",3)
||!strncmp(suffix,"GIF", 3) )
{
return (GIF_IMAGE);
}
else if( !strncmp(suffix,"hdml",4)
||!strncmp(suffix,"HDML", 4) )
{
return (TEXT_HDML);
}
else
{
return (OCTET_STREAM);
}
}
}
#if 0
void sendFile(struct netconn * newconn,struct fileSetStruct * file)
{
_UL ct;
_UL count,i;
ct = checkContentType(file);
returnFileHeader(newconn,ct);
//Uart_Printf("file->size = %d\n",file->size);
count = (file->size)/100;
for (i=0;i<count;i++)
{
// netconn_write(newconn, file->pfileStart, file->size, NETCONN_COPY);
netconn_write(newconn, (file->pfileStart+i*100), 100, NETCONN_COPY);
}
netconn_write(newconn, (file->pfileStart+i*100), ((file->size)%100), NETCONN_COPY);
//Uart_Printf("file.pfileStart = %s\n",file->pfileStart);
//Uart_Printf("i= %d\n",i);
//Uart_Printf("sendFile\n");
#if 0
if ( (ct == TEXT_HTML)||(ct == TEXT_HDML) )
{
parseAndEmitFile(newconn,filehdr);
}
else
{//将文件传回客户端
netconn_write(newconn, file->pfileStart, file->size, NETCONN_COPY);
}
#endif
}
#endif
void sendFile(struct netconn * newconn,struct fileSetStruct * file)
{
_UL ct;
_UL count,i;
ct = checkContentType(file);
returnFileHeader(newconn,ct);
//Uart_Printf("file.pfileStart = %s\n",file->pfileStart);
//Uart_Printf("i= %d\n",i);
//Uart_Printf("sendFile\n");
if ( (ct == TEXT_HTML)||(ct == TEXT_HDML) )
{
//parseAndEmitFile(newconn,filehdr);
parseAndsendTTFile(newconn,file);
return;
}
//非HTML文件
//Uart_Printf("file->size = %d\n",file->size);
count = (file->size)/100;
for (i=0;i<count;i++)
{
// netconn_write(newconn, file->pfileStart, file->size, NETCONN_COPY);
netconn_write(newconn, (file->pfileStart+i*100), 100, NETCONN_COPY);
}
netconn_write(newconn, (file->pfileStart+i*100), ((file->size)%100), NETCONN_COPY);
}
void initUserInfo(void)
{
_UL i = 0;
for (i=0;i<MAX_USER_NUM;i++)
{
memset((_UC *)&(userdata[i]),0,sizeof(struct UserInfo));
}
}
ERROR_CODE addUserData(char *name,char * psw,_UL time)
{
_UL i = 0;
if ((strlen(name)>10)||(strlen(psw)>6))
{
return USER_FAIL;
}
for (i=0;i<MAX_USER_NUM;i++)
{
//memset((_UC *)&(userdata[i]),0,sizeof(struct UserInfo));
if (!strcmp(userdata[i].name,name))
{
return USER_EXIST;//
}
}
//add user info
for (i=0;i<MAX_USER_NUM;i++)
{
//memset((_UC *)&(userdata[i]),0,sizeof(struct UserInfo));
if (strlen(userdata[i].name) == 0)
{
strncpy(userdata[i].name,name,strlen(name));
strncpy(userdata[i].psw,psw,strlen(psw));
userdata[i].Validtime = time;
return USER_SUCCESS;//
}
}
return USER_OUT;
}
void printUserData(void)
{
_UL i = 0;
for (i=0;i<MAX_USER_NUM;i++)
{
//memset((_UC *)&(userdata[i]),0,sizeof(struct UserInfo));
if (strlen(userdata[i].name))
{
Uart_Printf("********************************************\n");
Uart_Printf("userdata[%d].name = %s\n",i,userdata[i].name);
Uart_Printf("userdata[%d].psw = %s\n",i,userdata[i].psw);
Uart_Printf("userdata[%d].Validtime = %lu\n",i,userdata[i].Validtime);
}
}
}
ERROR_CODE CheckUserData(char *name,char * psw,_US *userNo)
{
_UL i = 0;
if ((strlen(name)>10)||(strlen(psw)>6))
{
return USER_INPUT_ERR;
}
//Uart_Printf("CheckUserData:\n ");
//Uart_Printf("name = %s\n ",name);
//Uart_Printf("psw = %s \n",psw);
for (i=0;i<MAX_USER_NUM;i++)
{
//Uart_Printf("CheckUserData: i= %d\n",i);
//memset((_UC *)&(userdata[i]),0,sizeof(struct UserInfo));
if (strcmp(userdata[i].name,name) == 0)
{
//Uart_Printf("name past! \n");
if (strcmp(userdata[i].psw,psw) == 0)
{
//Uart_Printf("psw past! \n");
*userNo = i;
return USER_VALID;//
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -