esp_http_client: fixed http chunked encoding packet loss & add check data before read for ssl transport (backport v3.1)
This commit is contained in:
parent
eaa48f380a
commit
b2901d7e2f
2 changed files with 26 additions and 15 deletions
|
@ -33,12 +33,17 @@
|
||||||
|
|
||||||
static const char *TAG = "HTTP_CLIENT";
|
static const char *TAG = "HTTP_CLIENT";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HTTP Buffer
|
||||||
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char *data;
|
char *data; /*!< The HTTP data received from the server */
|
||||||
int len;
|
int len; /*!< The HTTP data len received from the server */
|
||||||
char *raw_data;
|
char *raw_data; /*!< The HTTP data after decoding */
|
||||||
int raw_len;
|
int raw_len; /*!< The HTTP data len after decoding */
|
||||||
|
char *output_ptr; /*!< The destination address of the data to be copied to after decoding */
|
||||||
} esp_http_buffer_t;
|
} esp_http_buffer_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* private HTTP Data structure
|
* private HTTP Data structure
|
||||||
*/
|
*/
|
||||||
|
@ -232,9 +237,14 @@ static int http_on_body(http_parser *parser, const char *at, size_t length)
|
||||||
{
|
{
|
||||||
esp_http_client_t *client = parser->data;
|
esp_http_client_t *client = parser->data;
|
||||||
ESP_LOGD(TAG, "http_on_body %d", length);
|
ESP_LOGD(TAG, "http_on_body %d", length);
|
||||||
client->response->buffer->raw_data = (char*)at;
|
client->response->buffer->raw_data = (char *)at;
|
||||||
client->response->buffer->raw_len = length;
|
if (client->response->buffer->output_ptr) {
|
||||||
|
memcpy(client->response->buffer->output_ptr, (char *)at, length);
|
||||||
|
client->response->buffer->output_ptr += length;
|
||||||
|
}
|
||||||
|
|
||||||
client->response->data_process += length;
|
client->response->data_process += length;
|
||||||
|
client->response->buffer->raw_len += length;
|
||||||
http_dispatch_event(client, HTTP_EVENT_ON_DATA, (void *)at, length);
|
http_dispatch_event(client, HTTP_EVENT_ON_DATA, (void *)at, length);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -738,14 +748,13 @@ int esp_http_client_read(esp_http_client_handle_t client, char *buffer, int len)
|
||||||
if (rlen <= 0) {
|
if (rlen <= 0) {
|
||||||
return ridx;
|
return ridx;
|
||||||
}
|
}
|
||||||
|
res_buffer->output_ptr = buffer + ridx;
|
||||||
http_parser_execute(client->parser, client->parser_settings, res_buffer->data, rlen);
|
http_parser_execute(client->parser, client->parser_settings, res_buffer->data, rlen);
|
||||||
|
ridx += res_buffer->raw_len;
|
||||||
|
need_read -= res_buffer->raw_len;
|
||||||
|
|
||||||
if (res_buffer->raw_len) {
|
|
||||||
memcpy(buffer + ridx, res_buffer->raw_data, res_buffer->raw_len);
|
|
||||||
ridx += res_buffer->raw_len;
|
|
||||||
need_read -= res_buffer->raw_len;
|
|
||||||
}
|
|
||||||
res_buffer->raw_len = 0; //clear
|
res_buffer->raw_len = 0; //clear
|
||||||
|
res_buffer->output_ptr = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ridx;
|
return ridx;
|
||||||
|
|
|
@ -206,12 +206,14 @@ static int ssl_write(transport_handle_t t, const char *buffer, int len, int time
|
||||||
|
|
||||||
static int ssl_read(transport_handle_t t, char *buffer, int len, int timeout_ms)
|
static int ssl_read(transport_handle_t t, char *buffer, int len, int timeout_ms)
|
||||||
{
|
{
|
||||||
int ret;
|
int poll = -1, ret;
|
||||||
transport_ssl_t *ssl = transport_get_context_data(t);
|
transport_ssl_t *ssl = transport_get_context_data(t);
|
||||||
ret = mbedtls_ssl_read(&ssl->ctx, (unsigned char *)buffer, len);
|
if (mbedtls_ssl_get_bytes_avail(&ssl->ctx) <= 0) {
|
||||||
if (ret == 0) {
|
if ((poll = transport_poll_read(t, timeout_ms)) <= 0) {
|
||||||
return -1;
|
return poll;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
ret = mbedtls_ssl_read(&ssl->ctx, (unsigned char *)buffer, len);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue