?? handler_http.c
字號:
//*------------------------------------------------------------------------------------------------
//* 文件名 : handler_http.c
//* 功能描述 : http協議處理函數庫
//* 作者 : 焦海波
//* 版本 : 0.1
//* 建立日期、時間 : 2006/08/07 14:58
//* 最近修改日期、時間 :
//* 修改原因 :
//*------------------------------------------------------------------------------------------------
//*------------------------------------------ 頭文件 -----------------------------------------------
#include "/uCOS_II/includes.h"
#include "/at91sam7x256/drivers/flash/flash.h"
#include "/at91sam7x256/include/AT91SAM7X256.h"
#include "/LwIP/include/lwip/tcpip.h"
#include "/LwIP/dns/dns_client.h"
#include "/tools/stringExtAPI.h"
#include "/tools/search.h"
//*------------------------------------ 變量、數據類型宏定義 ---------------------------------------
#define HTTP_HTML_HEADER "HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n"
#define HTTP_POST_RESP_HEADER "HTTP/1.1 100 Continue\r\n\r\n"
//* POST處理函數類型定義
typedef void(*pfunvPHandler)(ST_NETCONN*, ST_NETBUF*, BYTE*);
#define POST_HANDLER_NAME_LEN 31
//* POST請求處理函數列表使用的結構類型定義
typedef struct {
LONG lNameLen;
BYTE szHandlerName[POST_HANDLER_NAME_LEN + 1];
pfunvPHandler pfunvPostHandler;
} ST_POST_HANDLER;
//*-------------------------------------- 函數原型聲明 ---------------------------------------------
static void __vSetNetCFGParam(ST_NETCONN *pstConn, ST_NETBUF *pstNetbuf, BYTE *pszParam);
static void __vDNToIP(ST_NETCONN *pstConn, ST_NETBUF *pstNetbuf, BYTE *pszParam);
//*---------------------------------------- 常量定義 ----------------------------------------------
#define STA_PHANDLER_NB 2 //* POST請求處理函數個數
static const ST_POST_HANDLER __staPHandlers[STA_PHANDLER_NB] = {{15, "vSetNetCFGParam", __vSetNetCFGParam},
{7, "vDNToIP", __vDNToIP}};
#if __DEBUG__ == 0
LONG lNeedReset = FALSE;
#endif
//*================================================================================================
//* 函 數 區
//*================================================================================================
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : __vHTTPRespInfo
//* 功能描述 : 向瀏覽器返回一個HTTP請求的響應信息
//* 入口參數 : <pstConn>[in] 指向ST_NETCONN結構的指針,該結構保存當前的連接信息
//* : <pszRespInfo>[in] 指向響應信息的指針
//* : <lLen>[IN] 響應信息長度
//* 出口參數 : 無
//*------------------------------------------------------------------------------------------------
static void __vHTTPRespInfo(ST_NETCONN *pstConn, BYTE *pszRespInfo, LONG lLen)
{
netconn_write(pstConn, HTTP_HTML_HEADER, strlenExt(HTTP_HTML_HEADER), NETCONN_COPY);
netconn_write(pstConn, pszRespInfo, lLen, NETCONN_NOCOPY);
}
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : __vHTTPError
//* 功能描述 : 向瀏覽器返回一個HTTP請求錯誤
//* 入口參數 : <pstConn>[in] 指向ST_NETCONN結構的指針
//* 出口參數 : 無
//*------------------------------------------------------------------------------------------------
static void __vHTTPError(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>"));
}
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : Handler_HTTPGet
//* 功能描述 : 處理HTTP協議的GET請求
//* 入口參數 : <pstConn>[in] 指向ST_NETCONN結構的指針
//* 出口參數 : 無
//*------------------------------------------------------------------------------------------------
static void __Handler_HTTPGet(ST_NETCONN *pstConn)
{
BYTE __szNetCFGParam[192];
netconn_write(pstConn, HTTP_HTML_HEADER, strlenExt(HTTP_HTML_HEADER), NETCONN_COPY);
netconn_write(pstConn, (BYTE*)(SET_HTML_STORE_ADDR + 4), *((LONG*)SET_HTML_STORE_ADDR), NETCONN_COPY);
memset(__szNetCFGParam, 0, sizeof(__szNetCFGParam));
strcatExt(__szNetCFGParam, sizeof(__szNetCFGParam), "<p>IP:", 7);
vReadASCIIIP(__szNetCFGParam + strlenExt(__szNetCFGParam));
strcatExt(__szNetCFGParam, sizeof(__szNetCFGParam), "<br>子網掩碼:", 14);
vReadASCIINetMask(__szNetCFGParam + strlenExt(__szNetCFGParam));
strcatExt(__szNetCFGParam, sizeof(__szNetCFGParam), "<br>網關:", 10);
vReadASCIIGateway(__szNetCFGParam + strlenExt(__szNetCFGParam));
netconn_write(pstConn, __szNetCFGParam, strlenExt(__szNetCFGParam), NETCONN_COPY);
netconn_write(pstConn, (BYTE*)(SET1_HTML_STORE_ADDR + 4), *((LONG*)SET1_HTML_STORE_ADDR), NETCONN_COPY);
}
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : __ulParseIP
//* 功能描述 : 解析IP格式的數據
//* 入口參數 : <pszVal>[in] 指向參數值的指針
//* : <lValLen>[in] 參數長度
//* 出口參數 : 無
//*------------------------------------------------------------------------------------------------
static ULONG __ulParseIP(BYTE *pszVal, LONG lValLen)
{
BYTE *__pszNext = pszVal, *__pszStart;
ULONG __ulIP = 0x00000000;
__pszNext = memstrExt(__pszNext, ".", 1, 4);
__ulIP = ConvertStringToOneByte_Hex(pszVal, __pszNext - pszVal);
__pszStart = __pszNext + 1;
__pszNext = memstrExt(__pszStart, ".", 1, 4);
__ulIP |= (0x0000FF00 & (ConvertStringToOneByte_Hex(__pszStart, __pszNext - __pszStart) << 8));
__pszStart = __pszNext + 1;
__pszNext = memstrExt(__pszStart, ".", 1, 4);
__ulIP |= (0x00FF0000 & (ConvertStringToOneByte_Hex(__pszStart, __pszNext - __pszStart) << 16));
__pszStart = __pszNext + 1;
__ulIP |= (0xFF000000 & (ConvertStringToOneByte_Hex(__pszStart, lValLen - (LONG)(__pszStart - pszVal)) << 24));
return __ulIP;
}
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : __vSetNetCFGParam
//* 功能描述 : 設置網絡參數
//* 入口參數 : <pstConn>[in] 指向ST_NETCONN結構的指針
//* : <pstNetbuf>[in] 指向ST_NETBUF結構的指針
//* : <pszParam>[in] 指向參數開始位置的指針
//* 出口參數 : 無
//*------------------------------------------------------------------------------------------------
static void __vSetNetCFGParam(ST_NETCONN *pstConn, ST_NETBUF *pstNetbuf, BYTE *pszParam)
{
extern void ResetSoft();
BYTE *__pszNext, *__pszStart;
ULONG __ulIP, __ulNetMask, __ulGateway;
LONG __lValLen, __lParamTotLen;
BYTE __szParam[64];
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
/* 注意:作為原理性代碼,這里采用最簡單的方式取值,沒有進行必要的容錯 */
memset(__szParam, 0, sizeof(__szParam));
__lValLen = (LONG)(pszParam - (BYTE*)pstNetbuf->ptr->payload);
__lParamTotLen = (LONG)pstNetbuf->ptr->len - __lValLen;
memcpy(__szParam, pszParam, __lParamTotLen);
if(pstNetbuf->ptr->tot_len > pstNetbuf->ptr->len)
netbuf_copy(pstNetbuf, __szParam + pstNetbuf->ptr->len, sizeof(__szParam) - 1 - __lParamTotLen);
__lParamTotLen = pstNetbuf->ptr->tot_len - __lValLen;
if(__lParamTotLen > sizeof(__szParam) - 1)
{
__Handler_HTTPGet(pstConn);
return;
}
__pszStart = __szParam + 3;
__pszNext = memstrExt(__pszStart, "&", 1, __lParamTotLen);
__lValLen = (LONG)(__pszNext - __pszStart);
__ulIP = __ulParseIP(__pszStart, __lValLen);
__pszStart = __pszNext + 4;
__pszNext = memstrExt(__pszStart, "&", 1, __lParamTotLen - (LONG)(__pszStart - __szParam));
__lValLen = (LONG)(__pszNext - __pszStart);
__ulNetMask = __ulParseIP(__pszStart, __lValLen);
__pszStart = __pszNext + 4;
__lValLen = __lParamTotLen - (LONG)(__pszStart - __szParam);
__ulGateway = __ulParseIP(__pszStart, __lValLen);
ubSetNetCFGParam(__ulIP, __ulNetMask, __ulGateway);
netconn_write(pstConn, HTTP_POST_RESP_HEADER, strlenExt(HTTP_POST_RESP_HEADER), NETCONN_COPY);
__Handler_HTTPGet(pstConn);
#if __DEBUG__ == 0
OS_ENTER_CRITICAL()
{
lNeedReset = TRUE;
}
OS_EXIT_CRITICAL()
#endif
}
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : __illPacketDNSQuestion
//* 功能描述 : 按照DNS格式封裝查詢參數
//* 入口參數 : <pszParam>[in] 指向查詢參數的指針
//* : <lParamLen>[in] 參數長度
//* : <pszQuestion>[in] 指向接收緩沖區(在這里保存封裝好的包)的指針
//* : <lQuestionSize>[out] 接收封裝包的緩沖區長度
//* 出口參數 : 返回封裝后的包長度
//*------------------------------------------------------------------------------------------------
__inline LONG __illPacketDNSQuestion(BYTE *pszParam, LONG lParamLen, BYTE *pszQuestion, LONG lQuestionSize)
{
LONG __lValLen, __lTotLenToParsed = 0;
BYTE *__pszNext, *__pszStart;
memset(pszQuestion, 0, lQuestionSize);
//* 按照DNS格式封裝查詢參數
__pszStart = pszParam + 3;
do{
__pszNext = memstrExt(__pszStart, ".", 1, lParamLen - (LONG)(__pszStart - pszParam));
__lValLen = (LONG)(__pszNext - __pszStart);
else
__lValLen = lParamLen - (LONG)(__pszStart - pszParam);
*(pszQuestion + __lTotLenToParsed) = __lValLen;
memcpy(pszQuestion + __lTotLenToParsed + 1, __pszStart, __lValLen);
__lTotLenToParsed += (__lValLen + 1);
__pszStart = __pszNext + 1;
}while(__pszNext != NULL);
return __lTotLenToParsed + 1;
}
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : __ilvSendIP
//* 功能描述 : 發送IP地址
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -