?? handler_http.c
字號:
//* 入口參數 : <pstConn>[in] 指向ST_NETCONN結構的指針
//* : <ulIP>[in] 查詢得到的IP地址
//* 出口參數 : 無
//*------------------------------------------------------------------------------------------------
__inline void __ilvSendIP(ST_NETCONN *pstConn, ULONG ulIP)
{
UBYTE *__pubIP;
BYTE __szIP[16];
BYTE __szResp[200];
memset(__szIP, 0, sizeof(__szIP));
memset(__szResp, 0, sizeof(__szResp));
__pubIP = &ulIP;
sprintf(__szIP, "%d", *__pubIP);
sprintf(__szIP + strlenExt(__szIP), ".%d", *(__pubIP + 1));
sprintf(__szIP + strlenExt(__szIP), ".%d", *(__pubIP + 2));
sprintf(__szIP + strlenExt(__szIP), ".%d", *(__pubIP + 3));
strcatExt(__szResp, sizeof(__szResp) - 1,"<boady><br><br><h1>IP地址是:", strlenExt("<boady><br><br><h1>IP地址是:"));
strcatExt(__szResp, sizeof(__szResp) - 1, __szIP, strlenExt(__szIP));
strcatExt(__szResp, sizeof(__szResp) - 1,
",點此<a href='#' onclick='history.back();'>返回</a></h1></body>",
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結構的指針
//* : <pstNetbuf>[in] 指向ST_NETBUF結構的指針
//* : <pszParam>[in] 指向參數開始位置的指針
//* 出口參數 : 無
//*------------------------------------------------------------------------------------------------
static void __vDNToIP(ST_NETCONN *pstConn, ST_NETBUF *pstNetbuf, BYTE *pszParam)
{
LONG __lValLen, __lParamTotLen, __lQuestionLen;
BYTE __szParam[128];
BYTE __szQuestion[132];
ULONG __ulIP;
//* 首先取出參數
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)
{
__vHTTPError(pstConn);
return;
}
//* 封裝DNS查詢參數
__lQuestionLen = __illPacketDNSQuestion(__szParam, __lParamTotLen, __szQuestion, sizeof(__szQuestion));
switch(ulDNToIP(__szQuestion, __lQuestionLen, &__ulIP))
{
case DNS_OK :
__ilvSendIP(pstConn, __ulIP);
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結構的指針
//* : <ppszParam>[out] 指向參數的開始位置的指針的指針
//* 出口參數 : 返回指向包含參數值的netbuf的指針
//*------------------------------------------------------------------------------------------------
static ST_NETBUF *__pstGetParamNetbuf(ST_NETBUF *pstNetbuf, PP ppszParam)
{
BYTE __szParamSplitSymbol[5] = {0x0D, 0x0A, 0x0D, 0x0A, 0x00};
BYTE *__pbData;
LONG __lLen;
ST_NETBUF *__pstNetbuf = pstNetbuf;
do{
netbuf_data(__pstNetbuf, &__pbData, &__lLen);
if((*ppszParam = memstrExt(__pbData, __szParamSplitSymbol, 4, __lLen)) != NULL)
return __pstNetbuf;
}while(netbuf_next(__pstNetbuf) >= 0);
return NULL;
}
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : __pvParsePostMethod
//* 功能描述 : 解析HTTP請求的POST方法,獲取函數指針
//* 入口參數 : <pstNetbuf>[in] 指向ST_NETBUF結構的指針
//* : <ppstNetbuf>[out] 指向POST參數所在的netbuf指針的指針
//* : <ppszParam>[out] 指向參數的開始位置的指針的指針
//* 出口參數 : 返回指向POST處理函數的指針
//*------------------------------------------------------------------------------------------------
static pfunvPHandler __pfunParsePostMethod(ST_NETBUF *pstNetbuf, ST_NETBUF **ppstNetbuf, PP ppszParam)
{
LONG __lLen;
BYTE *__pszNext, *__pszStart;
BYTE __szHandlerName[POST_HANDLER_NAME_LEN + 1];
BYTE i, __bNameLen;
netbuf_data(pstNetbuf, &__pszStart, &__lLen);
__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].lNameLen))
{
*ppstNetbuf = __pstGetParamNetbuf(pstNetbuf, ppszParam);
if(*ppstNetbuf != NULL)
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;
ST_NETBUF *__pstNetbuf;
BYTE *__pszParam;
if((__pfunvPHandler = __pfunParsePostMethod(pstNetbuf, &__pstNetbuf, &__pszParam)) != NULL)
{
__pfunvPHandler(pstConn, __pstNetbuf, __pszParam + 4);
}
else
{
__vHTTPError(pstConn);
}
}
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : Handler_HTTP
//* 功能描述 : HTTP處理
//* 入口參數 : <pstConn>[in] 指向ST_NETCONN結構的指針
//* 出口參數 : 無
//*------------------------------------------------------------------------------------------------
void Handler_HTTP(ST_NETCONN *pstConn)
{
ST_NETBUF *__pstNetbuf;
BYTE *__pbData;
LONG __lLen;
__pstNetbuf = netconn_recv(pstConn);
if(__pstNetbuf != NULL)
{
netbuf_data(__pstNetbuf, &__pbData, &__lLen);
if(memstr(__pbData, "GET", 3, __lLen))
{
__Handler_HTTPGet(pstConn);
}
else if(memstr(__pbData, "POST", 3, __lLen))
{
__Handler_HTTPPost(pstConn, __pstNetbuf);
}
else;
netbuf_delete(__pstNetbuf);
}
netconn_close(pstConn);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -