Skip to content

Commit 790aecf

Browse files
committed
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
2 parents 55b319e + de5ee9c commit 790aecf

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

components/esp_http_client/esp_http_client.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ typedef struct {
5252
esp_http_buffer_t *buffer; /*!< data buffer as linked list */
5353
int status_code; /*!< status code (integer) */
5454
int content_length; /*!< data length */
55+
int chunk_length; /*!< chunk length */
5556
int data_offset; /*!< offset to http data (Skip header) */
5657
int data_process; /*!< data processed */
5758
int method; /*!< http method */
@@ -269,6 +270,14 @@ static int http_on_chunk_complete(http_parser *parser)
269270
return 0;
270271
}
271272

273+
static int http_on_chunk_header(http_parser *parser)
274+
{
275+
esp_http_client_handle_t client = parser->data;
276+
client->response->chunk_length = parser->content_length;
277+
ESP_LOGD(TAG, "http_on_chunk_header, chunk_length");
278+
return 0;
279+
}
280+
272281
esp_err_t esp_http_client_set_header(esp_http_client_handle_t client, const char *key, const char *value)
273282
{
274283
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
604613
client->parser_settings->on_body = http_on_body;
605614
client->parser_settings->on_message_complete = http_on_message_complete;
606615
client->parser_settings->on_chunk_complete = http_on_chunk_complete;
616+
client->parser_settings->on_chunk_header = http_on_chunk_header;
607617
client->parser->data = client;
608618
client->event.client = client;
609619

@@ -1357,3 +1367,17 @@ esp_err_t esp_http_client_get_url(esp_http_client_handle_t client, char *url, co
13571367
}
13581368
return ESP_FAIL;
13591369
}
1370+
1371+
esp_err_t esp_http_client_get_chunk_length(esp_http_client_handle_t client, int *len)
1372+
{
1373+
if (client == NULL || len == NULL) {
1374+
return ESP_ERR_INVALID_ARG;
1375+
}
1376+
if (esp_http_client_is_chunked_response(client)) {
1377+
*len = client->response->chunk_length;
1378+
} else {
1379+
ESP_LOGE(TAG, "Response is not chunked");
1380+
return ESP_FAIL;
1381+
}
1382+
return ESP_OK;
1383+
}

components/esp_http_client/include/esp_http_client.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,19 @@ int esp_http_client_read_response(esp_http_client_handle_t client, char *buffer,
525525

526526
esp_err_t esp_http_client_get_url(esp_http_client_handle_t client, char *url, const int len);
527527

528+
/**
529+
* @brief Get Chunk-Length from client
530+
*
531+
* @param[in] client The esp_http_client handle
532+
* @param[out] len Variable to store length
533+
*
534+
* @return
535+
* - ESP_OK If successful, len will have length of current chunk
536+
* - ESP_FAIL If the server is not a chunked server
537+
* - ESP_ERR_INVALID_ARG If the client or len are NULL
538+
*/
539+
esp_err_t esp_http_client_get_chunk_length(esp_http_client_handle_t client, int *len);
540+
528541
#ifdef __cplusplus
529542
}
530543
#endif

0 commit comments

Comments
 (0)