Skip to content

Commit

Permalink
esp_http_client: fix truncated headers
Browse files Browse the repository at this point in the history
Signed-off-by: yuanjm <[email protected]>

Merges #6370
  • Loading branch information
Clickau authored and espressif-bot committed Jul 27, 2021
1 parent f69d7ca commit 4b07e33
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 13 deletions.
41 changes: 28 additions & 13 deletions components/esp_http_client/esp_http_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,19 @@ static int http_on_status(http_parser *parser, const char *at, size_t length)
static int http_on_header_field(http_parser *parser, const char *at, size_t length)
{
esp_http_client_t *client = parser->data;
http_utils_assign_string(&client->current_header_key, at, length);

if (client->current_header_key != NULL && client->current_header_value != NULL) {
ESP_LOGD(TAG, "HEADER=%s:%s", client->current_header_key, client->current_header_value);
client->event.header_key = client->current_header_key;
client->event.header_value = client->current_header_value;
http_dispatch_event(client, HTTP_EVENT_ON_HEADER, NULL, 0);
free(client->current_header_key);
free(client->current_header_value);
client->current_header_key = NULL;
client->current_header_value = NULL;
}

http_utils_append_string(&client->current_header_key, at, length);

return 0;
}
Expand All @@ -210,29 +222,32 @@ static int http_on_header_value(http_parser *parser, const char *at, size_t leng
return 0;
}
if (strcasecmp(client->current_header_key, "Location") == 0) {
http_utils_assign_string(&client->location, at, length);
http_utils_append_string(&client->location, at, length);
} else if (strcasecmp(client->current_header_key, "Transfer-Encoding") == 0
&& memcmp(at, "chunked", length) == 0) {
client->response->is_chunked = true;
} else if (strcasecmp(client->current_header_key, "WWW-Authenticate") == 0) {
http_utils_assign_string(&client->auth_header, at, length);
http_utils_append_string(&client->auth_header, at, length);
}
http_utils_assign_string(&client->current_header_value, at, length);

ESP_LOGD(TAG, "HEADER=%s:%s", client->current_header_key, client->current_header_value);
client->event.header_key = client->current_header_key;
client->event.header_value = client->current_header_value;
http_dispatch_event(client, HTTP_EVENT_ON_HEADER, NULL, 0);
free(client->current_header_key);
free(client->current_header_value);
client->current_header_key = NULL;
client->current_header_value = NULL;
http_utils_append_string(&client->current_header_value, at, length);
return 0;
}

static int http_on_headers_complete(http_parser *parser)
{
esp_http_client_handle_t client = parser->data;

if (client->current_header_key != NULL && client->current_header_value != NULL) {
ESP_LOGD(TAG, "HEADER=%s:%s", client->current_header_key, client->current_header_value);
client->event.header_key = client->current_header_key;
client->event.header_value = client->current_header_value;
http_dispatch_event(client, HTTP_EVENT_ON_HEADER, NULL, 0);
free(client->current_header_key);
free(client->current_header_value);
client->current_header_key = NULL;
client->current_header_value = NULL;
}

client->response->status_code = parser->status_code;
client->response->data_offset = parser->nread;
client->response->content_length = parser->content_length;
Expand Down
24 changes: 24 additions & 0 deletions components/esp_http_client/lib/http_utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,30 @@ char *http_utils_assign_string(char **str, const char *new_str, int len)
return old_str;
}

char *http_utils_append_string(char **str, const char *new_str, int len)
{
if (new_str == NULL) {
return NULL;
}
char *old_str = *str;
if (len <= 0) {
len = strlen(new_str);
}
if (old_str) {
int old_len = strlen(old_str);
old_str = realloc(old_str, old_len + len + 1);
mem_check(old_str);
memcpy(old_str + old_len, new_str, len);
old_str[old_len + len] = 0;
} else {
old_str = calloc(1, len + 1);
mem_check(old_str);
memcpy(old_str, new_str, len);
}
*str = old_str;
return old_str;
}

void http_utils_trim_whitespace(char **str)
{
char *end, *start;
Expand Down
13 changes: 13 additions & 0 deletions components/esp_http_client/lib/include/http_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,19 @@
*/
char *http_utils_assign_string(char **str, const char *new_str, int len);

/**
* @brief Realloc *str and append new_str to it, if not NULL; assign new_str to *str pointer if NULL
*
* @param str pointer to string pointer
* @param new_str assign this string to str
* @param len length of string, 0 if new_str is zero terminated
*
* @return
* - new_str pointer
* - NULL
*/
char *http_utils_append_string(char **str, const char *new_str, int len);

/**
* @brief Remove white space at begin and end of string
*
Expand Down

0 comments on commit 4b07e33

Please sign in to comment.