luat_http.h 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. #ifndef LUAT_HTTP_H
  2. #define LUAT_HTTP_H
  3. #include "luat_network_adapter.h"
  4. #ifdef __LUATOS__
  5. #include "luat_zbuff.h"
  6. #else
  7. typedef enum {
  8. LUAT_HEAP_AUTO_DUMMY,
  9. LUAT_HEAP_SRAM_DUMMY,
  10. LUAT_HEAP_PSRAM_DUMMY,
  11. } LUAT_HEAP_TYPE;//只是为了占位,不要使用
  12. typedef struct luat_zbuff {
  13. LUAT_HEAP_TYPE type; //内存类型
  14. uint8_t* addr; //数据存储的地址
  15. size_t len; //实际分配空间的长度
  16. union {
  17. size_t cursor; //目前的指针位置,表明了处理了多少数据
  18. size_t used; //已经保存的数据量,表明了存了多少数据
  19. };
  20. uint32_t width; //宽度
  21. uint32_t height;//高度
  22. uint8_t bit; //色深度
  23. } luat_zbuff_t;
  24. #endif
  25. #if defined(AIR101) || defined(AIR103)
  26. // #define HTTP_REQ_HEADER_MAX_SIZE (2048)
  27. #define HTTP_RESP_BUFF_SIZE (2048)
  28. #else
  29. // #define HTTP_REQ_HEADER_MAX_SIZE (8192)
  30. #define HTTP_RESP_BUFF_SIZE (8192)
  31. #endif
  32. #define HTTP_HEADER_BASE_SIZE (1024)
  33. #include "http_parser.h"
  34. #define HTTP_CALLBACK (1)
  35. // #define HTTP_RE_REQUEST_MAX (3)
  36. #define HTTP_TIMEOUT (5*60*1000) // 10分钟
  37. /**
  38. * @defgroup luatos_HTTP HTTP(S)相关接口
  39. * @{
  40. */
  41. enum{
  42. HTTP_STATE_IDLE,
  43. HTTP_STATE_CONNECT,
  44. HTTP_STATE_SEND_HEAD,
  45. HTTP_STATE_SEND_BODY_START,
  46. HTTP_STATE_SEND_BODY,
  47. HTTP_STATE_GET_HEAD,
  48. HTTP_STATE_GET_HEAD_DONE,
  49. HTTP_STATE_GET_BODY,
  50. HTTP_STATE_GET_BODY_DONE,
  51. HTTP_STATE_DONE,
  52. HTTP_STATE_WAIT_CLOSE,
  53. };
  54. enum{
  55. HTTP_OK = 0,
  56. HTTP_ERROR_STATE = -1,
  57. HTTP_ERROR_HEADER = -2,
  58. HTTP_ERROR_BODY = -3,
  59. HTTP_ERROR_CONNECT = -4,
  60. HTTP_ERROR_CLOSE = -5,
  61. HTTP_ERROR_RX = -6,
  62. HTTP_ERROR_DOWNLOAD = -7,
  63. HTTP_ERROR_TIMEOUT = -8,
  64. HTTP_ERROR_FOTA = -9,
  65. };
  66. /*
  67. * http运行过程的回调函数
  68. * status >=0 表示运行状态,看HTTP_STATE_XXX <0说明出错停止了,==0表示结束了
  69. * data 在获取响应阶段,会回调head数据,如果为NULL,则head接收完成了。如果设置了data_mode,body数据也直接回调。
  70. * data_len 数据长度,head接收时,每行会多加一个\0,方便字符串处理
  71. * user_param 用户自己的参数
  72. */
  73. typedef void (*luat_http_cb)(int status, void *data, uint32_t data_len, void *user_param);
  74. #define HTTP_GET_DATA (2)
  75. #define HTTP_POST_DATA (1)
  76. typedef struct{
  77. network_ctrl_t *netc; // http netc
  78. http_parser parser; //解析相关
  79. char *host; /**< http host,需要释放 */
  80. char* request_line; /**< 需要释放,http请求的首行数据*/
  81. uint16_t remote_port; /**< 远程端口号 */
  82. uint8_t is_tls; // 是否SSL
  83. uint8_t custom_host; /**< 是否自定义Host了*/
  84. uint8_t is_post;
  85. uint8_t re_request_count;
  86. void* timeout_timer; /**< timeout_timer 定时器*/
  87. uint32_t timeout;
  88. uint32_t tx_offset;
  89. // 发送相关
  90. char *req_header;
  91. char *req_body; //发送body
  92. size_t req_body_len; //发送body长度
  93. char *req_auth;
  94. void* http_cb; /**< http 回调函数 */
  95. void* http_cb_userdata; /**< http 回调函数用户传参*/
  96. uint8_t is_pause;
  97. uint8_t debug_onoff;
  98. uint8_t headers_complete;
  99. uint8_t close_state;
  100. char resp_buff[HTTP_RESP_BUFF_SIZE];
  101. size_t resp_buff_offset;
  102. size_t resp_headers_done;
  103. uint32_t body_len; //body缓存长度
  104. #ifdef LUAT_USE_FOTA
  105. //OTA相关
  106. uint8_t isfota; //是否为ota下载
  107. uint32_t address;
  108. uint32_t length;
  109. luat_spi_device_t* spi_device;
  110. #endif
  111. //下载相关
  112. uint8_t is_download; //是否下载
  113. char *dst; //下载路径
  114. // http_parser_settings parser_settings;
  115. char* headers;
  116. uint32_t headers_len; //headers缓存长度
  117. char* body;
  118. // 响应相关
  119. int32_t resp_content_len; //content 长度
  120. FILE* fd; //下载 FILE
  121. luat_ip_addr_t ip_addr; // http ip
  122. uint64_t idp;
  123. luat_zbuff_t *zbuff_body;
  124. Buffer_Struct request_head_buffer; /**<存放用户自定义的请求head数据*/
  125. Buffer_Struct response_head_buffer; /**<接收到的head数据缓存,回调给客户后就销毁了*/
  126. int error_code;
  127. uint32_t offset;
  128. uint32_t context_len;
  129. uint8_t retry_cnt_max; /**<最大重试次数*/
  130. uint8_t state;
  131. uint8_t data_mode;
  132. uint8_t new_data;
  133. uint8_t context_len_vaild;
  134. uint8_t luatos_mode;
  135. }luat_http_ctrl_t;
  136. //下面2个API是luatos内部使用,csdk不使用
  137. int luat_http_client_init(luat_http_ctrl_t* http, int ipv6);
  138. int luat_http_client_start_luatos(luat_http_ctrl_t* http);
  139. /**
  140. * @brief 创建一个http客户端
  141. *
  142. * @param cb http运行过程回调函数
  143. * @param user_param 回调时用户自己的参数
  144. * @param adapter_index 网卡适配器,不清楚的写-1,系统自动分配
  145. * @return 成功返回客户端地址,失败返回NULL
  146. */
  147. luat_http_ctrl_t* luat_http_client_create(luat_http_cb cb, void *user_param, int adapter_index);
  148. /**
  149. * @brief http客户端的通用配置,创建客户端时已经有默认配置,可以不配置
  150. *
  151. * @param http_ctrl 客户端
  152. * @param timeout 单次数据传输超时时间,单位ms
  153. * @param debug_onoff 是否开启调试打印,开启后会占用一点系统资源
  154. * @param retry_cnt 因传输异常而重传的最大次数
  155. * @return 成功返回0,其他值失败
  156. */
  157. int luat_http_client_base_config(luat_http_ctrl_t* http_ctrl, uint32_t timeout, uint8_t debug_onoff, uint8_t retry_cnt);
  158. /**
  159. * @brief 客户端SSL配置,只有访问https才需要配置
  160. *
  161. * @param http_ctrl 客户端
  162. * @param mode <0 关闭SSL功能,并忽略后续参数; 0忽略证书验证过程,大部分https应用就可以这个配置,后续证书配置可以都写NULL和0; 2强制证书验证,后续证书相关参数必须写对
  163. * @param server_cert 服务器证书字符串,结尾必须有0,如果不忽略证书验证,这个必须有
  164. * @param server_cert_len 服务器证书数据长度,长度包含结尾的0,也就是strlen(server_cert) + 1
  165. * @param client_cert 客户端证书字符串,结尾必须有0,双向认证才有,一般金融行业可能会用
  166. * @param client_cert_len 客户端证书数据长度,长度包含结尾的0
  167. * @param client_cert_key 客户端证书私钥字符串,结尾必须有0,双向认证才有,一般金融行业可能会用
  168. * @param client_cert_key_len 客户端证书私钥数据长度,长度包含结尾的0
  169. * @param client_cert_key_password 客户端证书私钥密码字符串,结尾必须有0,双向认证才有,如果私钥没有密码保护,则不需要
  170. * @param client_cert_key_password_len 客户端证书私钥密码数据长度,长度包含结尾的0
  171. * @return 成功返回0,其他值失败
  172. */
  173. int luat_http_client_ssl_config(luat_http_ctrl_t* http_ctrl, int mode, const char *server_cert, uint32_t server_cert_len,
  174. const char *client_cert, uint32_t client_cert_len,
  175. const char *client_cert_key, uint32_t client_cert_key_len,
  176. const char *client_cert_key_password, uint32_t client_cert_key_password_len);
  177. /**
  178. * @brief 清空用户设置的POST数据和request head参数
  179. *
  180. * @param http_ctrl 客户端
  181. * @return 成功返回0,其他值失败
  182. */
  183. int luat_http_client_clear(luat_http_ctrl_t *http_ctrl);
  184. /**
  185. * @brief 设置一条用户的request head参数,Content-Length一般不需要,在设置POST的body时自动生成
  186. *
  187. * @param http_ctrl 客户端
  188. * @param name head参数的name
  189. * @param value head参数的value
  190. * @return 成功返回0,其他值失败
  191. */
  192. int luat_http_client_set_user_head(luat_http_ctrl_t *http_ctrl, const char *name, const char *value);
  193. /**
  194. * @brief 启动一个http请求
  195. *
  196. * @param http_ctrl 客户端
  197. * @param url http请求完整的url,如果有转义字符需要提前转义好
  198. * @param type 请求类型,0 get 1 post 2 put 3 delete
  199. * @param ipv6 是否存在IPV6的服务器
  200. * @param data_mode 大数据模式,接收数据超过1KB的时候,必须开启。开启后请求头里自动加入"Accept: application/octet-stream\r\n"
  201. * @return 成功返回0,其他值失败
  202. */
  203. int luat_http_client_start(luat_http_ctrl_t *http_ctrl, const char *url, uint8_t type, uint8_t ipv6, uint8_t continue_mode);
  204. /**
  205. * @brief 停止当前的http请求,调用后不再有http回调了
  206. *
  207. * @param http_ctrl 客户端
  208. * @return 成功返回0,其他值失败
  209. */
  210. int luat_http_client_close(luat_http_ctrl_t *http_ctrl);
  211. /**
  212. * @brief 完全释放掉当前的http客户端
  213. *
  214. * @param p_http_ctrl 客户端指针的地址
  215. * @return 成功返回0,其他值失败
  216. */
  217. int luat_http_client_destroy(luat_http_ctrl_t **p_http_ctrl);
  218. /**
  219. * @brief POST请求时发送body数据,如果数据量比较大,可以在HTTP_STATE_SEND_BODY回调里分次发送
  220. *
  221. * @param http_ctrl 客户端
  222. * @param data body数据
  223. * @param len body数据长度
  224. * @return 成功返回0,其他值失败
  225. */
  226. int luat_http_client_post_body(luat_http_ctrl_t *http_ctrl, void *data, uint32_t len);
  227. /**
  228. * @brief http获取状态码
  229. *
  230. * @param http_ctrl 客户端
  231. * @return 状态码
  232. */
  233. int luat_http_client_get_status_code(luat_http_ctrl_t *http_ctrl);
  234. /**
  235. * @brief http客户端设置暂停
  236. *
  237. * @param http_ctrl 客户端
  238. * @param is_pause 是否暂停
  239. * @return 成功返回0,其他值失败
  240. */
  241. int luat_http_client_pause(luat_http_ctrl_t *http_ctrl, uint8_t is_pause);
  242. /**
  243. * @brief GET请求时要求服务器从offset位置开始传输数据,谨慎使用
  244. *
  245. * @param http_ctrl 客户端
  246. * @param offset 偏移位置
  247. * @return 成功返回0,其他值失败
  248. */
  249. int luat_http_client_set_get_offset(luat_http_ctrl_t *http_ctrl, uint32_t offset);
  250. /**
  251. * @brief 获取context length
  252. *
  253. * @param http_ctrl 客户端
  254. * @param len context length值
  255. * @return 成功返回0,其他值失败或者是chunk编码
  256. */
  257. int luat_http_client_get_context_len(luat_http_ctrl_t *http_ctrl, uint32_t *len);
  258. /** @}*/
  259. #endif