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

📄 handler_http.c

📁 《嵌入式网络系统设计-基于Atmel ARM7 系列》这个本书的光盘资料
💻 C
📖 第 1 页 / 共 2 页
字号:
				strlenExt(",点此<a href='#'  onclick='history.back();'>返回</a></h1></body>"));
	
	__vHTTPRespInfo(pstConn, __szResp, strlenExt(__szResp));
	OSTimeDlyHMSM(0, 0, 0, 100);
}
//*------------------------------------------------------------------------------------------------
//* 函数名称 : __ilvSendDNNotExist
//* 功能描述 : 发送IP地址
//* 入口参数 : <pstConn>[in] 指向ST_NETCONN结构的指针
//* 出口参数 : 无
//*------------------------------------------------------------------------------------------------
__inline void __ilvSendDNNotExist(ST_NETCONN *pstConn)
{
	__vHTTPRespInfo(pstConn, 
					"<boady><br><br><h1>查询的域名不存在!<a href='#'  onclick='history.back();'>返回</a></h1></body>", 
					strlenExt("<boady><br><br><h1>查询的域名不存在!<a href='#'  onclick='history.back();'>返回</a></h1></body>"));
}
//*------------------------------------------------------------------------------------------------
//* 函数名称 : __ilvSendNotConn
//* 功能描述 : 发送错误信息
//* 入口参数 : <pstConn>[in] 指向ST_NETCONN结构的指针
//* 出口参数 : 无
//*------------------------------------------------------------------------------------------------
__inline void __ilvSendNotConn(ST_NETCONN *pstConn)
{
	__vHTTPRespInfo(pstConn, 
					"<boady><br><br><h1>无法收到DNS服务器的响应!<a href='#'  onclick='history.back();'>返回</a></h1></body>", 
					strlenExt("<boady><br><br><h1>无法收到DNS服务器的响应!<a href='#'  onclick='history.back();'>返回</a></h1></body>"));
}
//*------------------------------------------------------------------------------------------------
//* 函数名称 : __vDNToIP
//* 功能描述 : 将域名转换为IP地址
//* 入口参数 :     <pstConn>[in] 指向ST_NETCONN结构的指针
//*          :    <pszParam>[in] 指向参数开始位置的指针
//*          : <s32ParamLen>[in] 参数长度
//* 出口参数 : 无
//*------------------------------------------------------------------------------------------------
static void __vDNToIP(ST_NETCONN *pstConn, INT8S *pszParam, INT32S s32ParamLen)
{
	INT32S	__s32QuestionLen;
	INT8S	__szQuestion[132];
	INT32U  __u32IP;
	
	//* 封装DNS查询参数
	__s32QuestionLen = __ils32PacketDNSQuestion(pszParam, s32ParamLen, __szQuestion, sizeof(__szQuestion));
	
	switch(u32DNToIP(__szQuestion, __s32QuestionLen, &__u32IP))
	{
		case	DNS_OK        :
				__ilvSendIP(pstConn, __u32IP);
				break;
		
		case	DNS_OTHER     :
		case	DNS_NOT_EXIST :
				__ilvSendDNNotExist(pstConn);
				break;
				
		case	DNS_NOT_CONN  :
				__ilvSendNotConn(pstConn);
				break;
		default				  :
				__vHTTPError(pstConn);
				break;
	}
}
//*------------------------------------------------------------------------------------------------
//* 函数名称 : __pstGetParamNetbuf
//* 功能描述 : 获取POST参数值所在的netbuf地址
//* 入口参数 :    <pstNetbuf>[in]  指向ST_NETBUF结构的指针
//*			 :     <pszParam>[out] 保存参数内容
//*          : <ps32ParamLen>[out] 保存参数长度
//*          :      <pstConn>[in]  指向ST_NETCONN结构的指针
//* 出口参数 : 返回POST参数开始位置的地址
//*------------------------------------------------------------------------------------------------
#define	POST_PARAM_FLAG			"Content-Length: "
#define	POST_PARAM_FLAG_LEN		16
#define	CONTEN_LEN_MAX			9					//* 内容长度最多9位数,也就是亿级规模
static ST_NETBUF *__pstGetParamNetbuf(ST_NETBUF *pstNetbuf, INT8S *pszParam, 
                                        INT32S *ps32ParamLen, ST_NETCONN *pstConn)
{
	INT8S		*__pbData, *__pszParam, *__pszEndParam;
	INT32S		__s32Len;
	ST_NETBUF 	*__pstNetbuf = pstNetbuf;

	do{
		do{
			netbuf_data(__pstNetbuf, &__pbData, &__s32Len);
		
			if((__pszParam = memstrExt(__pbData, POST_PARAM_FLAG, POST_PARAM_FLAG_LEN, __s32Len)) != NULL)
			{
				//* 计算参数长度
				__pszParam += POST_PARAM_FLAG_LEN;
				if((__pszEndParam = MemChr(__pszParam, 0x0D, CONTEN_LEN_MAX + 1)) != NULL)
				{
					*ps32ParamLen = (INT32S)(__pszEndParam - __pszParam);
					if(*ps32ParamLen > CONTEN_LEN_MAX || *ps32ParamLen <= 0)
						goto __lblErr;
						
					*ps32ParamLen = s32GetIntFromArray(__pszParam, *ps32ParamLen);
					__pszParam = __pszEndParam + 4;	
					if(*ps32ParamLen > 0 && *ps32ParamLen <= POST_PARAM_MAX)
					{
						memcpy(pszParam, __pszParam, *ps32ParamLen);
						goto __lblOK;
					}					
					else
						goto __lblErr;
				}
				else
					goto __lblErr;
			}
		}while(netbuf_next(__pstNetbuf) >= 0);
		
		netbuf_delete(__pstNetbuf);	
	}while((__pstNetbuf = netconn_recv(pstConn)) != NULL);
	
__lblErr:
	__pszParam = NULL;
	
__lblOK:
	netbuf_delete(__pstNetbuf);	
	
    return __pszParam;
}
//*------------------------------------------------------------------------------------------------
//* 函数名称 : __pfunParsePostMethod
//* 功能描述 : 解析HTTP请求的POST方法,获取函数指针
//* 入口参数 :    <pstNetbuf>[in]  指向ST_NETBUF结构的指针
//*          :     <pszParam>[out] 保存参数内容
//*          : <ps32ParamLen>[out] 保存参数长度
//*          :      <pstConn>[in]  指向ST_NETCONN结构的指针
//* 出口参数 : 返回指向POST处理函数的指针
//*------------------------------------------------------------------------------------------------
static pfunvPHandler __pfunParsePostMethod(ST_NETBUF *pstNetbuf, INT8S *pszParam, 
                                             INT32S *ps32ParamLen, ST_NETCONN *pstConn)
{
	INT32S	__s32Len;
	INT8S	*__pszNext, *__pszStart;
	INT8S	__szHandlerName[POST_HANDLER_NAME_LEN + 1];
	INT8S	i, __bNameLen;
	
	netbuf_data(pstNetbuf, &__pszStart, &__s32Len);
	__pszStart += 6;
	__pszNext = memstrExt(__pszStart, " ", 1, POST_HANDLER_NAME_LEN);
	
	if(__pszNext != NULL && (__pszNext > __pszStart))
	{
		memset(__szHandlerName, 0, sizeof(__szHandlerName));
		__bNameLen = __pszNext - __pszStart;
		memcpy(__szHandlerName, __pszStart, __bNameLen);
		
		//* 查找处理函数
		for(i=0; i<STA_PHANDLER_NB; i++)
		{
			if((strncmp(__staPHandlers[i].szHandlerName, __szHandlerName, __bNameLen) == 0) 
				&& (__bNameLen == __staPHandlers[i].s32NameLen))
			{	
				if(NULL != __pstGetParamNetbuf(pstNetbuf, pszParam, ps32ParamLen, pstConn))
					return __staPHandlers[i].pfunvPostHandler;
				else
					break;
			}
			else;
		}
	}
	
	return NULL;
}
//*------------------------------------------------------------------------------------------------
//* 函数名称 : __Handler_HTTPPost
//* 功能描述 : 处理HTTP协议的POST请求
//* 入口参数 :   <pstConn>[in] 指向ST_NETCONN结构的指针
//*          : <pstNetbuf>[in] 指向ST_NETBUF结构的指针
//* 出口参数 : 无
//*------------------------------------------------------------------------------------------------
static void __Handler_HTTPPost(ST_NETCONN *pstConn, ST_NETBUF *pstNetbuf)
{
	pfunvPHandler	__pfunvPHandler;
	INT32S			__s32ParamLen;
	INT8S			__szParam[POST_PARAM_MAX + 1];
	
	memset(__szParam, 0, sizeof(__szParam));
		
	if((__pfunvPHandler = __pfunParsePostMethod(pstNetbuf, __szParam, &__s32ParamLen, pstConn)) != NULL)
	{
		__pfunvPHandler(pstConn, __szParam, __s32ParamLen);
	}
	else
	{
		__vHTTPError(pstConn);		
	}
}
//*------------------------------------------------------------------------------------------------
//* 函数名称 : Handler_HTTP
//* 功能描述 : HTTP处理
//* 入口参数 : <pstConn>[in] 指向ST_NETCONN结构的指针
//* 出口参数 : 无
//*------------------------------------------------------------------------------------------------
void vHandler_HTTP(ST_NETCONN *pstConn)
{
	ST_NETBUF 		*__pstNetbuf;
	INT8S			*__pbData;
	INT32S			__s32Len;

	__pstNetbuf = netconn_recv(pstConn);
	if(__pstNetbuf != NULL)
	{
		netbuf_data(__pstNetbuf, &__pbData, &__s32Len);

		if(memstr(__pbData, "GET", 3, __s32Len))
		{
			__Handler_HTTPGet(pstConn);
		}
		else if(memstr(__pbData, "POST", 3, __s32Len))
		{
			__Handler_HTTPPost(pstConn, __pstNetbuf);
		}
		else;
		netbuf_delete(__pstNetbuf);	
	}
					
	netconn_close(pstConn);
}
//*------------------------------------------------------------------------------------------------
//* 函数名称 : vHTTPInit()
//* 功能描述 : 初始化HTTP处理
//* 入口参数 : 无
//* 出口参数 : 无
//*------------------------------------------------------------------------------------------------
void vHTTPInit(void)
{
#if	__DEBUG__ == 0
	s32NeedReset = OS_FALSE;
#endif
}

⌨️ 快捷键说明

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