816 lines
27 KiB
C
816 lines
27 KiB
C
/*
|
|
*********************************************************************************************************
|
|
* uC/HTTP
|
|
* Hypertext Transfer Protocol
|
|
*
|
|
* Copyright 2004-2020 Silicon Laboratories Inc. www.silabs.com
|
|
*
|
|
* SPDX-License-Identifier: APACHE-2.0
|
|
*
|
|
* This software is subject to an open source license and is distributed by
|
|
* Silicon Laboratories Inc. pursuant to the terms of the Apache License,
|
|
* Version 2.0 available at www.apache.org/licenses/LICENSE-2.0.
|
|
*
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
*
|
|
* HTTP CLIENT CONNECTIION MODULE
|
|
*
|
|
* Filename : http-c_conn.c
|
|
* Version : V3.01.00
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
*********************************************************************************************************
|
|
* INCLUDE FILES
|
|
*********************************************************************************************************
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#define MICRIUM_SOURCE
|
|
#define HTTPc_CONN_MODULE
|
|
|
|
#include <net_ascii.h>
|
|
#include <net_util.h>
|
|
|
|
#include <net.h>
|
|
#include <net_cfg_net.h>
|
|
#include <net_app.h>
|
|
#include <net_sock.h>
|
|
|
|
#include "http-c_conn.h"
|
|
#include "http-c_sock.h"
|
|
#include "http-c_req.h"
|
|
#include "http-c_resp.h"
|
|
#ifdef HTTPc_TASK_MODULE_EN
|
|
#include "http-c_task.h"
|
|
#endif
|
|
#ifdef HTTPc_WEBSOCK_MODULE_EN
|
|
#include "http-c_websock.h"
|
|
#endif
|
|
|
|
//to do : 添加
|
|
#undef HTTPc_SIGNAL_TASK_MODULE_EN
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HTTPcConn_Process()
|
|
*
|
|
* Description : Process a connection in its CONNECT state.
|
|
*
|
|
* Argument(s) : p_conn Pointer to current HTTPc Connection object.
|
|
*
|
|
* Return(s) : None.
|
|
*
|
|
* Caller(s) : HTTPcTask_Handler().
|
|
*
|
|
* Note(s) : None.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
void HTTPcConn_Process(HTTPc_CONN *p_conn)
|
|
{
|
|
HTTPc_CONN_OBJ *p_conn_const;
|
|
CPU_BOOLEAN is_connect;
|
|
CPU_BOOLEAN result;
|
|
#ifdef HTTPc_TASK_MODULE_EN
|
|
CPU_BOOLEAN no_block;
|
|
#endif
|
|
HTTPc_ERR err;
|
|
|
|
|
|
p_conn_const = (HTTPc_CONN_OBJ *)p_conn;
|
|
|
|
switch (p_conn->State) {
|
|
case HTTPc_CONN_STATE_NONE:
|
|
break;
|
|
|
|
case HTTPc_CONN_STATE_CONNECT: /* CONNECT STATE */
|
|
is_connect = DEF_BIT_IS_SET(p_conn->Flags, HTTPc_FLAG_CONN_CONNECT);
|
|
if (is_connect == DEF_NO) {
|
|
|
|
HTTPcConn_Connect(p_conn, &err); /* Connection Connect. */
|
|
if (err != HTTPc_ERR_NONE) {
|
|
p_conn->ErrCode = err;
|
|
p_conn->CloseStatus = HTTPc_CONN_CLOSE_STATUS_NONE;
|
|
p_conn->State = HTTPc_CONN_STATE_NONE;
|
|
result = DEF_FAIL;
|
|
HTTPcConn_Remove(p_conn);
|
|
} else {
|
|
p_conn->State = HTTPc_CONN_STATE_PARAM_VALIDATE;
|
|
result = DEF_OK;
|
|
}
|
|
|
|
#ifdef HTTPc_TASK_MODULE_EN
|
|
/* No-Blocking mode: notify app with callback that ... */
|
|
/* ... connect is done. */
|
|
no_block = DEF_BIT_IS_SET(p_conn->Flags, HTTPc_FLAG_CONN_NO_BLOCK);
|
|
if ((no_block == DEF_YES) &&
|
|
(p_conn->OnConnect != DEF_NULL)) {
|
|
p_conn->OnConnect(p_conn_const, result);
|
|
}
|
|
|
|
#ifdef HTTPc_SIGNAL_TASK_MODULE_EN
|
|
/* Blocking mode: Signal app that connect is done. */
|
|
if (p_conn->ConnectSignal.SemObjPtr != DEF_NULL) {
|
|
HTTPcTask_ConnConnectSignal(p_conn, &err);
|
|
if (err != HTTPc_ERR_NONE) {
|
|
CPU_SW_EXCEPTION(;);
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
} else {
|
|
p_conn->State = HTTPc_CONN_STATE_PARAM_VALIDATE;
|
|
}
|
|
break;
|
|
|
|
|
|
default:
|
|
CPU_SW_EXCEPTION(;);
|
|
break;
|
|
}
|
|
|
|
(void)p_conn_const;
|
|
(void)result;
|
|
}
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HTTPcConn_Connect()
|
|
*
|
|
* Description : (1) Connect to an HTTP server.
|
|
* (a) Validate Server Socket Address.
|
|
* (b) Connect to Server.
|
|
*
|
|
* Argument(s) : p_conn Pointer to current HTTPc Connection.
|
|
*
|
|
* p_err Pointer to variable that will receive the return error code from this function :
|
|
*
|
|
* HTTPc_ERR_NONE Connection to server successful.
|
|
* HTTPc_ERR_CONN_PARAM_PORT_INVALID Invalid HTTP Server port number.
|
|
* HTTPc_ERR_CONN_PARAM_ADDR_INVALID Invalid HTTP Server address.
|
|
* HTTPc_ERR_CONN_PARAM_ADDR_FAMILY_INVALID Invalid HTTP Server address family.
|
|
*
|
|
* ------------ RETURNED BY HTTPcSock_Connect() ------------
|
|
* See HTTPcSock_Connect() for additional return error codes.
|
|
*
|
|
*
|
|
* Return(s) : None.
|
|
*
|
|
* Caller(s) : HTTPcTask_Handler(),
|
|
* HTTPc_ConnConnect().
|
|
*
|
|
* Note(s) : None.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
void HTTPcConn_Connect(HTTPc_CONN *p_conn,
|
|
HTTPc_ERR *p_err)
|
|
{
|
|
CPU_BOOLEAN is_connect;
|
|
#ifdef HTTPc_TASK_MODULE_EN
|
|
CPU_BOOLEAN no_block;
|
|
#endif
|
|
|
|
is_connect = DEF_BIT_IS_SET(p_conn->Flags, HTTPc_FLAG_CONN_CONNECT);
|
|
if (is_connect == DEF_YES) {
|
|
*p_err = HTTPc_ERR_CONN_IS_CONNECT;
|
|
goto exit;
|
|
}
|
|
|
|
/* ---------------- VALIDATE CALLBACKS ---------------- */
|
|
#ifdef HTTPc_TASK_MODULE_EN
|
|
no_block = DEF_BIT_IS_SET(p_conn->Flags, HTTPc_FLAG_CONN_NO_BLOCK);
|
|
if (no_block == DEF_YES) {
|
|
if (p_conn->OnConnect == DEF_NULL) {
|
|
*p_err = HTTPc_ERR_CONN_PARAM_CONNECT_CALLBACK_INVALID;
|
|
goto exit;
|
|
}
|
|
}
|
|
|
|
if (p_conn->OnClose == DEF_NULL) {
|
|
*p_err = HTTPc_ERR_CONN_PARAM_CLOSE_CALLBACK_INVALID;
|
|
goto exit;
|
|
}
|
|
#endif
|
|
|
|
/* -------------- CONNECT TO HTTP SERVER -------------- */
|
|
HTTPcSock_Connect(p_conn, p_err);
|
|
if (*p_err != HTTPc_ERR_NONE) {
|
|
goto exit;
|
|
}
|
|
|
|
DEF_BIT_SET(p_conn->Flags, HTTPc_FLAG_CONN_CONNECT);
|
|
|
|
*p_err = HTTPc_ERR_NONE;
|
|
|
|
|
|
exit:
|
|
return;
|
|
}
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HTTPcConn_Close()
|
|
*
|
|
* Description : (1) HTTPc Connection Close Handler:
|
|
* (a) Call hook function to advertise connection closing.
|
|
* (b) Close Socket
|
|
* (c) Release HTTPc Connection related objects.
|
|
* (d) Remove connection from list.
|
|
*
|
|
*
|
|
* Argument(s) : p_conn Pointer to current HTTPc Connection.
|
|
*
|
|
* p_err Pointer to variable that will receive the return error code from this function :
|
|
*
|
|
* ------------ RETURNED BY HTTPcSock_Close() -------------
|
|
* See HTTPcSock_Close() for additional return error codes.
|
|
*
|
|
* Return(s) : None.
|
|
*
|
|
* Caller(s) : HTTPcConn_TransProcess(),
|
|
* HTTPc_ConnCloseHandler().
|
|
*
|
|
* Note(s) : None.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
void HTTPcConn_Close(HTTPc_CONN *p_conn,
|
|
HTTPc_ERR *p_err)
|
|
{
|
|
HTTPc_CONN_OBJ *p_conn_const;
|
|
HTTPc_REQ *p_req;
|
|
HTTPc_REQ_OBJ *p_req_const;
|
|
|
|
|
|
p_conn_const = (HTTPc_CONN_OBJ *)p_conn;
|
|
|
|
/* ---------- CLEAR CONNECTION REQUESTS LIST ---------- */
|
|
p_req = p_conn->ReqListHeadPtr;
|
|
p_req_const = (HTTPc_REQ_OBJ *)p_req;
|
|
while (p_req != DEF_NULL) {
|
|
#ifdef HTTPc_TASK_MODULE_EN
|
|
if (p_req->OnTransComplete != DEF_NULL) {
|
|
p_req->OnTransComplete(p_conn_const, p_req_const, p_req->RespPtr, DEF_FAIL);
|
|
}
|
|
if (p_req->OnErr != DEF_NULL) {
|
|
p_req->OnErr(p_conn_const, p_req_const, HTTPc_ERR_CONN_SOCK_CLOSED);
|
|
}
|
|
#else
|
|
(void)p_conn_const;
|
|
(void)p_req_const;
|
|
#endif
|
|
HTTPcConn_ReqRemove(p_conn);
|
|
p_req = p_conn->ReqListHeadPtr;
|
|
}
|
|
|
|
DEF_BIT_CLR(p_conn->Flags, HTTPc_FLAG_CONN_CONNECT);
|
|
DEF_BIT_CLR(p_conn->Flags, HTTPc_FLAG_CONN_IN_USE);
|
|
/* ------------- CLOSE CONNECTION SOCKET -------------- */
|
|
HTTPcSock_Close(p_conn, p_err);
|
|
if (*p_err != HTTPc_ERR_NONE) {
|
|
*p_err = HTTPc_ERR_CONN_SOCK_CLOSE_FATAL;
|
|
goto exit;
|
|
}
|
|
|
|
*p_err = HTTPc_ERR_NONE;
|
|
|
|
|
|
exit:
|
|
return;
|
|
}
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HTTPcConn_TransProcess()
|
|
*
|
|
* Description : Process the connection's transaction state (i.e. request or response state).
|
|
*
|
|
* Argument(s) : p_conn Pointer to current HTTPc Connection.
|
|
*
|
|
* Return(s) : none.
|
|
*
|
|
* Caller(s) : HTTPcTask_Handler().
|
|
*
|
|
* Note(s) : none.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
void HTTPcConn_TransProcess(HTTPc_CONN *p_conn)
|
|
{
|
|
HTTPc_CONN_OBJ *p_conn_const;
|
|
HTTPc_REQ *p_req;
|
|
HTTPc_REQ_OBJ *p_req_const;
|
|
CPU_BOOLEAN result;
|
|
#ifdef HTTPc_TASK_MODULE_EN
|
|
CPU_BOOLEAN no_block;
|
|
#endif
|
|
CPU_BOOLEAN success;
|
|
CPU_BOOLEAN to_close;
|
|
HTTPc_ERR err;
|
|
#ifdef HTTPc_WEBSOCK_MODULE_EN
|
|
CPU_BOOLEAN is_websocket;
|
|
#endif
|
|
p_conn_const = (HTTPc_CONN_OBJ *)p_conn;
|
|
|
|
p_req = p_conn->ReqListHeadPtr;
|
|
p_req_const = (HTTPc_REQ_OBJ *)p_req;
|
|
|
|
/* ------------- CONNECTION STATE MACHINE ------------- */
|
|
switch (p_conn->State) {
|
|
case HTTPc_CONN_STATE_PARAM_VALIDATE: /* REQUEST PREPARATION & VALIDATTION STATE */
|
|
result = HTTPcSock_IsRxClosed(p_conn, &err); /* Check if connection half-closed by server. */
|
|
if (result == DEF_YES) {
|
|
p_conn->ErrCode = HTTPc_ERR_NONE;
|
|
p_conn->CloseStatus = HTTPc_CONN_CLOSE_STATUS_SERVER;
|
|
p_conn->State = HTTPc_CONN_STATE_COMPLETED;
|
|
} else {
|
|
if (p_req != DEF_NULL) {
|
|
HTTPcConn_TransParamReset(p_conn); /* Clear Connection internal parameters. */
|
|
HTTPcReq_Prepare(p_conn, &err);
|
|
if (err != HTTPc_ERR_NONE) {
|
|
p_conn->ErrCode = err;
|
|
p_conn->CloseStatus = HTTPc_CONN_CLOSE_STATUS_NONE;
|
|
p_conn->State = HTTPc_CONN_STATE_ERR;
|
|
} else {
|
|
p_conn->State = HTTPc_CONN_STATE_REQ_LINE_METHOD;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
|
|
case HTTPc_CONN_STATE_REQ_LINE_METHOD:
|
|
case HTTPc_CONN_STATE_REQ_LINE_URI:
|
|
case HTTPc_CONN_STATE_REQ_LINE_QUERY_STR:
|
|
case HTTPc_CONN_STATE_REQ_LINE_PROTO_VER:
|
|
case HTTPc_CONN_STATE_REQ_HDR_HOST:
|
|
case HTTPc_CONN_STATE_REQ_HDR_CONTENT_TYPE:
|
|
case HTTPc_CONN_STATE_REQ_HDR_CONTENT_LEN:
|
|
case HTTPc_CONN_STATE_REQ_HDR_TRANSFER_ENCODE:
|
|
case HTTPc_CONN_STATE_REQ_HDR_CONN:
|
|
case HTTPc_CONN_STATE_REQ_HDR_EXT:
|
|
case HTTPc_CONN_STATE_REQ_HDR_LAST:
|
|
case HTTPc_CONN_STATE_REQ_BODY:
|
|
case HTTPc_CONN_STATE_REQ_BODY_DATA:
|
|
case HTTPc_CONN_STATE_REQ_BODY_DATA_CHUNK_SIZE:
|
|
case HTTPc_CONN_STATE_REQ_BODY_DATA_CHUNK_DATA:
|
|
case HTTPc_CONN_STATE_REQ_BODY_DATA_CHUNK_END:
|
|
case HTTPc_CONN_STATE_REQ_BODY_FORM_APP:
|
|
case HTTPc_CONN_STATE_REQ_BODY_FORM_MULTIPART_BOUNDARY:
|
|
case HTTPc_CONN_STATE_REQ_BODY_FORM_MULTIPART_HDR_CONTENT_DISPO:
|
|
case HTTPc_CONN_STATE_REQ_BODY_FORM_MULTIPART_HDR_CONTENT_TYPE:
|
|
case HTTPc_CONN_STATE_REQ_BODY_FORM_MULTIPART_DATA:
|
|
case HTTPc_CONN_STATE_REQ_BODY_FORM_MULTIPART_DATA_END:
|
|
case HTTPc_CONN_STATE_REQ_BODY_FORM_MULTIPART_BOUNDARY_END:
|
|
case HTTPc_CONN_STATE_REQ_END: /* REQUEST PROCESSING STATES */
|
|
(void)HTTPcReq(p_conn, &err);
|
|
switch (err) {
|
|
case HTTPc_ERR_NONE:
|
|
case HTTPc_ERR_CONN_SOCK_TX:
|
|
case HTTPc_ERR_TRANS_TX_BUF_FULL:
|
|
break;
|
|
|
|
case HTTPc_ERR_CONN_SOCK_CLOSED:
|
|
p_conn->ErrCode = err;
|
|
p_conn->CloseStatus = HTTPc_CONN_CLOSE_STATUS_SERVER;
|
|
p_conn->State = HTTPc_CONN_STATE_ERR;
|
|
break;
|
|
|
|
default:
|
|
p_conn->ErrCode = err;
|
|
p_conn->CloseStatus = HTTPc_CONN_CLOSE_STATUS_ERR_INTERNAL;
|
|
p_conn->State = HTTPc_CONN_STATE_ERR;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
|
|
case HTTPc_CONN_STATE_RESP_INIT:
|
|
case HTTPc_CONN_STATE_RESP_STATUS_LINE:
|
|
case HTTPc_CONN_STATE_RESP_HDR:
|
|
case HTTPc_CONN_STATE_RESP_BODY:
|
|
case HTTPc_CONN_STATE_RESP_BODY_CHUNK_SIZE:
|
|
case HTTPc_CONN_STATE_RESP_BODY_CHUNK_DATA:
|
|
case HTTPc_CONN_STATE_RESP_BODY_CHUNK_CRLF:
|
|
case HTTPc_CONN_STATE_RESP_BODY_CHUNK_LAST:
|
|
case HTTPc_CONN_STATE_RESP_COMPLETED: /* RESPONSE PROCESSING STATES */
|
|
success = HTTPcResp(p_conn, &err);
|
|
switch (err) {
|
|
case HTTPc_ERR_NONE:
|
|
case HTTPc_ERR_CONN_SOCK_RX:
|
|
case HTTPc_ERR_TRANS_RX_MORE_DATA_REQUIRED:
|
|
break;
|
|
|
|
case HTTPc_ERR_CONN_SOCK_CLOSED:
|
|
p_conn->ErrCode = err;
|
|
p_conn->CloseStatus = HTTPc_CONN_CLOSE_STATUS_SERVER;
|
|
p_conn->State = HTTPc_CONN_STATE_ERR;
|
|
break;
|
|
|
|
default:
|
|
p_conn->ErrCode = err;
|
|
p_conn->CloseStatus = HTTPc_CONN_CLOSE_STATUS_ERR_INTERNAL;
|
|
p_conn->State = HTTPc_CONN_STATE_ERR;
|
|
break;
|
|
}
|
|
|
|
if (success == DEF_YES) {
|
|
DEF_BIT_SET(p_conn->RespFlags, HTTPc_FLAG_RESP_COMPLETE_OK);
|
|
} else {
|
|
DEF_BIT_CLR(p_conn->RespFlags, HTTPc_FLAG_RESP_COMPLETE_OK);
|
|
}
|
|
break;
|
|
|
|
|
|
case HTTPc_CONN_STATE_ERR: /* ERROR STATE */
|
|
#ifdef HTTPc_TASK_MODULE_EN
|
|
/* Call callback function for Transaction Error. */
|
|
if (p_req != DEF_NULL) {
|
|
if (p_req->OnErr != DEF_NULL) {
|
|
p_req->OnErr(p_conn_const, p_req_const, p_conn->ErrCode);
|
|
}
|
|
} else {
|
|
CPU_SW_EXCEPTION(;);
|
|
}
|
|
#endif
|
|
p_conn->State = HTTPc_CONN_STATE_COMPLETED;
|
|
break;
|
|
|
|
|
|
case HTTPc_CONN_STATE_COMPLETED: /* TRANSACTION COMPLETE STATE */
|
|
if (p_req != DEF_NULL) {
|
|
success = DEF_BIT_IS_SET(p_conn->RespFlags, HTTPc_FLAG_RESP_COMPLETE_OK);
|
|
#ifdef HTTPc_WEBSOCK_MODULE_EN
|
|
/* Check if it is a upgrade websocket request. */
|
|
result = DEF_BIT_IS_SET(p_req->Flags, HTTPc_FLAG_REQ_UPGRADE_WEBSOCKET);
|
|
if ((result == DEF_YES) && (success == DEF_YES)) {
|
|
if ((p_req->WebSockPtr->Flags & HTTPc_FLAG_WEBSOCK_ALL) == HTTPc_FLAG_WEBSOCK_ALL) {
|
|
if (p_req->RespPtr->StatusCode == HTTP_STATUS_SWITCHING_PROTOCOLS) {
|
|
/* The connection is upgrading to websocket. */
|
|
DEF_BIT_SET(p_conn->Flags, HTTPc_FLAG_CONN_WEBSOCKET);
|
|
p_conn->WebSockPtr = p_req->WebSockPtr->WebSockObjPtr;
|
|
}
|
|
}
|
|
}
|
|
if (p_req->WebSockPtr != DEF_NULL) {
|
|
HTTPc_Mem_WebSockReqRelease(p_req->WebSockPtr);
|
|
}
|
|
#endif
|
|
|
|
HTTPcConn_ReqRemove(p_conn); /* Remove request from list. */
|
|
|
|
#ifdef HTTPc_TASK_MODULE_EN
|
|
/* No-Blocking mode: notify app with callback that ... */
|
|
/* ... transaction is done. */
|
|
no_block = DEF_BIT_IS_SET(p_req->Flags, HTTPc_FLAG_REQ_NO_BLOCK);
|
|
if ((no_block == DEF_YES) &&
|
|
(p_req->OnTransComplete != DEF_NULL)) {
|
|
p_req->OnTransComplete(p_conn_const, p_req_const, p_req->RespPtr, success);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
to_close = HTTPcConn_TransComplete(p_conn);
|
|
if (to_close == DEF_YES) {
|
|
p_conn->State = HTTPc_CONN_STATE_CLOSE;
|
|
} else {
|
|
#ifdef HTTPc_SIGNAL_TASK_MODULE_EN
|
|
/* Blocking mode: Signal app that transaction is done. */
|
|
if (p_conn->TransDoneSignal.SemObjPtr != DEF_NULL) {
|
|
HTTPcTask_TransDoneSignal(p_conn, &err);
|
|
if (err != HTTPc_ERR_NONE) {
|
|
CPU_SW_EXCEPTION(;);
|
|
}
|
|
}
|
|
#endif
|
|
#ifdef HTTPc_WEBSOCK_MODULE_EN
|
|
|
|
is_websocket = DEF_BIT_IS_SET(p_conn->Flags, HTTPc_FLAG_CONN_WEBSOCKET);
|
|
if (is_websocket == DEF_YES) {
|
|
p_conn->State = HTTPc_CONN_STATE_WEBSOCK_INIT;
|
|
} else {
|
|
p_conn->State = HTTPc_CONN_STATE_PARAM_VALIDATE;
|
|
}
|
|
#else
|
|
p_conn->State = HTTPc_CONN_STATE_PARAM_VALIDATE;
|
|
#endif
|
|
}
|
|
break;
|
|
|
|
case HTTPc_CONN_STATE_CLOSE: /* CONNECTION CLOSE STATE */
|
|
HTTPcConn_Close(p_conn, &err); /* Close Connection. */
|
|
HTTPcConn_Remove(p_conn); /* Release Connection. */
|
|
|
|
#ifdef HTTPc_TASK_MODULE_EN
|
|
/* Call callback function for Conn Close. */
|
|
if (p_conn->OnClose != DEF_NULL) {
|
|
p_conn->OnClose(p_conn_const, p_conn->CloseStatus, p_conn->ErrCode);
|
|
}
|
|
|
|
#ifdef HTTPc_SIGNAL_TASK_MODULE_EN
|
|
/* Blocking mode: Signal app that transaction is done. */
|
|
if (p_conn->TransDoneSignal.SemObjPtr != DEF_NULL) {
|
|
HTTPcTask_TransDoneSignal(p_conn, &err);
|
|
if (err != HTTPc_ERR_NONE) {
|
|
CPU_SW_EXCEPTION(;);
|
|
}
|
|
}
|
|
/* Blocking mode: Signal App that Conn was closed. */
|
|
if (p_conn->CloseSignal.SemObjPtr != DEF_NULL) {
|
|
HTTPcTask_ConnCloseSignal(p_conn, &err);
|
|
if (err != HTTPc_ERR_NONE) {
|
|
CPU_SW_EXCEPTION(;);
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
p_conn->State = HTTPc_CONN_STATE_NONE;
|
|
break;
|
|
|
|
|
|
default:
|
|
CPU_SW_EXCEPTION(;);
|
|
break;
|
|
}
|
|
|
|
(void)p_conn_const;
|
|
(void)p_req_const;
|
|
}
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HTTPcConn_TransParamReset()
|
|
*
|
|
* Description : Clear HTTP Connection object members related to internal usage during an HTTP transaction.
|
|
*
|
|
* Argument(s) : p_conn Pointer to current HTTPc Connection.
|
|
*
|
|
* Return(s) : None.
|
|
*
|
|
* Caller(s) : HTTPc_ReqSend(),
|
|
* HTTPcTask_Handle().
|
|
*
|
|
* Note(s) : None.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
void HTTPcConn_TransParamReset(HTTPc_CONN *p_conn)
|
|
{
|
|
/* ------------ INIT CONNECTION PARAMETERS ------------ */
|
|
p_conn->SockFlags = DEF_BIT_NONE;
|
|
p_conn->ErrCode = HTTPc_ERR_NONE;
|
|
p_conn->CloseStatus = HTTPc_CONN_CLOSE_STATUS_NONE;
|
|
DEF_BIT_CLR(p_conn->Flags, HTTPc_FLAG_CONN_TO_CLOSE);
|
|
|
|
/* ------------- INIT REQUEST PARAMETERS -------------- */
|
|
p_conn->ReqFlags = 0u;
|
|
#if (HTTPc_CFG_QUERY_STR_EN == DEF_ENABLED)
|
|
p_conn->ReqQueryStrTxIx = 0u;
|
|
p_conn->ReqQueryStrTempPtr = DEF_NULL;
|
|
#endif
|
|
#if (HTTPc_CFG_HDR_TX_EN == DEF_ENABLED)
|
|
p_conn->ReqHdrTxIx = 0u;
|
|
p_conn->ReqHdrTempPtr = DEF_NULL;
|
|
#endif
|
|
#if (HTTPc_CFG_FORM_EN == DEF_ENABLED)
|
|
p_conn->ReqFormDataTxIx = 0u;
|
|
#endif
|
|
p_conn->ReqDataOffset = 0u;
|
|
|
|
/* ------------- INIT RESPONSE PARAMETERS ------------- */
|
|
DEF_BIT_CLR(p_conn->RespFlags, HTTPc_FLAG_RESP_RX_MORE_DATA);
|
|
DEF_BIT_CLR(p_conn->RespFlags, HTTPc_FLAG_RESP_BODY_CHUNK_TRANSFER);
|
|
|
|
|
|
/* --------- INIT CONNECTION BUFFER PARAMETERS -------- */
|
|
p_conn->RxBufPtr = p_conn->BufPtr;
|
|
p_conn->RxDataLenRem = 0u;
|
|
p_conn->RxDataLen = 0u;
|
|
p_conn->TxBufPtr = p_conn->BufPtr;
|
|
p_conn->TxDataLen = 0u;
|
|
p_conn->TxDataPtr = DEF_NULL;
|
|
}
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HTTPcConn_TransComplete()
|
|
*
|
|
* Description : HTTP Transaction complete checks if a connection must be closed.
|
|
*
|
|
* Argument(s) : p_conn Pointer to current HTTPc Connection.
|
|
*
|
|
* Return(s) : DEF_YES, if connection must be closed.
|
|
* DEF_NO, otherwise.
|
|
*
|
|
* Caller(s) : HTTPcTask_Handle(),
|
|
* HTTPc_ReqSend().
|
|
*
|
|
* Note(s) : None.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
CPU_BOOLEAN HTTPcConn_TransComplete(HTTPc_CONN *p_conn)
|
|
{
|
|
CPU_BOOLEAN close_hdr;
|
|
CPU_BOOLEAN is_connect;
|
|
CPU_BOOLEAN to_close;
|
|
#ifdef HTTPc_WEBSOCK_MODULE_EN
|
|
CPU_BOOLEAN is_websocket;
|
|
#endif
|
|
|
|
to_close = DEF_NO;
|
|
|
|
close_hdr = DEF_BIT_IS_SET(p_conn->Flags, HTTPc_FLAG_CONN_TO_CLOSE);
|
|
is_connect = DEF_BIT_IS_SET(p_conn->Flags, HTTPc_FLAG_CONN_CONNECT);
|
|
if ((close_hdr == DEF_YES) &&
|
|
(is_connect == DEF_YES)) {
|
|
to_close = DEF_YES;
|
|
}
|
|
#ifdef HTTPc_WEBSOCK_MODULE_EN
|
|
is_websocket = DEF_BIT_IS_SET(p_conn->Flags, HTTPc_FLAG_CONN_WEBSOCKET);
|
|
if (is_websocket == DEF_YES) {
|
|
to_close = DEF_NO;
|
|
}
|
|
#endif
|
|
if (p_conn->CloseStatus != HTTPc_CONN_CLOSE_STATUS_NONE) {
|
|
to_close = DEF_YES;
|
|
}
|
|
|
|
return (to_close);
|
|
}
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HTTPcConn_Add()
|
|
*
|
|
* Description : (1) Add current HTTPc Connection to connection list if the task is enabled.
|
|
* (2) Tag Connection as being used.
|
|
*
|
|
*
|
|
* Argument(s) : p_conn Pointer to current HTTPc Connection.
|
|
*
|
|
* Return(s) : None.
|
|
*
|
|
* Caller(s) : HTTPcTask(),
|
|
* HTTPc_ConnOpen().
|
|
*
|
|
* Note(s) : None.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
void HTTPcConn_Add(HTTPc_CONN *p_conn)
|
|
{
|
|
DEF_BIT_SET(p_conn->Flags, HTTPc_FLAG_CONN_IN_USE);
|
|
#ifdef HTTPc_TASK_MODULE_EN
|
|
HTTPcTask_ConnAdd(p_conn);
|
|
#endif
|
|
|
|
p_conn->State = HTTPc_CONN_STATE_CONNECT;
|
|
}
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HTTPcConn_Remove()
|
|
*
|
|
* Description : (1) Remove current HTTPc Connection from connection list if the task is enabled.
|
|
* (2) Release Connection.
|
|
*
|
|
*
|
|
* Argument(s) : p_conn Pointer to current HTTPc Connection.
|
|
*
|
|
* Return(s) : None.
|
|
*
|
|
* Caller(s) : HTTPcConn_Process(),
|
|
* HTTPcConn_TransProcess().
|
|
*
|
|
* Note(s) : none.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
void HTTPcConn_Remove(HTTPc_CONN *p_conn)
|
|
{
|
|
|
|
#ifdef HTTPc_TASK_MODULE_EN
|
|
HTTPcTask_ConnRemove(p_conn);
|
|
#endif
|
|
|
|
DEF_BIT_CLR(p_conn->Flags, HTTPc_FLAG_CONN_IN_USE);
|
|
}
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HTTPcConn_ReqAdd()
|
|
*
|
|
* Description : Add new Request to the Connection Request list.
|
|
*
|
|
* Argument(s) : p_req Pointer to the HTTPc Request.
|
|
*
|
|
* p_err Pointer to variable that will receive the return error code from this function :
|
|
*
|
|
* HTTPc_ERR_NONE Request added successfully.
|
|
* HTTPc_ERR_CONN_IS_RELEASED Connection is not used.
|
|
*
|
|
* Return(s) : None.
|
|
*
|
|
* Caller(s) : HTTPcTask(),
|
|
* HTTPc_ReqSend().
|
|
*
|
|
* Note(s) : (1) New Request is added at the end of the list.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
void HTTPcConn_ReqAdd(HTTPc_REQ *p_req,
|
|
HTTPc_ERR *p_err)
|
|
{
|
|
HTTPc_CONN *p_conn;
|
|
HTTPc_REQ *p_req_item;
|
|
CPU_BOOLEAN in_use;
|
|
|
|
|
|
p_conn = p_req->ConnPtr;
|
|
|
|
in_use = DEF_BIT_IS_SET(p_conn->Flags, HTTPc_FLAG_CONN_IN_USE);
|
|
|
|
if (in_use == DEF_YES) {
|
|
DEF_BIT_SET(p_req->Flags, HTTPc_FLAG_REQ_IN_USE);
|
|
|
|
if (p_conn->ReqListHeadPtr == DEF_NULL) {
|
|
p_conn->ReqListHeadPtr = p_req;
|
|
p_conn->ReqListEndPtr = p_req;
|
|
p_req->NextPtr = 0;
|
|
} else {
|
|
p_req_item = p_conn->ReqListEndPtr;
|
|
p_req_item->NextPtr = p_req;
|
|
p_conn->ReqListEndPtr = p_req;
|
|
p_req->NextPtr = 0;
|
|
}
|
|
|
|
*p_err = HTTPc_ERR_NONE;
|
|
|
|
} else {
|
|
*p_err = HTTPc_ERR_CONN_IS_RELEASED;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* HTTPcConn_ReqRemove()
|
|
*
|
|
* Description : Remove the first Request from the Connection Request list.
|
|
*
|
|
* Argument(s) : p_conn Pointer to the HTTPc Connection.
|
|
*
|
|
* Return(s) : None.
|
|
*
|
|
* Caller(s) : HTTPcConn_Close(),
|
|
* HTTPcConn_TransComplete().
|
|
*
|
|
* Note(s) : (1) The Head of the Request list is removed.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
void HTTPcConn_ReqRemove(HTTPc_CONN *p_conn)
|
|
{
|
|
HTTPc_REQ *p_req_item;
|
|
CPU_SR_ALLOC();
|
|
|
|
|
|
p_req_item = p_conn->ReqListHeadPtr;
|
|
|
|
if (p_req_item == DEF_NULL) {
|
|
p_conn->ReqListEndPtr = DEF_NULL;
|
|
} else if (p_req_item->NextPtr == DEF_NULL) {
|
|
p_conn->ReqListHeadPtr = DEF_NULL;
|
|
p_conn->ReqListEndPtr = DEF_NULL;
|
|
p_req_item->NextPtr = 0;
|
|
} else {
|
|
p_conn->ReqListHeadPtr = p_req_item->NextPtr;
|
|
p_req_item->NextPtr = 0;
|
|
}
|
|
|
|
if (p_req_item != DEF_NULL) {
|
|
CPU_CRITICAL_ENTER();
|
|
DEF_BIT_CLR(p_req_item->Flags, HTTPc_FLAG_REQ_IN_USE);
|
|
CPU_CRITICAL_EXIT();
|
|
}
|
|
}
|
|
|