|
发表于 2014-11-25 22:42:18
|
显示全部楼层
去年在上家做的,贴出来吧:
/*********************************************************************************************************
** Function name: HTTP_ServerInit
** Descriptions: http服务
** input parameters: port:服务端口
POST_handler:收到POST的处理
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void HTTP_ServerProcess(struct netbuf *rcv)
{
static unsigned short cnt = 0;
static enHttpRcvState state = HeadNotRcvComplete;
unsigned short temp, len, lenparam = 0;
INT8S err;
INT8U *plenparam, *pData, *pPostData;
if (state == HeadNotRcvComplete)
{
//从TCP端口复制数据到HTTP缓冲区
len = netbuf_len(rcv);
len = (HTTP_RX_BUF_SIZE - cnt - 1) < len ? (HTTP_RX_BUF_SIZE - cnt - 1) : len;
netbuf_copy(rcv, HTTP_Rx_Buf + cnt, len);
cnt += len;
netbuf_delete(rcv);
HTTP_Rx_Buf[cnt] = '\0'; // 以使缓冲区的数据可被看做字符串,可以使用库的字符串操作函数
pData = strstr(HTTP_Rx_Buf, "\r\n\r\n");
if (pData) //说明HTTP报文头部接收完成
{
if (!memcmp(HTTP_Rx_Buf, "GET", 3))
{
HttpPostSeg.type = GET;
HTTP_GetFileName(HttpPostSeg.filename, 5);
goto process_and_reply;
}
else if (!memcmp(HTTP_Rx_Buf, "POST", 4))
{
HttpPostSeg.type = POST;
HTTP_GetFileName(HttpPostSeg.filename, 6);
pPostData = pData + 4;
plenparam = strstr(HTTP_Rx_Buf, "Content-Length:");
if (plenparam)
{
plenparam += 15;
while (*plenparam != '\r') //\r
{
if (*plenparam > 0x29 && *plenparam < 0x40) //'0'~'9'
{
lenparam = *plenparam - 0x30 + lenparam * 10;
}
plenparam++;
}
if (HTTP_POST_DATA_SIZE < lenparam)
{
//POST报文的POST数据量大于HTTP_POST_DATA_SIZE,返回501错误页面
netconn_write( WebConn,
page501,
sizeof(page501) - 1,
NETCONN_COPY);
goto reply;
}
HttpPostSeg.postdatalen = lenparam;
temp = cnt - ((INT32U)pPostData - (INT32U)HTTP_Rx_Buf);
HttpPostSeg.postdatacnt = temp;
memcpy(HttpPostSeg.postdata, pPostData, temp);
HttpPostSeg.postdata[temp] = 0;
// 如果接收的数据等于请求报文中指定的数据量
if (HttpPostSeg.postdatalen <= HttpPostSeg.postdatacnt)
{
HttpPostSeg.postdata[HttpPostSeg.postdatalen] = 0;
goto process_and_reply;
}
else
{
state = PostDataNotRcvComplete;
return;
}
}
else
{
//POST报文应该有Content-Length字段,否则返回501错误页面
netconn_write( WebConn,
page501,
sizeof(page501) - 1,
NETCONN_COPY);
goto reply;
}
}
else
{
//不支持的请求,返回501错误页面
netconn_write( WebConn,
page501,
sizeof(page501) - 1,
NETCONN_COPY);
goto reply;
}
}
else if (cnt == (HTTP_RX_BUF_SIZE - 1)) //没接收完,但请求报文的长度超出缓冲区大小,返回错误413页面
{
netconn_write( WebConn,
page413,
sizeof(page413) - 1,
NETCONN_COPY);
goto reply;
}
else
{
return;
}
}
else if (state == PostDataNotRcvComplete)
{
len = netbuf_len(rcv);
if (HttpPostSeg.postdatacnt + len > HTTP_POST_DATA_SIZE)
{
netconn_write( WebConn,
page501,
sizeof(page501) - 1,
NETCONN_COPY);
goto reply;
}
netbuf_copy(rcv, HttpPostSeg.postdata + HttpPostSeg.postdatacnt, len);
netbuf_delete(rcv);
HttpPostSeg.postdatacnt += len;
if (HttpPostSeg.postdatalen <= HttpPostSeg.postdatacnt)
{
HttpPostSeg.postdata[HttpPostSeg.postdatalen] = 0;
goto process_and_reply;
}
else
{
return;
}
}
process_and_reply:
HTTP_CreateContent(&HttpPostSeg);
reply:
err = netconn_close(WebConn);
err = netconn_delete(WebConn);
#ifdef DEBUG
while (err != ERR_OK);
#endif
WebConn = NULL;
cnt = 0;
state = HeadNotRcvComplete;
} |
|