From 9a7d85c09baff80f94b099537954d7330eef586e Mon Sep 17 00:00:00 2001 From: Nicklas Frahm Date: Sat, 12 Mar 2022 12:27:30 +0100 Subject: [PATCH 1/3] esp_http_client: fix redirect by resetting location before parsing Closes #8563. Signed-off-by: Nicklas Frahm --- components/esp_http_client/esp_http_client.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/components/esp_http_client/esp_http_client.c b/components/esp_http_client/esp_http_client.c index 511618d989..94aa1d6c73 100644 --- a/components/esp_http_client/esp_http_client.c +++ b/components/esp_http_client/esp_http_client.c @@ -520,6 +520,10 @@ static esp_err_t esp_http_client_prepare(esp_http_client_handle_t client) client->process_again = 0; client->response->data_process = 0; client->first_line_prepared = false; + if (client->location != NULL) { + free(client->location); + client->location = NULL; + } http_parser_init(client->parser, HTTP_RESPONSE); if (client->connection_info.username) { char *auth_response = NULL; From 3529b9450e2af8276284eb19e721ad54f977fff0 Mon Sep 17 00:00:00 2001 From: Shubham Kulkarni Date: Thu, 17 Mar 2022 09:59:29 +0530 Subject: [PATCH 2/3] esp_http_client: Add comment for clearing location field in esp_http_client_prepare --- components/esp_http_client/esp_http_client.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/components/esp_http_client/esp_http_client.c b/components/esp_http_client/esp_http_client.c index 94aa1d6c73..4283828645 100644 --- a/components/esp_http_client/esp_http_client.c +++ b/components/esp_http_client/esp_http_client.c @@ -520,6 +520,12 @@ static esp_err_t esp_http_client_prepare(esp_http_client_handle_t client) client->process_again = 0; client->response->data_process = 0; client->first_line_prepared = false; + /** + * Clear location field before making a new HTTP request. Location + * field should not be cleared in http_on_header* callbacks because + * callbacks can be invoked multiple times for same header, and + * hence can lead to data corruption. + */ if (client->location != NULL) { free(client->location); client->location = NULL; From 7509ca57b55967f8ff1267bcc52221fc021c53eb Mon Sep 17 00:00:00 2001 From: Shubham Kulkarni Date: Wed, 16 Mar 2022 10:58:38 +0530 Subject: [PATCH 3/3] advanced_https_ota/example_test.py: Update redirect URL test to include two redirects --- .../system/ota/advanced_https_ota/example_test.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/examples/system/ota/advanced_https_ota/example_test.py b/examples/system/ota/advanced_https_ota/example_test.py index 589706f2c0..ba7f7ce474 100644 --- a/examples/system/ota/advanced_https_ota/example_test.py +++ b/examples/system/ota/advanced_https_ota/example_test.py @@ -355,8 +355,9 @@ def test_examples_protocol_advanced_https_ota_example_redirect_url(env, extra_da """ dut1 = env.get_dut('advanced_https_ota_example', 'examples/system/ota/advanced_https_ota', dut_class=ttfw_idf.ESP32DUT) server_port = 8001 - # Port to which the request should be redirecetd + # Port to which the request should be redirected redirection_server_port = 8081 + redirection_server_port1 = 8082 # File to be downloaded. This file is generated after compilation bin_name = 'advanced_https_ota.bin' # check and log bin size @@ -369,18 +370,22 @@ def test_examples_protocol_advanced_https_ota_example_redirect_url(env, extra_da thread1 = multiprocessing.Process(target=start_https_server, args=(dut1.app.binary_path, host_ip, server_port)) thread1.daemon = True thread1.start() - thread2 = multiprocessing.Process(target=start_redirect_server, args=(dut1.app.binary_path, host_ip, redirection_server_port, server_port)) + thread2 = multiprocessing.Process(target=start_redirect_server, args=(dut1.app.binary_path, host_ip, redirection_server_port, redirection_server_port1)) thread2.daemon = True thread2.start() + thread3 = multiprocessing.Process(target=start_redirect_server, args=(dut1.app.binary_path, host_ip, redirection_server_port1, server_port)) + thread3.daemon = True + thread3.start() dut1.start_app() dut1.expect('Loaded app from partition at offset', timeout=30) try: ip_address = dut1.expect(re.compile(r' (sta|eth) ip: ([^,]+),'), timeout=30) print('Connected to AP with IP: {}'.format(ip_address)) except DUT.ExpectTimeout: - raise ValueError('ENV_TEST_FAILURE: Cannot connect to AP') thread1.terminate() thread2.terminate() + thread3.terminate() + raise ValueError('ENV_TEST_FAILURE: Cannot connect to AP') dut1.expect('Starting Advanced OTA example', timeout=30) print('writing to device: {}'.format('https://' + host_ip + ':' + str(redirection_server_port) + '/' + bin_name)) @@ -390,6 +395,7 @@ def test_examples_protocol_advanced_https_ota_example_redirect_url(env, extra_da dut1.reset() thread1.terminate() thread2.terminate() + thread3.terminate() @ttfw_idf.idf_example_test(env_tag='Example_8Mflash_Ethernet')