/* * Copyright (C) 2015-2017 Alibaba Group Holding Limited */ #ifndef _UTILS_HTTPC_H_ #define _UTILS_HTTPC_H_ #include "iot_export_errno.h" #include "utils_net.h" #if (CONFIG_TFM_FWU) #include "psa/update.h" #endif #ifdef __cplusplus extern "C" { #endif /** * @addtogroup HttpClient * @{ * HttpClient API implements the client-side of HTTP/1.1. It provides base interfaces to execute an HTTP request on a given URL. It also supports HTTPS (HTTP over TLS) to provide secure communication.\n * @section HttpClient_Usage_Chapter How to use this module * In this release, MediaTek provides two types of APIs: high level APIs and low level APIs.\n * - \b The \b high \b level \b APIs * - Enables to execute a single HTTP request on a given URL. * - Call #httpclient_get(), #httpclient_post(), #httpclient_put() or #httpclient_delete() to get, post, put or delete and HTTP request.\n * - \b The \b low \b level \b APIs * - Enables to execute more than one HTTP requests during a Keep-Alive connection. Keep-alive is the idea of using a single TCP connection to send and receive multiple HTTP requests/responses, as opposed to opening a new connection for every single request/response pair. * - Step1: Call #httpclient_connect() to connect to a remote server. * - Step2: Call #httpclient_send_request() to send an HTTP request to the server. * - Step3: Call #httpclient_recv_response() to receive an HTTP response from the server. * - Step4: Repeat Steps 2 and 3 to execute more requests. * - Step5: Call #httpclient_close() to close the connection. * - Sample code: Please refer to the example under /project/mt7687_hdk/apps/http_client/http_client_keepalive folder. */ /** @defgroup httpclient_define Define * @{ */ /** @brief This macro defines the HTTP port. */ #define HTTP_PORT 80 /** @brief This macro defines the HTTPS port. */ #define HTTPS_PORT 443 /** @brief This macro defines the status of the download. */ #if CONFIG_OTA_EVADE_METHOD #define DOWNLOAD_STATUS_POS (12) #define DOWNLOAD_START_FLAG (0xFE) #define DOWNLOAD_SUCCESS_FLAG (0xFC) #endif /** * @} */ /** @defgroup httpclient_enum Enum * @{ */ /** @brief This enumeration defines the HTTP request type. */ typedef enum { HTTPCLIENT_GET, HTTPCLIENT_POST, HTTPCLIENT_PUT, HTTPCLIENT_DELETE, HTTPCLIENT_HEAD } HTTPCLIENT_REQUEST_TYPE; #define HTTP_RESP_CONTENT_LEN (256) /** @defgroup httpclient_struct Struct * @{ */ /** @brief This structure defines the httpclient_t structure. */ typedef struct { //intptr_t handle; /**< handle of TCP connection or SSL connection. */ int remote_port; /**< HTTP or HTTPS port. */ utils_network_t net; int response_code; /**< Response code. */ char *header; /**< Custom header. */ char *auth_user; /**< Username for basic authentication. */ char *auth_password; /**< Password for basic authentication. */ } httpclient_t; /** @brief This structure defines the HTTP data structure. */ typedef struct { bool is_more; /**< Indicates if more data needs to be retrieved. */ bool is_chunked; /**< Response data is encoded in portions/chunks.*/ int retrieve_len; /**< Content length to be retrieved. */ uint32_t response_content_len; /**< Response content length. */ uint32_t post_buf_len; /**< Post data length. */ uint32_t response_buf_len; /**< Response buffer length. */ char *post_content_type; /**< Content type of the post data. */ char *post_buf; /**< User data to be posted. */ char *response_buf; /**< Buffer to store the response data. */ } httpclient_data_t; /** * @brief This function executes a POST request on a given URL. It blocks until completion. * @param[in] client is a pointer to the #httpclient_t. * @param[in] url is the URL to run the request. * @param[in] port is #HTTP_PORT or #HTTPS_PORT. * @param[in, out] client_data is a pointer to the #httpclient_data_t instance to collect the data returned by the request. It also contains the data to be posted. * @return Please refer to #HTTPCLIENT_RESULT. * @par HttpClient Post Example * @code * char *url = "https://api.mediatek.com/mcs/v2/devices/D0n2yhrl/datapoints.csv"; * char *header = "deviceKey:FZoo0S07CpwUHcrt\r\n"; * char *content_type = "text/csv"; * char *post_data = "1,,I am string!"; * httpclient_t client = {0}; * httpclient_data_t client_data = {0}; * char *buf = NULL; * buf = pvPortMalloc(BUF_SIZE); * if (buf == NULL) { * printf("Malloc failed.\r\n"); * return; * } * memset(buf, 0, sizeof(buf)); * client_data.response_buf = buf; //Sets a buffer to store the result. * client_data.response_buf_len = BUF_SIZE; //Sets the buffer size. * httpclient_set_custom_header(&client, header); //Sets the custom header if needed. * client_data.post_buf = post_data; //Sets the user data to be posted. * client_data.post_buf_len = strlen(post_data); //Sets the post data length. * client_data.post_content_type = content_type; //Sets the content type. * httpclient_post(&client, url, HTTPS_PORT, &client_data); * printf("Data received: %s\r\n", client_data.response_buf); * @endcode */ int http_post( httpclient_t *client, const char *url, int port, const char *ca_crt, uint32_t timeout, httpclient_data_t *client_data); extern int httpclient_common(httpclient_t *client, const char *url, int port, const char *ca_crt, int method, uint32_t timeout_ms, httpclient_data_t *client_data); void ble_sleep_cb(uint8_t is_sleeping, uint32_t slp_period); #ifdef CONFIG_HTTP_OTA_WITH_BLE typedef void (*ble_sleep_state_cb)(uint8_t is_sleeping, uint32_t slp_period); extern void bk_ble_register_sleep_state_callback(ble_sleep_state_cb cb); #endif #if CONFIG_UVC_OTA_DEMO typedef void (*http_data_process_callback_func)(char *buf, UINT32 len, uint32_t recived, uint32_t total); extern void http_data_process_register_callback(http_data_process_callback_func cb); #endif void http_flash_init(void); void http_flash_deinit(void); void http_flash_wr(UINT8 *src, unsigned len); void http_wr_to_flash(char *page, UINT32 len); #if (CONFIG_TFM_FWU) void bk_ota_set_flag(uint32_t flag); uint32_t bk_ota_get_flag(void); void bk_ota_clear_flag(void); void security_ota_init(void); int security_ota_deinit(void); int http_data_process(char *buf, UINT32 len, UINT32 recived, UINT32 total); #endif #ifdef __cplusplus } #endif #endif /* __HTTPCLIENT_H__ */