| | |
| | | else |
| | | { |
| | | HIDO_DebugString((HIDO_CHAR *)_pu8Data, _u32Len); |
| | | |
| | | |
| | | if(l_fnHTTPResponseCallback != HIDO_NULL) |
| | | { |
| | | l_fnHTTPResponseCallback(_u32RespCode, _pu8Data, _u32Len, l_pHTTPArg); |
| | |
| | | { |
| | | 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; |
| | | } |
| | | } |
| | |
| | | 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; |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | * 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; |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | * 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) |
| | | { |
| | |
| | | |
| | | 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; |
| | | } |
| | | |