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

📄 http.c

📁 ucos移植到44b0
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 + -