Fix url redirection issue.

Operation:
In `esp_http_client_set_url`, we check for if old_host is same as new_host.
Delete and open new connection if host is different.

Issue:
We just pointed `client->connection_info.host` to `old_host` and reassigned it.
This made old_host and new_host always point to same location and hence, using old_host with new request.

Fix:
Made a separate copy for old_host using strdup.

Closes https://github.com/espressif/esp-idf/issues/2631

Signed-off-by: Vikram Dattu <vikram.dattu@espressif.com>
This commit is contained in:
Vikram Dattu 2019-03-26 16:45:46 +08:00
parent 225bc0f80a
commit 344cb99d34

View File

@ -639,7 +639,9 @@ esp_err_t esp_http_client_set_url(esp_http_client_handle_t client, const char *u
ESP_LOGE(TAG, "Error parse url %s", url); ESP_LOGE(TAG, "Error parse url %s", url);
return ESP_ERR_INVALID_ARG; return ESP_ERR_INVALID_ARG;
} }
old_host = client->connection_info.host; if (client->connection_info.host) {
old_host = strdup(client->connection_info.host);
}
old_port = client->connection_info.port; old_port = client->connection_info.port;
if (purl.field_data[UF_HOST].len) { if (purl.field_data[UF_HOST].len) {
@ -651,11 +653,17 @@ esp_err_t esp_http_client_set_url(esp_http_client_handle_t client, const char *u
&& strcasecmp(old_host, (const void *)client->connection_info.host) != 0) { && strcasecmp(old_host, (const void *)client->connection_info.host) != 0) {
ESP_LOGD(TAG, "New host assign = %s", client->connection_info.host); ESP_LOGD(TAG, "New host assign = %s", client->connection_info.host);
if (esp_http_client_set_header(client, "Host", client->connection_info.host) != ESP_OK) { if (esp_http_client_set_header(client, "Host", client->connection_info.host) != ESP_OK) {
free(old_host);
return ESP_ERR_NO_MEM; return ESP_ERR_NO_MEM;
} }
esp_http_client_close(client); esp_http_client_close(client);
} }
if (old_host) {
free(old_host);
old_host = NULL;
}
if (purl.field_data[UF_SCHEMA].len) { if (purl.field_data[UF_SCHEMA].len) {
http_utils_assign_string(&client->connection_info.scheme, url + purl.field_data[UF_SCHEMA].off, purl.field_data[UF_SCHEMA].len); http_utils_assign_string(&client->connection_info.scheme, url + purl.field_data[UF_SCHEMA].off, purl.field_data[UF_SCHEMA].len);
HTTP_MEM_CHECK(TAG, client->connection_info.scheme, return ESP_ERR_NO_MEM); HTTP_MEM_CHECK(TAG, client->connection_info.scheme, return ESP_ERR_NO_MEM);