doubao_chat/include_lib/net/uC-HTTPc/http-c.h

1283 lines
61 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
*
* Filename : http-c.h
* Version : V3.01.00
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*********************************************************************************************************
* MODULE
*
* Note(s) : (1) This main network protocol suite header file is protected from multiple pre-processor
* inclusion through use of the HTTPc module present pre-processor macro definition.
*********************************************************************************************************
*********************************************************************************************************
*/
#ifndef HTTPc_MODULE_PRESENT /* See Note #1. */
#define HTTPc_MODULE_PRESENT
/*
*********************************************************************************************************
*********************************************************************************************************
* HTTPc VERSION NUMBER
*
* Note(s) : (1) (a) The HTTPc module software version is denoted as follows :
*
* Vx.yy.zz
*
* where
* V denotes 'Version' label
* x denotes major software version revision number
* yy denotes minor software version revision number
* zz denotes sub-minor software version revision number
*
* (b) The HTTPc software version label #define is formatted as follows :
*
* ver = x.yyzz * 100 * 100
*
* where
* ver denotes software version number scaled as an integer value
* x.yyzz denotes software version number, where the unscaled integer
* portion denotes the major version number & the unscaled
* fractional portion denotes the (concatenated) minor
* version numbers
*********************************************************************************************************
*********************************************************************************************************
*/
#define HTTPc_VERSION 30100u /* See Note #1. */
/*
*********************************************************************************************************
*********************************************************************************************************
* INCLUDE FILES
*********************************************************************************************************
*********************************************************************************************************
*/
#include <cpu.h>
#include "include/lib_def.h"
#include "include/lib_str.h"
#include "include/lib_ascii.h"
#include "include/net.h"
#include "include/net_cfg_net.h"
#include "include/net_app.h"
#include "include/net_sock.h"
#include "http-c_cfg.h"
#include "http.h"
#include "http_dict.h"
/*
*********************************************************************************************************
*********************************************************************************************************
* CONFIGURATION ERRORS
*********************************************************************************************************
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* HTTPc CONFIGURATION ERRORS
*********************************************************************************************************
*/
#ifndef HTTPc_CFG_ARG_CHK_EXT_EN
#error "HTTPc_CFG_ARG_CHK_EXT_EN not #define'd in 'http-c_cfg.h'."
#elif ((HTTPc_CFG_ARG_CHK_EXT_EN != DEF_ENABLED ) && \
(HTTPc_CFG_ARG_CHK_EXT_EN != DEF_DISABLED))
#error "HTTPc_CFG_ARG_CHK_EXT_EN illegally #define'd in 'http-c_cfg.h'. MUST be DEF_DISABLED or DEF_ENABLED"
#endif
#ifndef HTTPc_CFG_MODE_ASYNC_TASK_EN
#error "HTTPc_CFG_MODE_ASYNC_TASK_EN not #define'd in 'http-c_cfg.h'"
#elif ((HTTPc_CFG_MODE_ASYNC_TASK_EN != DEF_ENABLED ) && \
(HTTPc_CFG_MODE_ASYNC_TASK_EN != DEF_DISABLED))
#error "HTTPc_CFG_MODE_ASYNC_TASK_EN illegally #define'd in 'http-c_cfg.h'. MUST be DEF_DISABLED or DEF_ENABLED"
#endif
#ifndef HTTPc_CFG_MODE_BLOCK_EN
#error "HTTPc_CFG_MODE_BLOCK_EN not #define'd in 'http-c_cfg.h'"
#elif ((HTTPc_CFG_MODE_BLOCK_EN != DEF_ENABLED ) && \
(HTTPc_CFG_MODE_BLOCK_EN != DEF_DISABLED))
#error "HTTPc_CFG_MODE_BLOCK_EN illegally #define'd in 'http-c_cfg.h'. MUST be DEF_DISABLED or DEF_ENABLED"
#endif
#ifndef HTTPc_CFG_PERSISTENT_EN
#error "HTTPc_CFG_PERSISTENT_EN not #define'd in 'http-c_cfg.h'"
#elif ((HTTPc_CFG_PERSISTENT_EN != DEF_ENABLED ) && \
(HTTPc_CFG_PERSISTENT_EN != DEF_DISABLED))
#error "HTTPc_CFG_PERSISTENT_EN illegally #define'd in 'http-c_cfg.h'. MUST be DEF_DISABLED or DEF_ENABLED"
#endif
#ifndef HTTPc_CFG_CHUNK_TX_EN
#error "HTTPc_CFG_CHUNK_TX_EN not #define'd in 'http-c_cfg.h'"
#elif ((HTTPc_CFG_CHUNK_TX_EN != DEF_ENABLED ) && \
(HTTPc_CFG_CHUNK_TX_EN != DEF_DISABLED))
#error "HTTPc_CFG_CHUNK_TX_EN illegally #define'd in 'http-c_cfg.h'. MUST be DEF_DISABLED or DEF_ENABLED"
#endif
#ifndef HTTPc_CFG_QUERY_STR_EN
#error "HTTPc_CFG_QUERY_STR_EN not #define'd in 'http-c_cfg.h'"
#elif ((HTTPc_CFG_QUERY_STR_EN != DEF_ENABLED ) && \
(HTTPc_CFG_QUERY_STR_EN != DEF_DISABLED))
#error "HTTPc_CFG_QUERY_STR_EN illegally #define'd in 'http-c_cfg.h'. MUST be DEF_DISABLED or DEF_ENABLED"
#endif
#ifndef HTTPc_CFG_HDR_RX_EN
#error "HTTPc_CFG_HDR_RX_EN not #define'd in 'http-c_cfg.h'"
#elif ((HTTPc_CFG_HDR_RX_EN != DEF_ENABLED ) && \
(HTTPc_CFG_HDR_RX_EN != DEF_DISABLED))
#error "HTTPc_CFG_HDR_RX_EN illegally #define'd in 'http-c_cfg.h'. MUST be DEF_DISABLED or DEF_ENABLED"
#endif
#ifndef HTTPc_CFG_HDR_TX_EN
#error "HTTPc_CFG_HDR_TX_EN not #define'd in 'http-c_cfg.h'"
#elif ((HTTPc_CFG_HDR_TX_EN != DEF_ENABLED ) && \
(HTTPc_CFG_HDR_TX_EN != DEF_DISABLED))
#error "HTTPc_CFG_HDR_TX_EN illegally #define'd in 'http-c_cfg.h'. MUST be DEF_DISABLED or DEF_ENABLED"
#endif
#ifndef HTTPc_CFG_FORM_EN
#error "HTTPc_CFG_FORM_EN not #define'd in 'http-c_cfg.h'"
#elif ((HTTPc_CFG_FORM_EN != DEF_ENABLED ) && \
(HTTPc_CFG_FORM_EN != DEF_DISABLED))
#error "HTTPc_CFG_FORM_EN illegally #define'd in 'http-c_cfg.h'. MUST be DEF_DISABLED or DEF_ENABLED"
#endif
#ifndef HTTPc_CFG_USER_DATA_EN
#error "HTTPc_CFG_USER_DATA_EN not #define'd in 'http-c_cfg.h'"
#elif ((HTTPc_CFG_USER_DATA_EN != DEF_ENABLED ) && \
(HTTPc_CFG_USER_DATA_EN != DEF_DISABLED))
#error "HTTPc_CFG_USER_DATA_EN illegally #define'd in 'http-c_cfg.h'. MUST be DEF_DISABLED or DEF_ENABLED"
#endif
#ifndef HTTPc_CFG_WEBSOCKET_EN
#error "HTTPc_CFG_WEBSOCKET_EN not #define'd in 'http-c_cfg.h'"
#elif ((HTTPc_CFG_WEBSOCKET_EN != DEF_ENABLED ) && \
(HTTPc_CFG_WEBSOCKET_EN != DEF_DISABLED))
#error "HTTPc_CFG_WEBSOCKET_EN illegally #define'd in 'http-c_cfg.h'. MUST be DEF_DISABLED or DEF_ENABLED"
#endif
#if ((HTTPc_CFG_WEBSOCKET_EN == DEF_ENABLED ) && \
(HTTPc_CFG_MODE_ASYNC_TASK_EN == DEF_DISABLED))
#error "HTTPc_CFG_WEBSOCKET_EN cannot be DEF_ENABLED if HTTPc_CFG_MODE_ASYNC_TASK_EN is DEF_DISABLED."
#endif
/*
*********************************************************************************************************
* NETWORK CONFIGURATION ERRORS
*********************************************************************************************************
*/
#if (NET_VERSION < 30300u)
#error "NET_VERSION Invalid network protocol suite version. MUST be >= 3.02.00."
#endif
#if (NET_SOCK_CFG_SEL_EN != DEF_ENABLED)
#error "NET_SOCK_CFG_SEL_EN illegally #define'd in 'net_cfg.h'. MUST be DEF_ENABLED."
#endif
/*
*********************************************************************************************************
* LIB CONFIGURATION ERRORS
*********************************************************************************************************
*/
#if (LIB_VERSION < 13800u)
#error "LIB_VERSION Invalid library suite version. MUST be >= 1.38.00."
#endif
/*
*********************************************************************************************************
*********************************************************************************************************
* DEFINES
*********************************************************************************************************
*********************************************************************************************************
*/
#define HTTPc_WEBSOCK_TX_MSG_LEN_NOT_DEFINED DEF_INT_32U_MAX_VAL
/*
*********************************************************************************************************
* MODULE DEFINES
*********************************************************************************************************
*/
#if (HTTPc_CFG_MODE_ASYNC_TASK_EN == DEF_ENABLED)
#define HTTPc_TASK_MODULE_EN
#if (HTTPc_CFG_MODE_BLOCK_EN == DEF_ENABLED)
#define HTTPc_SIGNAL_TASK_MODULE_EN
#endif
#if (HTTPc_CFG_WEBSOCKET_EN == DEF_ENABLED)
#define HTTPc_WEBSOCK_MODULE_EN
#endif
#endif
/*
*********************************************************************************************************
*********************************************************************************************************
* DATA TYPES
*********************************************************************************************************
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* HTTP CLIENT FLAGS DATA TYPE
*********************************************************************************************************
*/
typedef CPU_INT08U HTTPc_FLAGS;
#define HTTPc_FLAG_NONE DEF_BIT_NONE
/* SOCKET FLAGS */
#define HTTPc_FLAG_SOCK_RDY_RD DEF_BIT_00
#define HTTPc_FLAG_SOCK_RDY_WR DEF_BIT_01
#define HTTPc_FLAG_SOCK_RDY_ERR DEF_BIT_02
/* CONNECTION FLAGS */
#define HTTPc_FLAG_CONN_CONNECT DEF_BIT_00 /* bits 0-3 internal usage. */
#define HTTPc_FLAG_CONN_IN_USE DEF_BIT_01
#define HTTPc_FLAG_CONN_TO_CLOSE DEF_BIT_02
#define HTTPc_FLAG_CONN_PERSISTENT DEF_BIT_04 /* bits 4-7 configurable. */
#define HTTPc_FLAG_CONN_NO_BLOCK DEF_BIT_05
#define HTTPc_FLAG_CONN_WEBSOCKET DEF_BIT_06
/* REQUEST CFG FLAGS */
#define HTTPc_FLAG_REQ_NO_BLOCK DEF_BIT_00
#define HTTPc_FLAG_REQ_BODY_PRESENT DEF_BIT_01
#define HTTPc_FLAG_REQ_FORM_PRESENT DEF_BIT_02
#define HTTPc_FLAG_REQ_BODY_CHUNK_TRANSFER DEF_BIT_03
#define HTTPc_FLAG_REQ_IN_USE DEF_BIT_04
#define HTTPc_FLAG_REQ_UPGRADE_WEBSOCKET DEF_BIT_05
/* REQUEST CFG HDR FLAGS */
#define HTTPc_FLAG_REQ_HDR_HOST_ADD DEF_BIT_00
#define HTTPc_FLAG_REQ_HDR_CONTENT_TYPE_ADD DEF_BIT_01
#define HTTPc_FLAG_REQ_HDR_TRANSFER_ENCODE_ADD DEF_BIT_02
#define HTTPc_FLAG_REQ_HDR_CONTENT_LENGTH_ADD DEF_BIT_03
#define HTTPc_FLAG_REQ_HDR_CONNECTION_ADD DEF_BIT_04
#define HTTPc_FLAG_REQ_HDR_UPGRADE_ADD DEF_BIT_05
#define HTTPc_FLAG_REQ_HDR_WEBSOCKET_ADD DEF_BIT_06
/* REQUEST FLAGS */
#define HTTPc_FLAG_REQ_LINE_QUERY_STR_BEGIN DEF_BIT_00
#define HTTPc_FLAG_REQ_LINE_QUERY_STR_DONE DEF_BIT_01
#define HTTPc_FLAG_REQ_HDR_DONE DEF_BIT_02
#define HTTPc_FLAG_REQ_BODY_CHUNK_LAST DEF_BIT_03
/* RESPONSE FLAGS */
#define HTTPc_FLAG_RESP_RX_MORE_DATA DEF_BIT_00
#define HTTPc_FLAG_RESP_BODY_CHUNK_TRANSFER DEF_BIT_01
#define HTTPc_FLAG_RESP_COMPLETE_OK DEF_BIT_02
/* WEBSOCK SEND FLAGS */
#define HTTPc_FLAG_WEBSOCK_NO_BLOCK HTTPc_FLAG_REQ_NO_BLOCK
/*
*********************************************************************************************************
* API PARAMETERS DATA TYPE
*********************************************************************************************************
*/
typedef enum httpc_param_type {
HTTPc_PARAM_TYPE_SERVER_PORT,
HTTPc_PARAM_TYPE_PERSISTENT,
HTTPc_PARAM_TYPE_CONNECT_TIMEOUT,
HTTPc_PARAM_TYPE_INACTIVITY_TIMEOUT,
HTTPc_PARAM_TYPE_SECURE_COMMON_NAME,
HTTPc_PARAM_TYPE_SECURE_TRUST_CALLBACK,
HTTPc_PARAM_TYPE_USER_DATA,
HTTPc_PARAM_TYPE_REQ_QUERY_STR_TBL,
HTTPc_PARAM_TYPE_REQ_QUERY_STR_HOOK,
HTTPc_PARAM_TYPE_REQ_HDR_TBL,
HTTPc_PARAM_TYPE_REQ_UPGRADE_WEBSOCKET,
HTTPc_PARAM_TYPE_REQ_HDR_HOOK,
HTTPc_PARAM_TYPE_REQ_FORM_TBL,
HTTPc_PARAM_TYPE_REQ_BODY_CONTENT_TYPE,
HTTPc_PARAM_TYPE_REQ_BODY_CONTENT_LEN,
HTTPc_PARAM_TYPE_REQ_BODY_CHUNK,
HTTPc_PARAM_TYPE_REQ_BODY_HOOK,
HTTPc_PARAM_TYPE_REQ_USER_DATA,
HTTPc_PARAM_TYPE_RESP_HDR_HOOK,
HTTPc_PARAM_TYPE_RESP_BODY_HOOK,
HTTPc_PARAM_TYPE_TRANS_COMPLETE_CALLBACK,
HTTPc_PARAM_TYPE_TRANS_ERR_CALLBACK,
HTTPc_PARAM_TYPE_CONN_CONNECT_CALLBACK,
HTTPc_PARAM_TYPE_CONN_CLOSE_CALLBACK,
HTTPc_PARAM_TYPE_WEBSOCK_ON_OPEN,
HTTPc_PARAM_TYPE_WEBSOCK_ON_CLOSE,
HTTPc_PARAM_TYPE_WEBSOCK_ON_ERR,
HTTPc_PARAM_TYPE_WEBSOCK_ON_PONG,
HTTPc_PARAM_TYPE_WEBSOCK_ON_MSG_RX_INIT,
HTTPc_PARAM_TYPE_WEBSOCK_ON_MSG_RX_DATA,
HTTPc_PARAM_TYPE_WEBSOCK_ON_MSG_RX_COMPLETE,
HTTPc_PARAM_TYPE_WEBSOCK_USER_DATA,
HTTPc_PARAM_TYPE_WEBSOCK_MSG_USER_DATA,
HTTPc_PARAM_TYPE_WEBSOCK_MSG_ON_TX_INIT,
HTTPc_PARAM_TYPE_WEBSOCK_MSG_ON_TX_DATA,
HTTPc_PARAM_TYPE_WEBSOCK_MSG_ON_TX_COMPLETE,
/*额外增加的参数设置*/
HTTPc_PARAM_TYPE_USER_SECURE_DATA,
HTTPc_PARAM_TYPE_SECURE_MUTUAL,
} HTTPc_PARAM_TYPE;
/*
*********************************************************************************************************
* TABLE PARAMETER DATA TYPE
*********************************************************************************************************
*/
typedef struct httpc_param_tbl {
void *TblPtr;
CPU_INT16U EntryNbr;
} HTTPc_PARAM_TBL;
/*
*********************************************************************************************************
* CONNECTION STATES DATA TYPE
*********************************************************************************************************
*/
#define HTTPc_CONN_STATE_FAMILY_MASK DEF_BIT_MASK_08(7, 5)
#define HTTPc_CONN_STATE_FLOW_FAMILY DEF_BIT_MASK_08(0, 5)
#define HTTPc_CONN_STATE_REQ_FAMILY DEF_BIT_MASK_08(1, 5)
#define HTTPc_CONN_STATE_RESP_FAMILY DEF_BIT_MASK_08(2, 5)
#define HTTPc_CONN_STATE_WEBSOCK_FAMILY DEF_BIT_MASK_08(3, 5)
typedef enum httpc_conn_state {
HTTPc_CONN_STATE_NONE = 0u, /* 0b000xxxxx */
HTTPc_CONN_STATE_UNKNOWN,
HTTPc_CONN_STATE_PARAM_VALIDATE,
HTTPc_CONN_STATE_CONNECT,
HTTPc_CONN_STATE_COMPLETED,
HTTPc_CONN_STATE_CLOSE,
HTTPc_CONN_STATE_ERR,
HTTPc_CONN_STATE_WEBSOCK_INIT,
HTTPc_CONN_STATE_WEBSOCK_CLOSE,
HTTPc_CONN_STATE_WEBSOCK_ERR,
HTTPc_CONN_STATE_REQ_LINE_METHOD = 32u, /* 0b001xxxxx */
HTTPc_CONN_STATE_REQ_LINE_URI,
HTTPc_CONN_STATE_REQ_LINE_QUERY_STR,
HTTPc_CONN_STATE_REQ_LINE_PROTO_VER,
HTTPc_CONN_STATE_REQ_HDR_HOST,
HTTPc_CONN_STATE_REQ_HDR_CONTENT_TYPE,
HTTPc_CONN_STATE_REQ_HDR_CONTENT_LEN,
HTTPc_CONN_STATE_REQ_HDR_TRANSFER_ENCODE,
HTTPc_CONN_STATE_REQ_HDR_CONN,
HTTPc_CONN_STATE_REQ_HDR_UPGRADE,
HTTPc_CONN_STATE_REQ_HDR_WEBSOCKET,
HTTPc_CONN_STATE_REQ_HDR_EXT,
HTTPc_CONN_STATE_REQ_HDR_LAST,
HTTPc_CONN_STATE_REQ_BODY,
HTTPc_CONN_STATE_REQ_BODY_DATA,
HTTPc_CONN_STATE_REQ_BODY_DATA_CHUNK_SIZE,
HTTPc_CONN_STATE_REQ_BODY_DATA_CHUNK_DATA,
HTTPc_CONN_STATE_REQ_BODY_DATA_CHUNK_END,
HTTPc_CONN_STATE_REQ_BODY_FORM_APP,
HTTPc_CONN_STATE_REQ_BODY_FORM_MULTIPART_BOUNDARY,
HTTPc_CONN_STATE_REQ_BODY_FORM_MULTIPART_HDR_CONTENT_DISPO,
HTTPc_CONN_STATE_REQ_BODY_FORM_MULTIPART_HDR_CONTENT_TYPE,
HTTPc_CONN_STATE_REQ_BODY_FORM_MULTIPART_DATA,
HTTPc_CONN_STATE_REQ_BODY_FORM_MULTIPART_DATA_END,
HTTPc_CONN_STATE_REQ_BODY_FORM_MULTIPART_BOUNDARY_END,
HTTPc_CONN_STATE_REQ_END,
HTTPc_CONN_STATE_RESP_INIT = 64u, /* 0b010xxxxx */
HTTPc_CONN_STATE_RESP_STATUS_LINE,
HTTPc_CONN_STATE_RESP_HDR,
HTTPc_CONN_STATE_RESP_BODY,
HTTPc_CONN_STATE_RESP_BODY_CHUNK_SIZE,
HTTPc_CONN_STATE_RESP_BODY_CHUNK_DATA,
HTTPc_CONN_STATE_RESP_BODY_CHUNK_CRLF,
HTTPc_CONN_STATE_RESP_BODY_CHUNK_LAST,
HTTPc_CONN_STATE_RESP_COMPLETED,
HTTPc_CONN_STATE_WEBSOCK_RXTX = 96u, /* 0b011xxxxx */
} HTTPc_CONN_STATE;
/*
*********************************************************************************************************
* CONNECTION CLOSE STATUS DATA TYPE
*********************************************************************************************************
*/
typedef enum httpc_conn_close_status {
HTTPc_CONN_CLOSE_STATUS_NONE,
HTTPc_CONN_CLOSE_STATUS_ERR_INTERNAL,
HTTPc_CONN_CLOSE_STATUS_SERVER,
HTTPc_CONN_CLOSE_STATUS_NO_PERSISTENT,
HTTPc_CONN_CLOSE_STATUS_APP
} HTTPc_CONN_CLOSE_STATUS;
/*
*********************************************************************************************************
* ERROR DATA TYPE
*********************************************************************************************************
*/
#define HTTPc_ERR_FAMILY_MASK DEF_BIT_MASK_08(3, 6)
#define HTTPc_ERR_INIT_CFG_FAMILY DEF_BIT_MASK_08(0, 6)
#define HTTPc_ERR_CONN_FAMILY DEF_BIT_MASK_08(1, 6)
#define HTTPc_ERR_TRANS_FAMILY DEF_BIT_MASK_08(2, 6)
typedef enum httpc_err {
/* ------------ HTTPC_ERR_INIT_CFG_FAMILY ------------- */
HTTPc_ERR_NONE = 1u,
HTTPc_ERR_NULL_PTR = 2u,
HTTPc_ERR_FEATURE_DIS = 3u,
HTTPc_ERR_INIT = 10u,
HTTPc_ERR_INIT_NOT_COMPLETED = 11u,
HTTPc_ERR_INIT_TASK_INVALID_ARG = 12u,
HTTPc_ERR_INIT_TASK_MEM_ALLOC = 13u,
HTTPc_ERR_INIT_TASK_CREATE = 14u,
HTTPc_ERR_INIT_MSG_Q = 15u,
HTTPc_ERR_CFG_CONN_TIMEOUT_INVALID = 20u,
HTTPc_ERR_CFG_MSG_Q_SIZE_INVALID = 21u,
HTTPc_ERR_CFG_TASK_PTR_NULL = 22u,
HTTPc_ERR_CFG_TASK_DLY_INVALID = 23u,
HTTPc_ERR_CFG_INVALID_BUF_LEN = 24u,
HTTPc_ERR_PARAM_INVALID = 30u,
HTTPc_ERR_FORM_TYPE_INVALID = 40u,
HTTPc_ERR_FORM_FIELD_INVALID = 41u,
HTTPc_ERR_FORM_CREATE = 42u,
HTTPc_ERR_FORM_BUF_LEN_INVALID = 43u,
HTTPc_ERR_MSG_INIT_POOL_FAULT = 50u,
HTTPc_ERR_WEBSOCK_REQ_INIT_POOL_FAULT = 51u,
/* -------------- HTTPC_ERR_CONN_FAMILY --------------- */
HTTPc_ERR_CONN_PARAM_ADDR_INVALID = 64u,
HTTPc_ERR_CONN_PARAM_ADDR_FAMILY_INVALID = 65u,
HTTPc_ERR_CONN_PARAM_HOSTNAME_INVALID = 66u,
HTTPc_ERR_CONN_PARAM_PORT_INVALID = 67u,
HTTPc_ERR_CONN_PARAM_PERSISTENT_INVALID = 68u,
HTTPc_ERR_CONN_PARAM_CONNECT_TIMEOUT_INVALID = 69u,
HTTPc_ERR_CONN_PARAM_INACTIVITY_TIMEOUT_INVALID = 70u,
HTTPc_ERR_CONN_PARAM_CONNECT_CALLBACK_INVALID = 71u,
HTTPc_ERR_CONN_PARAM_CLOSE_CALLBACK_INVALID = 72u,
HTTPc_ERR_CONN_PARAM_ERR_CALLBACK_INVALID = 73u,
HTTPc_ERR_CONN_PARAM_WEBSOCK_OBJ_INVALID = 74u,
HTTPc_ERR_MSG_Q_FULL = 80u,
HTTPc_ERR_MSG_Q_SIGNAL_FAULT = 81u,
HTTPc_ERR_MSG_Q_EMPTY = 82u,
HTTPc_ERR_CONN_SIGNAL_CREATE = 90u,
HTTPc_ERR_CONN_SIGNAL_DEL = 91u,
HTTPc_ERR_CONN_SIGNAL_TIMEOUT = 92u,
HTTPc_ERR_CONN_SIGNAL_FAULT = 93u,
HTTPc_ERR_CONN_IS_CONNECT = 94u,
HTTPc_ERR_CONN_IS_USED = 95u,
HTTPc_ERR_CONN_IS_RELEASED = 96u,
HTTPc_ERR_CONN_INVALID_STATE = 97u,
HTTPc_ERR_CONN_SOCK_OPEN = 100u,
HTTPc_ERR_CONN_SOCK_CONNECT = 101u,
HTTPc_ERR_CONN_SOCK_TX = 102u,
HTTPc_ERR_CONN_SOCK_TX_FATAL = 103u,
HTTPc_ERR_CONN_SOCK_RX = 104u,
HTTPc_ERR_CONN_SOCK_RX_FATAL = 105u,
HTTPc_ERR_CONN_SOCK_CLOSED = 106u,
HTTPc_ERR_CONN_SOCK_CLOSE_FATAL = 107u,
HTTPc_ERR_CONN_SOCK_SEL = 108u,
HTTPc_ERR_CONN_SOCK_FAULT = 109u,
HTTPc_ERR_CONN_SOCK_ABORT_FAILED = 110u,
/* -------------- HTTPC_ERR_TRANS_FAMILY -------------- */
HTTPc_ERR_TRANS_BUF_LEN_INVALID = 128u,
HTTPc_ERR_TRANS_TX_BUF_FULL = 129u,
HTTPc_ERR_TRANS_RX_MORE_DATA_REQUIRED = 130u,
HTTPc_ERR_REQ_IS_USED = 131u,
HTTPc_ERR_REQ_PARAM_METHOD_INVALID = 140u,
HTTPc_ERR_REQ_PARAM_RESOURCE_PATH_INVALID = 141u,
HTTPc_ERR_REQ_PARAM_CONTENT_TYPE_INVALID = 142u,
HTTPc_ERR_REQ_PARAM_CONTENT_LEN_INVALID = 143u,
HTTPc_ERR_REQ_PARAM_BODY_INVALID = 144u,
HTTPc_ERR_REQ_PARAM_QUERY_STR_TBL_INVALID = 145u,
HTTPc_ERR_REQ_PARAM_HDR_INVALID_TBL_PTR = 146u,
HTTPc_ERR_REQ_PARAM_HDR_UNAUTHORIZED = 147u,
HTTPc_ERR_REQ_PARAM_FORM_FIELD_TBL_INVALID = 148u,
HTTPc_ERR_REQ_PARAM_FORM_FIELD_NULL_PTR = 149u,
HTTPc_ERR_REQ_PARAM_FORM_FIELD_INVALID_LEN = 150u,
HTTPc_ERR_REQ_PARAM_ERR_CALLBACK_INVALID = 151u,
HTTPc_ERR_REQ_PARAM_TRANS_COMPLETE_CALLBACK_INVALID = 152u,
HTTPc_ERR_REQ_PARAM_WEBSOCK_ON_OPEN_CALLBACK_INVALID = 153u,
HTTPc_ERR_REQ_PARAM_WEBSOCK_ON_RX_CALLBACK_INVALID = 154u,
HTTPc_ERR_REQ_LINE_CREATE = 160u,
HTTPc_ERR_REQ_QUERY_STR_CREATE = 161u,
HTTPc_ERR_REQ_QUERY_STR_INVALID = 162u,
HTTPc_ERR_REQ_HDR_CREATE = 163u,
HTTPc_ERR_REQ_HDR_INVALID = 164u,
HTTPc_ERR_REQ_FORM_CREATE = 165u,
HTTPc_ERR_REQ_BODY_PREPARE = 166u,
HTTPc_ERR_REQ_BODY_CHUNK_PREPARE = 167u,
HTTPc_ERR_REQ_BODY_CHUNK_INVALID = 168u,
HTTPc_ERR_REQ_BODY_NOT_PRESENT = 169u,
HTTPc_ERR_RESP_FORMAT_INVALID = 180u,
HTTPc_ERR_RESP_PROTOCOL_VER_INVALID = 181u,
HTTPc_ERR_RESP_STATUS_CODE_INVALID = 182u,
HTTPc_ERR_RESP_REASON_PHRASE_INVALID = 183u,
HTTPc_ERR_RESP_HDR_INVALID = 184u,
HTTPc_ERR_RESP_HDR_MALFORMED = 185u,
HTTPc_ERR_RESP_CONTENT_TYPE_INVALID = 186u,
HTTPc_ERR_RESP_CONTENT_LEN_INVALID = 187u,
HTTPc_ERR_RESP_CHUNK_INVALID = 188u,
HTTPc_ERR_RESP_RX_DATA_LEN_INVALID = 189u,
HTTPc_ERR_WEBSOCK_INVALID_TX_PARAM = 200u,
HTTPc_ERR_WEBSOCK_INVALID_CONN = 201u,
HTTPc_ERR_WEBSOCK_CONN_ALREADY_WEBSOCKET = 202u,
HTTPc_ERR_WEBSOCK_CONN_IS_NOT_CONNECTED = 203u,
HTTPc_ERR_WEBSOCK_INVALID_TX_LEN = 204u,
HTTPc_ERR_WEBSOCK_INVALID_RX_LEN = 205u,
HTTPc_ERR_WEBSOCK_INVALID_STATE = 206u,
HTTPc_ERR_WEBSOCK_INVALID_TX_STATE = 207u,
HTTPc_ERR_WEBSOCK_INVALID_RX_STATE = 208u,
HTTPc_ERR_WEBSOCK_INVALID_OPCODE = 209u,
HTTPc_ERR_WEBSOCK_FAULT = 210u,
HTTPc_ERR_WEBSOCK_TX_MSG_Q_EMPTY = 211u,
HTTPc_ERR_WEBSOCK_IS_USED = 212u,
HTTPc_ERR_WEBSOCK_REQ_IS_USED = 213u,
HTTPc_ERR_WEBSOCK_MSG_IS_USED = 214u,
HTTPc_ERR_WEBSOCK_INVALID_CLOSE_CODE = 215u,
HTTPc_ERR_WEBSOCK_INVALID_CTRL_FRAME_LEN = 216u,
HTTPc_ERR_WEBSOCK_MSG_Q_FULL = 217u,
HTTPc_ERR_WEBSOCK_MSG_Q_SIGNAL_FAULT = 218u,
HTTPc_ERR_WEBSOCK_RX_RSVD_BIT_1_SET = 219u,
HTTPc_ERR_WEBSOCK_RX_RSVD_BIT_2_SET = 220u,
HTTPc_ERR_WEBSOCK_RX_RSVD_BIT_3_SET = 221u,
HTTPc_ERR_WEBSOCK_RX_CTRL_FRAME_TOO_LONG = 222u,
HTTPc_ERR_WEBSOCK_RX_CTRL_FRAME_FRAGMENTED = 223u,
HTTPc_ERR_WEBSOCK_RX_INVALID_OPCODE = 224u,
HTTPc_ERR_WEBSOCK_RX_FRAG_FRAME_SEQUENCE_INVALID = 225u,
HTTPc_ERR_WEBSOCK_RX_CLOSE_CODE_INVALID = 226u,
HTTPc_ERR_WEBSOCK_REQ_MEM_ERR = 227u,
HTTPc_ERR_WEBSOCK_BASE64_ENCODE_FAIL = 228u,
HTTPc_ERR_WEBSOCK_SHA1_ENCODE_FAIL = 229u,
HTTPc_ERR_WEBSOCK_PARAM_ON_TX_CALLBACK_INVALID = 230u,
HTTPc_ERR_WEBSOCK_PARAM_ON_TX_COMPLETE_CALLBACK_INVALID = 231u,
HTTPc_ERR_WEBSOCK_SEND_ERROR = 232u,
} HTTPc_ERR;
/*
*********************************************************************************************************
* HTTP CLIENT OBJECTS DATA TYPE
*********************************************************************************************************
*/
typedef struct httpc_conn HTTPc_CONN;
typedef struct httpc_conn_obj HTTPc_CONN_OBJ;
typedef struct httpc_req HTTPc_REQ;
typedef struct httpc_req_obj HTTPc_REQ_OBJ;
typedef struct httpc_resp HTTPc_RESP;
typedef struct httpc_resp HTTPc_RESP_OBJ;
typedef struct httpc_websock HTTPc_WEBSOCK;
typedef struct httpc_websock_obj HTTPc_WEBSOCK_OBJ;
typedef struct httpc_websock_req HTTPc_WEBSOCK_REQ;
typedef struct httpc_websock_msg HTTPc_WEBSOCK_MSG;
typedef struct httpc_websock_msg_obj HTTPc_WEBSOCK_MSG_OBJ;
/*
*********************************************************************************************************
* HTTP CLIENT HDR FIELD DATA TYPE
*********************************************************************************************************
*/
typedef struct httpc_hdr {
HTTP_HDR_FIELD HdrField;
CPU_CHAR *ValPtr;
CPU_INT16U ValLen;
} HTTPc_HDR;
/*
*********************************************************************************************************
* HTTP CLIENT FORM DATA TYPE
*********************************************************************************************************
*/
typedef enum httpc_form_field_type {
HTTPc_FORM_FIELD_TYPE_KEY_VAL,
HTTPc_FORM_FIELD_TYPE_KEY_VAL_EXT,
HTTPc_FORM_FIELD_TYPE_FILE
} HTTPc_FORM_FIELD_TYPE;
typedef struct httpc_form_tbl_field {
HTTPc_FORM_FIELD_TYPE Type;
void *FieldObjPtr;
} HTTPc_FORM_TBL_FIELD;
/*
*********************************************************************************************************
* KEY-VALUE PAIR DATA TYPE
*********************************************************************************************************
*/
typedef struct httpc_key_val {
CPU_CHAR *KeyPtr;
CPU_INT16U KeyLen;
CPU_CHAR *ValPtr;
CPU_INT16U ValLen;
} HTTPc_KEY_VAL;
/*
*********************************************************************************************************
* BIG KEY-VALUE PAIR DATA TYPE
*********************************************************************************************************
*/
typedef struct httpc_key_val_ext HTTPc_KEY_VAL_EXT;
typedef CPU_BOOLEAN(*HTTPc_KEY_VAL_EXT_HOOK)(HTTPc_CONN_OBJ *p_conn,
HTTPc_REQ_OBJ *p_req,
HTTPc_KEY_VAL_EXT *p_key_val_obj,
CPU_CHAR *p_buf,
CPU_INT16U buf_len,
CPU_INT16U *p_len_wr);
struct httpc_key_val_ext {
CPU_CHAR *KeyPtr;
CPU_INT16U KeyLen;
HTTPc_KEY_VAL_EXT_HOOK OnValTx;
CPU_INT32U ValLen;
};
/*
*********************************************************************************************************
* HTTP MULTIPART FORM DATA TYPE
*********************************************************************************************************
*/
typedef struct http_multipart_file HTTPc_MULTIPART_FILE;
typedef CPU_BOOLEAN(*HTTPc_MULTIPART_FILE_HOOK)(HTTPc_CONN_OBJ *p_conn,
HTTPc_REQ_OBJ *p_req,
HTTPc_MULTIPART_FILE *p_file_obj,
CPU_CHAR *p_buf,
CPU_INT16U buf_len,
CPU_INT16U *p_len_wr);
struct http_multipart_file {
CPU_CHAR *NamePtr;
CPU_INT16U NameLen;
CPU_CHAR *FileNamePtr;
CPU_INT16U FileNameLen;
CPU_INT32U FileLen;
HTTP_CONTENT_TYPE ContentType;
HTTPc_MULTIPART_FILE_HOOK OnFileTx;
};
/*
*********************************************************************************************************
* HOOK & CALLBACK FUNCTIONS DATA TYPE
*********************************************************************************************************
*/
typedef void (*HTTPc_CONNECT_CALLBACK)(HTTPc_CONN_OBJ *p_conn,
CPU_BOOLEAN open_status);
typedef void (*HTTPc_CONN_CLOSE_CALLBACK)(HTTPc_CONN_OBJ *p_conn,
HTTPc_CONN_CLOSE_STATUS close_status,
HTTPc_ERR err);
typedef void (*HTTPc_CONN_ERR_CALLBACK)(HTTPc_CONN_OBJ *p_conn,
HTTPc_ERR err);
typedef CPU_BOOLEAN(*HTTPc_REQ_QUERY_STR_HOOK)(HTTPc_CONN_OBJ *p_conn,
HTTPc_REQ_OBJ *p_req,
HTTPc_KEY_VAL **p_key_val);
typedef CPU_BOOLEAN(*HTTPc_REQ_HDR_HOOK)(HTTPc_CONN_OBJ *p_conn,
HTTPc_REQ_OBJ *p_req,
HTTPc_HDR **p_hdr);
typedef CPU_BOOLEAN(*HTTPc_REQ_BODY_HOOK)(HTTPc_CONN_OBJ *p_conn,
HTTPc_REQ_OBJ *p_req,
void **p_data,
CPU_CHAR *p_buf,
CPU_INT16U buf_len,
CPU_INT16U *p_data_len);
typedef void (*HTTPc_RESP_HDR_HOOK)(HTTPc_CONN_OBJ *p_conn,
HTTPc_REQ_OBJ *p_req,
HTTP_HDR_FIELD hdr_field,
CPU_CHAR *p_hdr_val,
CPU_INT16U val_len);
typedef CPU_INT32U(*HTTPc_RESP_BODY_HOOK)(HTTPc_CONN_OBJ *p_conn,
HTTPc_REQ_OBJ *p_req,
HTTP_CONTENT_TYPE content_type,
void *p_data,
CPU_INT16U data_len,
CPU_BOOLEAN last_chunk);
typedef void (*HTTPc_COMPLETE_CALLBACK)(HTTPc_CONN_OBJ *p_conn,
HTTPc_REQ_OBJ *p_req,
HTTPc_RESP_OBJ *p_resp,
CPU_BOOLEAN status);
typedef void (*HTTPc_TRANS_ERR_CALLBACK)(HTTPc_CONN_OBJ *p_conn,
HTTPc_REQ_OBJ *p_req,
HTTPc_ERR err);
/*
*********************************************************************************************************
* HTTPc RESPONSE DATA TYPE
*********************************************************************************************************
*/
struct httpc_resp {
HTTP_PROTOCOL_VER ProtocolVer; /* HTTP version received in response message. */
HTTP_STATUS_CODE StatusCode; /* Status code received in response. */
const CPU_CHAR *ReasonPhrasePtr; /* Pointer to received reason phrase. */
HTTP_CONTENT_TYPE ContentType; /* Content type received in response. */
CPU_INT32U ContentLen; /* Content length received in response if any. */
};
/*
*********************************************************************************************************
*********************************************************************************************************
* MACROS
*********************************************************************************************************
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* STRUCT FIELD DEFINE MACRO
*********************************************************************************************************
*/
#define FIELD_DEF(prefix, type, name, suffix) prefix type name##suffix;
/*
*********************************************************************************************************
* USER DATA FIELD MACRO
*********************************************************************************************************
*/
#if (HTTPc_CFG_USER_DATA_EN == DEF_ENABLED)
#define USER_DATA_FIELD_DEF(prefix, suffix) FIELD_DEF(prefix, void, *UserDataPtr, suffix)
#else
#define USER_DATA_FIELD_DEF(prefix, suffix)
#endif
/*
*********************************************************************************************************
* REQUEST QUERY STRING FIELDS MACRO
*********************************************************************************************************
*/
#if (HTTPc_CFG_QUERY_STR_EN == DEF_ENABLED)
#define REQ_QUERY_STR_FIELDS_DEF(prefix, suffix) FIELD_DEF(prefix, HTTPc_KEY_VAL, *QueryStrTbl, suffix) \
FIELD_DEF(prefix, CPU_INT16U, QueryStrNbr, suffix) \
FIELD_DEF(prefix, HTTPc_REQ_QUERY_STR_HOOK, OnQueryStrTx, suffix)
#else
#define REQ_QUERY_STR_FIELDS_DEF(prefix, suffix)
#endif
/*
*********************************************************************************************************
* REQUEST HEADER TX FIELDS MACRO
*********************************************************************************************************
*/
#if (HTTPc_CFG_HDR_TX_EN == DEF_ENABLED)
#define REQ_HDR_TX_FIELDS_DEF(prefix, suffix) FIELD_DEF(prefix, HTTPc_HDR, *HdrTbl, suffix) \
FIELD_DEF(prefix, CPU_INT16U, HdrNbr, suffix) \
FIELD_DEF(prefix, HTTPc_REQ_HDR_HOOK, OnHdrTx, suffix)
#else
#define REQ_HDR_TX_FIELDS_DEF(prefix, suffix)
#endif
/*
*********************************************************************************************************
* REQUEST FORM FIELDS MACRO
*********************************************************************************************************
*/
#if (HTTPc_CFG_FORM_EN == DEF_ENABLED)
#define REQ_FORM_FIELDS_DEF(prefix, suffix) FIELD_DEF(prefix, HTTPc_FORM_TBL_FIELD , *FormFieldTbl, suffix) \
FIELD_DEF(prefix, CPU_INT16U, FormFieldNbr, suffix)
#else
#define REQ_FORM_FIELDS_DEF(prefix, suffix)
#endif
/*
*********************************************************************************************************
* REQUEST HDR RX HOOK FIELD MACRO
*********************************************************************************************************
*/
#if (HTTPc_CFG_HDR_RX_EN == DEF_ENABLED)
#define REQ_HDR_RX_FIELD_DEF(prefix, suffix) FIELD_DEF(prefix, HTTPc_RESP_HDR_HOOK, OnHdrRx, suffix)
#else
#define REQ_HDR_RX_FIELD_DEF(prefix, suffix)
#endif
/*
*********************************************************************************************************
* REQUEST TASK CALLBACK FIELDS MACRO
*********************************************************************************************************
*/
#ifdef HTTPc_TASK_MODULE_EN
#define REQ_TASK_CALLBACK_FIELDS_DEF(prefix, suffix) FIELD_DEF(prefix, HTTPc_COMPLETE_CALLBACK, OnTransComplete, suffix) \
FIELD_DEF(prefix, HTTPc_TRANS_ERR_CALLBACK, OnErr, suffix)
#else
#define REQ_TASK_CALLBACK_FIELDS_DEF(prefix, suffix)
#endif
/*
*********************************************************************************************************
* REQUEST STRUCTURE MACRO
*********************************************************************************************************
*/
#define STRUCT_REQ_INIT(prefix, suffix) \
FIELD_DEF(prefix, HTTPc_FLAGS, Flags, suffix) /* Request set of flags. */ \
FIELD_DEF(prefix, HTTPc_FLAGS, HdrFlags, suffix) /* Set of flags for hdr to include in Req. */ \
FIELD_DEF(prefix, HTTP_METHOD, Method, suffix) /* HTTP Request Method. */ \
FIELD_DEF(prefix, CPU_CHAR, *ResourcePathPtr, suffix) /* Pointer to URI or Resource path string. */ \
FIELD_DEF(prefix, CPU_INT16U, ResourcePathLen, suffix) /* URI or Resource path string's length. */ \
FIELD_DEF(prefix, HTTP_CONTENT_TYPE, ContentType, suffix) /* Content Type of the Request body. */ \
FIELD_DEF(prefix, CPU_INT32U, ContentLen, suffix) /* Content Length of the Request body. */ \
FIELD_DEF(prefix, void, *DataPtr, suffix) /* Pointer to data to put in Request body. */ \
REQ_QUERY_STR_FIELDS_DEF(prefix, suffix) /* Query String parameters. */ \
REQ_HDR_TX_FIELDS_DEF(prefix, suffix) /* Request Header fields parameters. */ \
REQ_FORM_FIELDS_DEF(prefix, suffix) /* Form parameters. */ \
FIELD_DEF(prefix, HTTPc_REQ_BODY_HOOK, OnBodyTx, suffix) /* Body Transfer hook parameter. */ \
REQ_HDR_RX_FIELD_DEF(prefix, suffix) /* Response Header fields parameter. */ \
FIELD_DEF(prefix, HTTPc_RESP_BODY_HOOK, OnBodyRx, suffix) /* Response body hook function. */ \
REQ_TASK_CALLBACK_FIELDS_DEF(prefix, suffix) /* Request's callback parameters. */ \
FIELD_DEF(prefix, HTTPc_CONN, *ConnPtr, suffix) /* Pointer to Connection object. */ \
FIELD_DEF(prefix, HTTPc_RESP, *RespPtr, suffix) /* Pointer to Response object. */ \
FIELD_DEF(prefix, HTTPc_REQ, *NextPtr, suffix) /* Pointer to next Request object. */ \
FIELD_DEF(prefix, HTTPc_WEBSOCK_REQ, *WebSockPtr, suffix) /* Pointer to WebSocket Request object. */ \
USER_DATA_FIELD_DEF(,) /* Pointer to user data. */
struct httpc_req_obj {
STRUCT_REQ_INIT(const, _reserved)
};
struct httpc_req {
STRUCT_REQ_INIT(,)
};
/*
*********************************************************************************************************
* SOCKET SECURE CFG FIELD MACRO
*********************************************************************************************************
*/
#ifdef NET_SECURE_MODULE_EN
#define SOCK_SECURE_CFG_FIELD_DEF(prefix, suffix) FIELD_DEF(prefix, NET_APP_SOCK_SECURE_CFG, SockSecureCfg, suffix) /* Connection's Socket Secure Cfg. */
#else
#define SOCK_SECURE_CFG_FIELD_DEF(prefix, suffix)
#endif
/*
*********************************************************************************************************
* CONNECTION CALLBACK FIELDS MACRO
*********************************************************************************************************
*/
#ifdef HTTPc_TASK_MODULE_EN
#define TASK_CONN_CALLBACK_FIELDS_DEF(prefix, suffix) FIELD_DEF(prefix, HTTPc_CONNECT_CALLBACK, OnConnect, suffix) \
FIELD_DEF(prefix, HTTPc_CONN_CLOSE_CALLBACK , OnClose, suffix)
#else
#define TASK_CONN_CALLBACK_FIELDS_DEF(prefix, suffix)
#endif
/*
*********************************************************************************************************
* CONNECTION SIGNAL FIELDS MACRO
*********************************************************************************************************
*/
#ifdef HTTPc_SIGNAL_TASK_MODULE_EN
#define TASK_CONN_SIGNAL_FIELDS_DEF(prefix, suffix) FIELD_DEF(prefix, KAL_SEM_HANDLE, ConnectSignal, suffix) \
FIELD_DEF(prefix, KAL_SEM_HANDLE , TransDoneSignal, suffix) \
FIELD_DEF(prefix, KAL_SEM_HANDLE, CloseSignal, suffix)
#else
#define TASK_CONN_SIGNAL_FIELDS_DEF(prefix, suffix)
#endif
/*
*********************************************************************************************************
* CONNENCTION QUERY STRING FIELDS MACRO
*********************************************************************************************************
*/
#if (HTTPc_CFG_QUERY_STR_EN == DEF_ENABLED)
#define CONN_QUERY_STR_FIELDS_DEF(prefix, suffix) FIELD_DEF(prefix, CPU_INT16U , ReqQueryStrTxIx, suffix) \
FIELD_DEF(prefix, HTTPc_KEY_VAL, *ReqQueryStrTempPtr, suffix)
#else
#define CONN_QUERY_STR_FIELDS_DEF(prefix, suffix)
#endif
/*
*********************************************************************************************************
* CONNECTION HEADER FIELDS MACRO
*********************************************************************************************************
*/
#if (HTTPc_CFG_HDR_TX_EN == DEF_ENABLED)
#define CONN_HDR_FIELDS_DEF(prefix, suffix) FIELD_DEF(prefix, CPU_INT16U , ReqHdrTxIx, suffix) \
FIELD_DEF(prefix, HTTPc_HDR, *ReqHdrTempPtr, suffix)
#else
#define CONN_HDR_FIELDS_DEF(prefix, suffix)
#endif
/*
*********************************************************************************************************
* CONECTION FORM FIELD MACRO
*********************************************************************************************************
*/
#if (HTTPc_CFG_FORM_EN == DEF_ENABLED)
#define CONN_FORM_FIELD_DEF(prefix, suffix) FIELD_DEF(prefix, CPU_INT16U, ReqFormDataTxIx, suffix)
#else
#define CONN_FORM_FIELD_DEF(prefix, suffix)
#endif
/*
*********************************************************************************************************
* CONNECTION STRUCTURE MACRO
*********************************************************************************************************
*/
#define STRUCT_CONN_INIT(prefix, suffix) \
FIELD_DEF(prefix, NET_SOCK_ID, SockID, suffix) /* Connection's Socket ID. */ \
FIELD_DEF(prefix, HTTPc_FLAGS, SockFlags, suffix) /* Connection's Socket flags. */ \
SOCK_SECURE_CFG_FIELD_DEF(prefix, suffix) /* Connection's Socket Secure Cfg. */ \
FIELD_DEF(prefix, CPU_INT16U, ConnectTimeout_ms, suffix) /* Connection Connect Timeout. */ \
FIELD_DEF(prefix, CPU_INT16U, InactivityTimeout_s, suffix) /* Connection Inactivity Timeout. */ \
FIELD_DEF(prefix, NET_PORT_NBR, ServerPort, suffix) /* Server Port number. */ \
FIELD_DEF(prefix, NET_SOCK_ADDR, ServerSockAddr, suffix) /* Server Socket address. */ \
FIELD_DEF(prefix, CPU_CHAR, *HostNamePtr, suffix) /* Pointer to server hostname string. */ \
FIELD_DEF(prefix, CPU_INT16U, HostNameLen, suffix) /* Server Hostname length. */ \
FIELD_DEF(prefix, HTTPc_CONN_STATE, State, suffix) /* Connection State. */ \
FIELD_DEF(prefix, HTTPc_FLAGS, Flags, suffix) /* Set of flags related to HTTP conn. */ \
FIELD_DEF(prefix, HTTPc_CONN_CLOSE_STATUS, CloseStatus, suffix) /* Status of connection closed. */ \
FIELD_DEF(prefix, HTTPc_ERR, ErrCode, suffix) /* Error code of connection. */ \
TASK_CONN_CALLBACK_FIELDS_DEF(prefix, suffix) /* Connection's Callback functions. */ \
TASK_CONN_SIGNAL_FIELDS_DEF(prefix, suffix) /* Conneciton's signals's handle. */ \
FIELD_DEF(prefix, HTTPc_REQ, *ReqListHeadPtr, suffix) /* Head of the Request list. */ \
FIELD_DEF(prefix, HTTPc_REQ, *ReqListEndPtr, suffix) /* End of the Request list. */ \
FIELD_DEF(prefix, HTTPc_FLAGS, ReqFlags, suffix) /* Req flags for internal process. */ \
CONN_QUERY_STR_FIELDS_DEF(prefix, suffix) /* QueryStr param for internal process. */ \
CONN_HDR_FIELDS_DEF(prefix, suffix) /* Header param for internal process. */ \
CONN_FORM_FIELD_DEF(prefix, suffix) /* Form param for internal process. */ \
FIELD_DEF(prefix, CPU_INT16U, ReqDataOffset, suffix) /* Offset in Req Data Ptr to Tx. */ \
FIELD_DEF(prefix, HTTPc_FLAGS, RespFlags, suffix) /* Set of flags related to the resp. */ \
FIELD_DEF(prefix, void, *TxDataPtr, suffix) /* Pointer to data to transmit. */ \
FIELD_DEF(prefix, CPU_CHAR, *BufPtr, suffix) /* Pointer to conn buffer. */ \
FIELD_DEF(prefix, CPU_INT16U, BufLen, suffix) /* Conn buffer's length. */ \
FIELD_DEF(prefix, CPU_CHAR, *RxBufPtr, suffix) /* Pointer inside Buf where to Rx data. */ \
FIELD_DEF(prefix, CPU_INT16U, RxDataLenRem, suffix) /* Remaining data to process in the rx buf.*/ \
FIELD_DEF(prefix, CPU_INT32U, RxDataLen, suffix) /* Data length received. */ \
FIELD_DEF(prefix, CPU_CHAR, *TxBufPtr, suffix) /* Pointer inside Buf where to Tx data. */ \
FIELD_DEF(prefix, CPU_INT16U, TxDataLen, suffix) /* Length of data to Tx. */ \
FIELD_DEF( , HTTPc_CONN, *NextPtr, suffix) /* Pointer to next conn in list. */ \
FIELD_DEF(prefix, HTTPc_WEBSOCK, *WebSockPtr, suffix) /* Pointer to the Websock */ \
FIELD_DEF( , CPU_BOOLEAN, IsKeepAlive, suffix) /* Configure conn to tx keep-alive probes. */ \
USER_DATA_FIELD_DEF( , ) /* Pointer to user data. */
struct httpc_conn_obj {
STRUCT_CONN_INIT(const, _reserved)
void *UserData;//增加
};
struct httpc_conn {
STRUCT_CONN_INIT(,)
void *UserData;//增加
};
/*
*********************************************************************************************************
* WEBSOCKET DATA TYPE
*********************************************************************************************************
*/
#ifdef HTTPc_WEBSOCK_MODULE_EN
/* ----------- WEBSOCK MESSAGE TYPE OPCODE ------------ */
typedef CPU_INT08U HTTPc_WEBSOCK_OPCODE;
#define HTTPc_WEBSOCK_OPCODE_CONTINUATION_FRAME 0x0
#define HTTPc_WEBSOCK_OPCODE_TXT_FRAME 0x1
#define HTTPc_WEBSOCK_OPCODE_BIN_FRAME 0x2
#define HTTPc_WEBSOCK_OPCODE_CLOSE 0x8
#define HTTPc_WEBSOCK_OPCODE_PING 0x9
#define HTTPc_WEBSOCK_OPCODE_PONG 0xA
#define HTTPc_WEBSOCK_OPCODE_NONE 0xFF /* Not defined by the RFC 6455, but for internal use. */
/* ---------------- WEBSOCK CLOSE CODE ---------------- */
typedef CPU_INT16U HTTPc_WEBSOCK_CLOSE_CODE;
#define HTTPc_WEBSOCK_CLOSE_CODE_NONE 0u /* Not defined by the RFC 6455, but for internal use. */
#define HTTPc_WEBSOCK_CLOSE_CODE_NORMAL 1000u
#define HTTPc_WEBSOCK_CLOSE_CODE_GOING_AWAY 1001u
#define HTTPc_WEBSOCK_CLOSE_CODE_PROTOCOL_ERR 1002u
#define HTTPc_WEBSOCK_CLOSE_CODE_DATA_TYPE_NOT_ALLOWED 1003u
#define HTTPc_WEBSOCK_CLOSE_CODE_DATA_TYPE_ERR 1007u
#define HTTPc_WEBSOCK_CLOSE_CODE_POLICY_VIOLATION 1008u
#define HTTPc_WEBSOCK_CLOSE_CODE_MSG_TOO_BIG 1009u
#define HTTPc_WEBSOCK_CLOSE_CODE_INVALID_EXT 1010u
#define HTTPc_WEBSOCK_CLOSE_CODE_UNEXPECTED_CONDITION 1011u
typedef enum {
HTTPc_WEBSOCK_MSG_TYPE_TXT_FRAME = HTTPc_WEBSOCK_OPCODE_TXT_FRAME,
HTTPc_WEBSOCK_MSG_TYPE_BIN_FRAME = HTTPc_WEBSOCK_OPCODE_BIN_FRAME,
HTTPc_WEBSOCK_MSG_TYPE_CLOSE = HTTPc_WEBSOCK_OPCODE_CLOSE,
HTTPc_WEBSOCK_MSG_TYPE_PING = HTTPc_WEBSOCK_OPCODE_PING,
HTTPc_WEBSOCK_MSG_TYPE_PONG = HTTPc_WEBSOCK_OPCODE_PONG,
} HTTPc_WEBSOCK_MSG_TYPE;
#endif
/*
*********************************************************************************************************
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*********************************************************************************************************
*/
void HTTPc_Init(const HTTPc_CFG *p_cfg,
const HTTP_TASK_CFG *p_task_cfg,
MEM_SEG *p_mem_seg,
HTTPc_ERR *p_err);
void HTTPc_ConnClr(HTTPc_CONN_OBJ *p_conn_obj,
HTTPc_ERR *p_err);
void HTTPc_ConnSetParam(HTTPc_CONN_OBJ *p_conn_obj,
HTTPc_PARAM_TYPE type,
void *p_param,
HTTPc_ERR *p_err);
CPU_BOOLEAN HTTPc_ConnOpen(HTTPc_CONN_OBJ *p_conn_obj,
CPU_CHAR *p_buf,
CPU_INT16U buf_len,
CPU_CHAR *p_hostname_str,
CPU_INT16U hostname_str_len,
HTTPc_FLAGS flags,
HTTPc_ERR *p_err);
void HTTPc_ConnClose(HTTPc_CONN_OBJ *p_conn_obj,
HTTPc_FLAGS flags,
HTTPc_ERR *p_err);
void HTTPc_ReqClr(HTTPc_REQ_OBJ *p_req_obj,
HTTPc_ERR *p_err);
void HTTPc_ReqSetParam(HTTPc_REQ_OBJ *p_req_obj,
HTTPc_PARAM_TYPE type,
void *p_param,
HTTPc_ERR *p_err);
CPU_BOOLEAN HTTPc_ReqSend(HTTPc_CONN_OBJ *p_conn_obj,
HTTPc_REQ_OBJ *p_req_obj,
HTTPc_RESP_OBJ *p_resp_obj,
HTTP_METHOD method,
CPU_CHAR *p_resource_path,
CPU_INT16U resource_path_len,
HTTPc_FLAGS flags,
HTTPc_ERR *p_err);
CPU_INT32U HTTPc_FormAppFmt(CPU_CHAR *p_buf,
CPU_INT16U buf_len,
HTTPc_FORM_TBL_FIELD *p_form_tbl,
CPU_INT16U form_tbl_size,
HTTPc_ERR *p_err);
CPU_INT32U HTTPc_FormMultipartFmt(CPU_CHAR *p_buf,
CPU_INT16U buf_len,
HTTPc_FORM_TBL_FIELD *p_form_tbl,
CPU_INT16U form_tbl_size,
HTTPc_ERR *p_err);
void HTTPc_FormAddKeyVal(HTTPc_FORM_TBL_FIELD *p_form_tbl,
HTTPc_KEY_VAL *p_key_val,
HTTPc_ERR *p_err);
void HTTPc_FormAddKeyValExt(HTTPc_FORM_TBL_FIELD *p_form_tbl,
HTTPc_KEY_VAL_EXT *p_key_val_ext,
HTTPc_ERR *p_err);
void HTTPc_FormAddFile(HTTPc_FORM_TBL_FIELD *p_form_tbl,
HTTPc_MULTIPART_FILE *p_file_obj,
HTTPc_ERR *p_err);
#ifdef HTTPc_WEBSOCK_MODULE_EN
void HTTPc_WebSockSetParam(HTTPc_WEBSOCK_OBJ *p_ws_obj,
HTTPc_PARAM_TYPE type,
void *p_param,
HTTPc_ERR *p_err);
void HTTPc_WebSockMsgSetParam(HTTPc_WEBSOCK_MSG_OBJ *p_msg_obj,
HTTPc_PARAM_TYPE type,
void *p_param,
HTTPc_ERR *p_err);
CPU_BOOLEAN HTTPc_WebSockUpgrade(HTTPc_CONN_OBJ *p_conn_obj,
HTTPc_REQ_OBJ *p_req_obj,
HTTPc_RESP_OBJ *p_resp_obj,
HTTPc_WEBSOCK_OBJ *p_ws_obj,
CPU_CHAR *p_resource_path,
CPU_INT16U resource_path_len,
HTTPc_FLAGS flags,
HTTPc_ERR *p_err);
CPU_BOOLEAN HTTPc_WebSockSend(HTTPc_CONN_OBJ *p_conn_obj,
HTTPc_WEBSOCK_MSG_OBJ *p_msg_obj,
HTTPc_WEBSOCK_MSG_TYPE msg_type,
CPU_CHAR *p_data,
CPU_INT32U payload_len,
HTTPc_FLAGS flags,
HTTPc_ERR *p_err);
void HTTPc_WebSockClr(HTTPc_WEBSOCK_OBJ *p_ws_obj,
HTTPc_ERR *p_err);
void HTTPc_WebSockMsgClr(HTTPc_WEBSOCK_MSG_OBJ *p_msg_obj,
HTTPc_ERR *p_err);
CPU_INT16U HTTPc_WebSockFmtCloseMsg(HTTPc_WEBSOCK_CLOSE_CODE close_code,
CPU_CHAR *p_reason,
CPU_CHAR *p_buf,
CPU_INT16U buf_len,
HTTPc_ERR *p_err);
#endif
/*
*********************************************************************************************************
*********************************************************************************************************
* MODULE END
*********************************************************************************************************
*********************************************************************************************************
*/
#endif /* HTTPc_MODULE_PRESENT */