1 #ifndef _CORE_HTTP_H_ 2 #define _CORE_HTTP_H_ 3 4 5 #if defined(__cplusplus) 6 extern "C" { 7 #endif 8 9 #include "core_stdinc.h" 10 #include "aiot_state_api.h" 11 #include "aiot_sysdep_api.h" 12 #include "core_string.h" 13 #include "core_log.h" 14 #include "core_auth.h" 15 #include "aiot_http_api.h" 16 17 typedef enum { 18 CORE_HTTP_SM_READ_HEADER, 19 CORE_HTTP_SM_READ_BODY 20 } core_http_sm_t; 21 22 typedef struct { 23 core_http_sm_t sm; 24 uint32_t body_total_len; 25 uint32_t body_read_len; 26 } core_http_session_t; 27 28 typedef struct { 29 uint32_t code; 30 uint8_t *content; 31 uint32_t content_len; 32 uint32_t content_total_len; 33 } core_http_response_t; 34 35 typedef struct { 36 aiot_sysdep_portfile_t *sysdep; 37 void *network_handle; 38 char *host; 39 uint16_t port; 40 char *product_key; 41 char *device_name; 42 char *device_secret; 43 char *extend_devinfo; 44 uint32_t connect_timeout_ms; 45 uint32_t send_timeout_ms; 46 uint32_t recv_timeout_ms; 47 uint32_t auth_timeout_ms; 48 uint32_t deinit_timeout_ms; 49 uint32_t header_line_max_len; 50 uint32_t body_buffer_max_len; 51 aiot_sysdep_network_cred_t *cred; 52 char *token; 53 uint8_t long_connection; 54 uint8_t exec_enabled; 55 uint32_t exec_count; 56 uint8_t core_exec_enabled; 57 uint32_t core_exec_count; 58 void *data_mutex; 59 void *send_mutex; 60 void *recv_mutex; 61 core_http_session_t session; 62 aiot_http_event_handler_t event_handler; 63 aiot_http_recv_handler_t recv_handler; 64 aiot_http_recv_handler_t core_recv_handler; 65 void *userdata; 66 void *core_userdata; 67 } core_http_handle_t; 68 69 #define CORE_HTTP_MODULE_NAME "HTTP" 70 #define CORE_HTTP_DEINIT_INTERVAL_MS (100) 71 72 #define CORE_HTTP_DEFAULT_CONNECT_TIMEOUT_MS (10 * 1000) 73 #define CORE_HTTP_DEFAULT_AUTH_TIMEOUT_MS (5 * 1000) 74 #define CORE_HTTP_DEFAULT_SEND_TIMEOUT_MS (5 * 1000) 75 #define CORE_HTTP_DEFAULT_RECV_TIMEOUT_MS (5 * 1000) 76 #define CORE_HTTP_DEFAULT_HEADER_LINE_MAX_LEN (128) 77 #define CORE_HTTP_DEFAULT_BODY_MAX_LEN (128) 78 #define CORE_HTTP_DEFAULT_DEINIT_TIMEOUT_MS (2 * 1000) 79 80 typedef enum { 81 CORE_HTTPOPT_HOST, /* 数据类型: (char *), 服务器域名, 默认值: iot-as-http.cn-shanghai.aliyuncs.com */ 82 CORE_HTTPOPT_PORT, /* 数据类型: (uint16_t), 服务器端口号, 默认值: 443 */ 83 CORE_HTTPOPT_NETWORK_CRED, /* 数据类型: (aiot_sysdep_network_cred_t *), 网络安全凭证, 默认值: NULL */ 84 CORE_HTTPOPT_CONNECT_TIMEOUT_MS, /* 数据类型: (uint32_t), 建立网络连接的超时时间 */ 85 CORE_HTTPOPT_SEND_TIMEOUT_MS, /* 数据类型: (uint32_t), 网络发送超时时间(单位ms), 默认值: 5000ms */ 86 CORE_HTTPOPT_RECV_TIMEOUT_MS, /* 数据类型: (uint32_t), 网络接受超时时间(单位ms), 默认值: 5000ms */ 87 CORE_HTTPOPT_DEINIT_TIMEOUT_MS, /* 数据类型: (uint32_t), 销毁http实例时, 等地啊其他api执行完毕的时间 */ 88 CORE_HTTPOPT_HEADER_LINE_MAX_LEN, /* 数据类型: (uint32_t), http协议中单行header的最大长度 */ 89 CORE_HTTPOPT_BODY_BUFFER_MAX_LEN, /* 数据类型: (uint32_t), 每次读取的body最大长度 */ 90 CORE_HTTPOPT_EVENT_HANDLER, /* 数据类型: (aiot_http_event_handler_t), 用户事件回调函数, 默认值: NULL */ 91 /* 以上选项配置的数据与 AIOT_HTTPOPT_XXX 共用 */ 92 CORE_HTTPOPT_USERDATA, /* 数据类型: (void *), 用户上下文数据指针, 默认值: NULL */ 93 CORE_HTTPOPT_RECV_HANDLER, /* 数据类型: (aiot_http_event_handler_t), 用户数据接受回调函数, 默认值: NULL */ 94 CORE_HTTPOPT_MAX 95 } core_http_option_t; 96 97 typedef struct { 98 char *method; /* HTTP请求方法, 可为"POST", "GET"等 */ 99 char *path; /* HTTP请求的路径 */ 100 char *header; /* HTTP请求的头部, 必须以单个\r\n结尾, 无需包含Content-Length */ 101 uint8_t *content; /* 指向用户待发送Content的指针 */ 102 uint32_t content_len; /* 用户待发送Content的长度 */ 103 } core_http_request_t; 104 105 /** 106 * @brief 初始化一个HTTP实例, 并返回实例句柄 107 * 108 * @return void* 109 * @retval NotNull core HTTP句柄 110 * @retval Null 初始化HTTP实例失败 111 */ 112 void *core_http_init(void); 113 114 /** 115 * @brief 设置HTTP实例选项 116 * 117 * @param[in] handle HTTP句柄 118 * @param option 配置选项, 可查看枚举类型 @ref core_http_option_t 119 * @param[in] data 配置数据, 每个选项对应的数据类型可查看 @ref core_http_option_t 120 * @return int32_t 121 * @retval STATE_SUCCESS, 成功 122 * @retval STATE_HTTP_HANDLE_IS_NULL, HTTP句柄为NULL 123 * @retval STATE_USER_INPUT_OUT_RANGE, 用户输入参数无效 124 * @retval STATE_SYS_DEPEND_MALLOC_FAILED, 内存分配失败 125 * 126 */ 127 int32_t core_http_setopt(void *handle, core_http_option_t option, void *data); 128 129 /** 130 * @brief 建立网络连接 131 * 132 * @param handle HTTP句柄 133 * @return int32_t 134 * @retval STATE_SUCCESS 网络连接建立成功 135 * @retval <STATE_SUCCESS 网络连接建立失败 136 */ 137 int32_t core_http_connect(void *handle); 138 139 /** 140 * @brief 发送HTTP请求 141 * 142 * @param[in] handle HTTP句柄 143 * @param request 请求结构体, 查看 @ref core_http_request_t 144 * @return int32_t 145 * @retval > 0, 已发送的数据长度 146 * @retval STATE_HTTP_HANDLE_IS_NULL, HTTP句柄为NULL 147 * @retval STATE_USER_INPUT_NULL_POINTER, 用户输入参数为NULL 148 * @retval STATE_USER_INPUT_MISSING_HOST, 用户未配置Host 149 * @retval STATE_SYS_DEPEND_MALLOC_FAILED, 内存分配失败 150 * @retval STATE_SYS_DEPEND_NWK_EST_FAILED, 网络建立连接失败 151 * @retval STATE_SYS_DEPEND_NWK_CLOSED, 网络连接已关闭 152 * @retval STATE_SYS_DEPEND_NWK_WRITE_LESSDATA, 网络发送超时 153 */ 154 int32_t core_http_send(void *handle, const core_http_request_t *request); 155 156 /** 157 * @brief 接受HTTP应答数据, 内部将解析状态码和Header并通过回调函数通知用户, 若应答中有body则保存到用户缓冲区中 158 * 159 * @param[in] handle HTTP句柄 160 * @param buffer 指向存放接受 161 * @param buffer_len 162 * @return int32_t 163 * @retval >= 0, 接受到的HTTP body数据长度 164 * @retval STATE_HTTP_HANDLE_IS_NULL, HTTP句柄为NULL 165 * @retval STATE_USER_INPUT_NULL_POINTER, 用户输入参数为NULL 166 * @retval STATE_USER_INPUT_OUT_RANGE, buffer_len为0 167 * @retval STATE_SYS_DEPEND_NWK_CLOSED, 网络连接已关闭 168 * @retval STATE_SYS_DEPEND_NWK_READ_OVERTIME, 网络接收超时 169 * @retval STATE_HTTP_RECV_LINE_TOO_LONG, HTTP单行数据过长, 内部无法解析 170 * @retval STATE_HTTP_PARSE_STATUS_LINE_FAILED, 无法解析状态码 171 * @retval STATE_HTTP_GET_CONTENT_LEN_FAILED, 获取Content-Length失败 172 * 173 */ 174 int32_t core_http_recv(void *handle); 175 176 /** 177 * @brief 销毁参数p_handle所指定的HTTP实例 178 * 179 * @param[in] p_handle 指向HTTP句柄的指针 180 * @return int32_t 181 * @retval STATE_SUCCESS 成功 182 * @retval STATE_USER_INPUT_NULL_POINTER 参数p_handle为NULL或者p_handle指向的句柄为NULL 183 */ 184 int32_t core_http_deinit(void **p_handle); 185 186 #if defined(__cplusplus) 187 } 188 #endif 189 190 #endif /* #ifndef _CORE_HTTP_H_ */ 191 192