yincheng.zhong
2 天以前 2ebb8217f43b69f491620423ea4d5d5944d1f91d
keil/include/components/internet/src/HTTPClient.c
@@ -112,7 +112,7 @@
    else
    {
        HIDO_DebugString((HIDO_CHAR *)_pu8Data, _u32Len);
        if(l_fnHTTPResponseCallback != HIDO_NULL)
        {
            l_fnHTTPResponseCallback(_u32RespCode, _pu8Data, _u32Len, l_pHTTPArg);
@@ -152,110 +152,136 @@
{
    switch (_eEvent)
    {
        case SOCKET_EVENT_CONNECT_FAILED:
    case SOCKET_EVENT_CONNECT_FAILED:
    {
        if(HTTP_CLIENT_STATE_CONNECTING == l_eHTTPClientState)
        {
            if(HTTP_CLIENT_STATE_CONNECTING == l_eHTTPClientState)
            if(l_u32HTTPTryCnt < 3)
            {
                if(l_u32HTTPTryCnt < 3)
                {
                    l_u32HTTPTryCnt++;
                    Socket_Connect(l_i32HTTPClientSockID, l_acHTTPHost, l_u32HTTPPort);
                }
                else
                {
                    l_eHTTPClientState = HTTP_CLIENT_STATE_IDLE;
                    HTTPClient_Response(408, HIDO_NULL, 0);
                }
            }
            break;
        }
        case SOCKET_EVENT_CONNECTED:
        {
            if(HTTP_CLIENT_STATE_CONNECTING == l_eHTTPClientState)
            {
                l_eHTTPClientState = HTTP_CLIENT_STATE_CONNECTED;
                l_eHTTPRecvState = HTTP_RECV_STATE_HEAD;
                l_u32HTTPRecvBuffLen = 0;
                if(l_eHTTPMethod != HTTP_METHOD_POST_FILE)
                {
                    Socket_Send(l_i32HTTPClientSockID, (HIDO_UINT8 *)l_acHTTPSendBuff, l_u32HTTPSendBuffLen);
                }
            }
            break;
        }
        case SOCKET_EVENT_CLOSED:
        {
            if(l_eHTTPClientState != HTTP_CLIENT_STATE_IDLE)
            {
                HIDO_TimerCancel(l_u32HTTPClientTimerID);
                l_eHTTPClientState = HTTP_CLIENT_STATE_IDLE;
                HTTPClient_Response(l_u32HTTPRespCode, l_pu8HTTPRespBody, l_u32HTTPContentLength);
                l_u32HTTPTryCnt++;
                Socket_Connect(l_i32HTTPClientSockID, l_acHTTPHost, l_u32HTTPPort);
            }
            else
            {
                HIDO_TimerCancel(l_u32HTTPClientTimerID);
                l_eHTTPClientState = HTTP_CLIENT_STATE_IDLE;
                HTTPClient_Response(408, HIDO_NULL, 0);
            }
        }
        break;
    }
    case SOCKET_EVENT_CONNECTED:
    {
        if(HTTP_CLIENT_STATE_CONNECTING == l_eHTTPClientState)
        {
            l_eHTTPClientState = HTTP_CLIENT_STATE_CONNECTED;
            l_eHTTPRecvState = HTTP_RECV_STATE_HEAD;
            l_u32HTTPRecvBuffLen = 0;
            if(l_eHTTPMethod != HTTP_METHOD_POST_FILE)
            {
                Socket_Send(l_i32HTTPClientSockID, (HIDO_UINT8 *)l_acHTTPSendBuff, l_u32HTTPSendBuffLen);
            }
        }
        break;
    }
    case SOCKET_EVENT_CLOSED:
    {
        if(l_eHTTPClientState != HTTP_CLIENT_STATE_IDLE)
        {
            HIDO_TimerCancel(l_u32HTTPClientTimerID);
            l_eHTTPClientState = HTTP_CLIENT_STATE_IDLE;
            HTTPClient_Response(l_u32HTTPRespCode, l_pu8HTTPRespBody, l_u32HTTPContentLength);
        }
        else
        {
            HIDO_TimerCancel(l_u32HTTPClientTimerID);
        }
        break;
    }
    case SOCKET_EVENT_RECV_DATA:
    {
        HIDO_INT32 i32Ret = 0;
        HIDO_UINT32 u32RecvLen = 0;
        do
        {
            if (l_u32HTTPRecvBuffLen >= HTTP_RECV_BUFF_SIZE)
            {
                Socket_Close(l_i32HTTPClientSockID);
                break;
            }
            break;
        }
        case SOCKET_EVENT_RECV_DATA:
        {
            HIDO_INT32 i32Ret = 0;
            HIDO_UINT32 u32RecvLen = 0;
            i32Ret = Socket_Recv(l_i32HTTPClientSockID, (HIDO_UINT8 *)(l_acHTTPRecvBuff + l_u32HTTPRecvBuffLen),
                                 HTTP_RECV_BUFF_SIZE - l_u32HTTPRecvBuffLen, &u32RecvLen);
            do
            if ((i32Ret != HIDO_OK) || (0 == u32RecvLen))
            {
                if (l_u32HTTPRecvBuffLen >= HTTP_RECV_BUFF_SIZE)
                break;
            }
            l_u32HTTPRecvBuffLen += u32RecvLen;
            if (HTTP_RECV_STATE_HEAD == l_eHTTPRecvState)
            {
                /* 收到"\r\n\r\n */
                l_pu8HTTPRespBody = (HIDO_UINT8 *)HIDO_UtilStrnstr(l_acHTTPRecvBuff, "\r\n\r\n", u32RecvLen);
                if (l_pu8HTTPRespBody != HIDO_NULL)
                {
                    Socket_Close(l_i32HTTPClientSockID);
                    HIDO_CHAR *pcKeyName = HIDO_NULL;
                    HIDO_UINT32 u32Range0 = 0;
                    HIDO_UINT32 u32Range1 = 0;
                    HIDO_UINT32 u32RangeAll = 0;
                    break;
                }
                    l_pu8HTTPRespBody += 4;
                i32Ret = Socket_Recv(l_i32HTTPClientSockID, (HIDO_UINT8 *)(l_acHTTPRecvBuff + l_u32HTTPRecvBuffLen),
                        HTTP_RECV_BUFF_SIZE - l_u32HTTPRecvBuffLen, &u32RecvLen);
                if ((i32Ret != HIDO_OK) || (0 == u32RecvLen))
                {
                    break;
                }
                l_u32HTTPRecvBuffLen += u32RecvLen;
                if (HTTP_RECV_STATE_HEAD == l_eHTTPRecvState)
                {
                    /* 收到"\r\n\r\n */
                    l_pu8HTTPRespBody = (HIDO_UINT8 *)HIDO_UtilStrnstr(l_acHTTPRecvBuff, "\r\n\r\n", u32RecvLen);
                    if (l_pu8HTTPRespBody != HIDO_NULL)
                    if (HIDO_UtilParseFormat((HIDO_UINT8 *) l_acHTTPRecvBuff, u32RecvLen, "HTTP/1.1 %d %*\r\n",
                                             &l_u32HTTPRespCode) != 2)
                    {
                        HIDO_CHAR *pcKeyName = HIDO_NULL;
                        HIDO_UINT32 u32Range0 = 0;
                        HIDO_UINT32 u32Range1 = 0;
                        HIDO_UINT32 u32RangeAll = 0;
                        Socket_Close(l_i32HTTPClientSockID);
                        l_pu8HTTPRespBody += 4;
                        break;
                    }
                        if (HIDO_UtilParseFormat((HIDO_UINT8 *) l_acHTTPRecvBuff, u32RecvLen, "HTTP/1.1 %d %*\r\n",
                                &l_u32HTTPRespCode) != 2)
                    pcKeyName = HIDO_UtilStrnstr(l_acHTTPRecvBuff, "Content-Length: ", u32RecvLen);
                    if (pcKeyName != HIDO_NULL)
                    {
                        if (HIDO_UtilParseFormat((HIDO_UINT8 *) pcKeyName,
                                                 u32RecvLen - (pcKeyName - l_acHTTPRecvBuff), "Content-Length: %d\r\n",
                                                 &l_u32HTTPContentLength) != 1)
                        {
                            Socket_Close(l_i32HTTPClientSockID);
                            break;
                        }
                    }
                    else
                    {
                        Socket_Close(l_i32HTTPClientSockID);
                        pcKeyName = HIDO_UtilStrnstr(l_acHTTPRecvBuff, "Content-Length: ", u32RecvLen);
                        break;
                    }
                    /* 获取文件分片信息 */
                    if(HTTP_METHOD_GET_FILE == l_eHTTPMethod)
                    {
                        HIDO_DataStruct stETag;
                        memset(&l_stHTTPGetFileResponse, 0, sizeof(l_stHTTPGetFileResponse));
                        pcKeyName = HIDO_UtilStrnstr(l_acHTTPRecvBuff, "Content-Range: ", u32RecvLen);
                        if (pcKeyName != HIDO_NULL)
                        {
                            if (HIDO_UtilParseFormat((HIDO_UINT8 *) pcKeyName,
                                    u32RecvLen - (pcKeyName - l_acHTTPRecvBuff), "Content-Length: %d\r\n",
                                    &l_u32HTTPContentLength) != 1)
                                                     u32RecvLen - (pcKeyName - l_acHTTPRecvBuff), "Content-Range: bytes %d-%d/%d\r\n",
                                                     &u32Range0, &u32Range1, &u32RangeAll) != 3)
                            {
                                Socket_Close(l_i32HTTPClientSockID);
                                break;
                            }
                        }
@@ -266,85 +292,59 @@
                            break;
                        }
                        /* 获取文件分片信息 */
                        if(HTTP_METHOD_GET_FILE == l_eHTTPMethod)
                        l_stHTTPGetFileResponse.m_u32RangeBegin = u32Range0;
                        l_stHTTPGetFileResponse.m_u32RangeEnd = u32Range1;
                        l_stHTTPGetFileResponse.m_u32RangeTotal = u32RangeAll;
                        pcKeyName = HIDO_UtilStrnstr(l_acHTTPRecvBuff, "ETag: ", u32RecvLen);
                        if (pcKeyName != HIDO_NULL)
                        {
                            HIDO_DataStruct stETag;
                            memset(&l_stHTTPGetFileResponse, 0, sizeof(l_stHTTPGetFileResponse));
                            pcKeyName = HIDO_UtilStrnstr(l_acHTTPRecvBuff, "Content-Range: ", u32RecvLen);
                            if (pcKeyName != HIDO_NULL)
                            {
                                if (HIDO_UtilParseFormat((HIDO_UINT8 *) pcKeyName,
                                        u32RecvLen - (pcKeyName - l_acHTTPRecvBuff), "Content-Range: bytes %d-%d/%d\r\n",
                                        &u32Range0, &u32Range1, &u32RangeAll) != 3)
                                {
                                    Socket_Close(l_i32HTTPClientSockID);
                                    break;
                                }
                            }
                            else
                            if (HIDO_UtilParseFormat((HIDO_UINT8 *) pcKeyName,
                                                     u32RecvLen - (pcKeyName - l_acHTTPRecvBuff), "ETag: %p\r\n", &stETag) != 1)
                            {
                                Socket_Close(l_i32HTTPClientSockID);
                                break;
                            }
                            l_stHTTPGetFileResponse.m_u32RangeBegin = u32Range0;
                            l_stHTTPGetFileResponse.m_u32RangeEnd = u32Range1;
                            l_stHTTPGetFileResponse.m_u32RangeTotal = u32RangeAll;
                            pcKeyName = HIDO_UtilStrnstr(l_acHTTPRecvBuff, "ETag: ", u32RecvLen);
                             if (pcKeyName != HIDO_NULL)
                             {
                                 if (HIDO_UtilParseFormat((HIDO_UINT8 *) pcKeyName,
                                         u32RecvLen - (pcKeyName - l_acHTTPRecvBuff), "ETag: %p\r\n", &stETag) != 1)
                                 {
                                     Socket_Close(l_i32HTTPClientSockID);
                                     break;
                                 }
                             }
                             else
                             {
                                 Socket_Close(l_i32HTTPClientSockID);
                                 break;
                             }
                             if((stETag.m_u32Len + 1) < sizeof(l_stHTTPGetFileResponse.m_acETag))
                             {
                                 memcpy(l_stHTTPGetFileResponse.m_acETag, stETag.m_pData, stETag.m_u32Len);
                             }
                        }
                        l_u32HTTPRecvTotalLen = l_pu8HTTPRespBody - (HIDO_UINT8 *)l_acHTTPRecvBuff + l_u32HTTPContentLength;
                        l_eHTTPRecvState = HTTP_RECV_STATE_BODY;
                        if (l_u32HTTPRecvBuffLen >= l_u32HTTPRecvTotalLen)
                        else
                        {
                            Socket_Close(l_i32HTTPClientSockID);
                            break;
                        }
                        if((stETag.m_u32Len + 1) < sizeof(l_stHTTPGetFileResponse.m_acETag))
                        {
                            memcpy(l_stHTTPGetFileResponse.m_acETag, stETag.m_pData, stETag.m_u32Len);
                        }
                    }
                }
                else
                {
                    l_u32HTTPRecvTotalLen = l_pu8HTTPRespBody - (HIDO_UINT8 *)l_acHTTPRecvBuff + l_u32HTTPContentLength;
                    l_eHTTPRecvState = HTTP_RECV_STATE_BODY;
                    if (l_u32HTTPRecvBuffLen >= l_u32HTTPRecvTotalLen)
                    {
                        Socket_Close(l_i32HTTPClientSockID);
                    }
                }
            }
            while(HIDO_TRUE);
            else
            {
                if (l_u32HTTPRecvBuffLen >= l_u32HTTPRecvTotalLen)
                {
                    Socket_Close(l_i32HTTPClientSockID);
                }
            }
        }
        while(HIDO_TRUE);
            break;
        }
        default:
        {
            break;
        }
        break;
    }
    default:
    {
        break;
    }
    }
}
@@ -358,7 +358,7 @@
 * Modified Date:    : 2020年7月1日
 *******************************************************************************/
HIDO_INT32 HTTPClient_ParseUrl(HIDO_CHAR *_pcUrl, HIDO_CHAR *_pcHost, HIDO_UINT32 _u32HostSize,
        HIDO_CHAR *_pcPath, HIDO_UINT32 _u32PathSize, HIDO_UINT32 *_pu32Port)
                               HIDO_CHAR *_pcPath, HIDO_UINT32 _u32PathSize, HIDO_UINT32 *_pu32Port)
{
    HIDO_DataStruct stHost;
    HIDO_DataStruct stPath;
@@ -467,15 +467,15 @@
    HIDO_UtilSnprintf(l_acHTTPUrl, sizeof(l_acHTTPUrl), _pcUrl);
    l_u32HTTPSendBuffLen = HIDO_UtilSnprintf(l_acHTTPSendBuff, sizeof(l_acHTTPSendBuff),
            "POST /%s HTTP/1.1\r\n"
            "Host: %s\r\n"
            "User-Agent: QUECTEL_MODULE\r\n"
            "Connection: Keep-Alive\r\n"
            "Content-Type: application/json\r\n"
            "Accept: */*\r\n"
            "Content-Length: %u\r\n"
            "\r\n"
            "%s" , l_acHTTPPath, l_acHTTPHost, _u32BodyLen, _pcBody);
                           "POST /%s HTTP/1.1\r\n"
                           "Host: %s\r\n"
                           "User-Agent: QUECTEL_MODULE\r\n"
                           "Connection: Keep-Alive\r\n"
                           "Content-Type: application/json\r\n"
                           "Accept: */*\r\n"
                           "Content-Length: %u\r\n"
                           "\r\n"
                           "%s" , l_acHTTPPath, l_acHTTPHost, _u32BodyLen, _pcBody);
    l_fnHTTPResponseCallback = _fnResponseCallback;
    l_pHTTPArg = _pArg;
@@ -522,12 +522,12 @@
    HIDO_UtilSnprintf(l_acHTTPUrl, sizeof(l_acHTTPUrl), _pcUrl);
    l_u32HTTPSendBuffLen = HIDO_UtilSnprintf(l_acHTTPSendBuff, sizeof(l_acHTTPSendBuff),
            "GET /%s HTTP/1.1\r\n"
            "Host: %s\r\n"
            "User-Agent: QUECTEL_MODULE\r\n"
            "Connection: Keep-Alive\r\n"
            "Accept: */*\r\n"
            "\r\n" , l_acHTTPPath, l_acHTTPHost);
                           "GET /%s HTTP/1.1\r\n"
                           "Host: %s\r\n"
                           "User-Agent: QUECTEL_MODULE\r\n"
                           "Connection: Keep-Alive\r\n"
                           "Accept: */*\r\n"
                           "\r\n" , l_acHTTPPath, l_acHTTPHost);
    l_fnHTTPResponseCallback = _fnResponseCallback;
    l_pHTTPArg = _pArg;
@@ -582,24 +582,24 @@
    HIDO_UtilSnprintf(l_acHTTPUrl, sizeof(l_acHTTPUrl), _pcUrl);
    l_u32HTTPSendBuffLen = HIDO_UtilSnprintf(l_acHTTPSendBuff, sizeof(l_acHTTPSendBuff),
            "GET /%s HTTP/1.1\r\n"
            "Host: %s\r\n"
            "User-Agent: QUECTEL_MODULE\r\n"
            "Connection: Keep-Alive\r\n"
            "Accept: */*\r\n"
            "Range: bytes=%u-%u\r\n",
            l_acHTTPPath, l_acHTTPHost, _pstOpt->m_u32RangeBegin, _pstOpt->m_u32RangeEnd);
                           "GET /%s HTTP/1.1\r\n"
                           "Host: %s\r\n"
                           "User-Agent: QUECTEL_MODULE\r\n"
                           "Connection: Keep-Alive\r\n"
                           "Accept: */*\r\n"
                           "Range: bytes=%u-%u\r\n",
                           l_acHTTPPath, l_acHTTPHost, _pstOpt->m_u32RangeBegin, _pstOpt->m_u32RangeEnd);
    if(strlen(_pstOpt->m_acIfRange) != 0)
    {
        l_u32HTTPSendBuffLen += HIDO_UtilSnprintf(l_acHTTPSendBuff + l_u32HTTPSendBuffLen, sizeof(l_acHTTPSendBuff) - l_u32HTTPSendBuffLen,
            "If-Range: \"%s\"\r\n"
            "\r\n" , _pstOpt->m_acIfRange);
                                "If-Range: \"%s\"\r\n"
                                "\r\n" , _pstOpt->m_acIfRange);
    }
    else
    {
        l_u32HTTPSendBuffLen += HIDO_UtilSnprintf(l_acHTTPSendBuff + l_u32HTTPSendBuffLen, sizeof(l_acHTTPSendBuff) - l_u32HTTPSendBuffLen,
                "\r\n");
                                "\r\n");
    }
    l_fnHTTPGetFileCallback = _fnGetFileCallback;
@@ -628,7 +628,7 @@
 * Modified Date:    : 2021年5月3日
 *******************************************************************************/
HIDO_INT32 HTTPClient_PostFile(HIDO_CHAR *_pcUrl, FN_HTTPPostDataCallback _fnPostDataCallback, FN_HTTPResponseCallback _fnResponseCallback,
        HIDO_VOID *_pArg)
                               HIDO_VOID *_pArg)
{
    if(l_eHTTPClientState != HTTP_CLIENT_STATE_IDLE)
    {
@@ -721,13 +721,13 @@
    if(Socket_Create(&l_i32HTTPClientSockID, SOCKET_TYPE_TCP, HTTPClient_SocketEventProc, HIDO_NULL) != HIDO_OK)
    {
        return HIDO_ERR;
    }
    if(HIDO_TimerCreate(&l_u32HTTPClientTimerID) != HIDO_OK)
    {
        return HIDO_ERR;
    }