Просмотр исходного кода

Merge branch 'feature/get_chunk_length' into 'master'

esp_http_client: Add API to get chunk length

Closes IDFGH-3319

See merge request espressif/esp-idf!9074
Mahavir Jain 5 лет назад
Родитель
Сommit
790aecfc6a

+ 24 - 0
components/esp_http_client/esp_http_client.c

@@ -52,6 +52,7 @@ typedef struct {
     esp_http_buffer_t   *buffer;        /*!< data buffer as linked list */
     int                 status_code;    /*!< status code (integer) */
     int                 content_length; /*!< data length */
+    int                 chunk_length;   /*!< chunk length */
     int                 data_offset;    /*!< offset to http data (Skip header) */
     int                 data_process;   /*!< data processed */
     int                 method;         /*!< http method */
@@ -269,6 +270,14 @@ static int http_on_chunk_complete(http_parser *parser)
     return 0;
 }
 
+static int http_on_chunk_header(http_parser *parser)
+{
+    esp_http_client_handle_t client = parser->data;
+    client->response->chunk_length = parser->content_length;
+    ESP_LOGD(TAG, "http_on_chunk_header, chunk_length");
+    return 0;
+}
+
 esp_err_t esp_http_client_set_header(esp_http_client_handle_t client, const char *key, const char *value)
 {
     return http_header_set(client->request->headers, key, value);
@@ -604,6 +613,7 @@ esp_http_client_handle_t esp_http_client_init(const esp_http_client_config_t *co
     client->parser_settings->on_body = http_on_body;
     client->parser_settings->on_message_complete = http_on_message_complete;
     client->parser_settings->on_chunk_complete = http_on_chunk_complete;
+    client->parser_settings->on_chunk_header = http_on_chunk_header;
     client->parser->data = client;
     client->event.client = client;
 
@@ -1357,3 +1367,17 @@ esp_err_t esp_http_client_get_url(esp_http_client_handle_t client, char *url, co
     }
     return ESP_FAIL;
 }
+
+esp_err_t esp_http_client_get_chunk_length(esp_http_client_handle_t client, int *len)
+{
+    if (client == NULL || len == NULL) {
+        return ESP_ERR_INVALID_ARG;
+    }
+    if (esp_http_client_is_chunked_response(client)) {
+        *len = client->response->chunk_length;
+    } else {
+        ESP_LOGE(TAG, "Response is not chunked");
+        return ESP_FAIL;
+    }
+    return ESP_OK;
+}

+ 13 - 0
components/esp_http_client/include/esp_http_client.h

@@ -525,6 +525,19 @@ int esp_http_client_read_response(esp_http_client_handle_t client, char *buffer,
 
 esp_err_t esp_http_client_get_url(esp_http_client_handle_t client, char *url, const int len);
 
+/**
+ * @brief          Get Chunk-Length from client
+ *
+ * @param[in]      client   The esp_http_client handle
+ * @param[out]     len      Variable to store length
+ *
+ * @return
+ *     - ESP_OK                 If successful, len will have length of current chunk
+ *     - ESP_FAIL               If the server is not a chunked server
+ *     - ESP_ERR_INVALID_ARG    If the client or len are NULL
+ */
+esp_err_t esp_http_client_get_chunk_length(esp_http_client_handle_t client, int *len);
+
 #ifdef __cplusplus
 }
 #endif