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