Description
Board
Adafruit ESP32 Feather - HUZZAH32 / ESP32-MINI-1
Device Description
Plain module on breadboard: HUZZAH32, and ESP32-MINI-1 in custom board
Hardware Configuration
Nothing relevant
Version
v2.0.14
IDE Name
Arduino IDE
Operating System
Ubuntu 22.04 with Kernel 5.15.0-87-generic
Flash frequency
80MHz
PSRAM enabled
yes
Upload speed
921600
Description
Using the HTTP Client inside loop does not cause any issues., whereas using it inside a task raises error 105 after the request number 16.
This is due to a bad implementation of the HTTPClient::disconnect method, where the _client stop method is not called if the is released if the _client used is not avaliable or connected, as it can be seen in code. This can be solved by adding a call to _client->stop() in line 408. This causes the client used to close the openned socket, thus allowing to create a new one.
Despite fixing that, also, only when running the HTTP client in a task, I see that in each one of the executions of my task, there is memory allocated in the heap that does not get released. Around 200 bytes get used in each one of the requests executed.
This issue is similar to #5072, with the difference that the issue mentioned in it is "solved" (if you guys agree, I can make a push request with my changes), but with the additional issue of the memory leak, which I have not found the reason of it.
Sketch
#include <Arduino.h>
#include <HTTPClient.h>
#include <WiFi.h>
#include <freertos/task.h>
const char* wifi_ssid = "ssid";
const char* wifi_password = "123456789"; // WiFi password
const char* wifi_hostname = "esp32";
bool wifiIsConnected(void){
return WiFi.status() == WL_CONNECTED;
}
int numberReq = 0;
bool taskRun = false;
void dummyTask(void *pvParameters){
HTTPClient http;
http.setReuse(false);
http.begin("10.42.0.1", 5000, "/api/test");
Serial.print("After begin Heap Size: ");
Serial.print(ESP.getHeapSize());
Serial.print(", free: ");
Serial.println(ESP.getFreeHeap());
int code = http.GET();
String payload = http.getString();
numberReq ++;
Serial.print("Number of requests: ");
Serial.print(numberReq);
Serial.print(" -------------------------, code ");
Serial.println(code);
Serial.print("After get Heap Size: ");
Serial.print(ESP.getHeapSize());
Serial.print(", free: ");
Serial.println(ESP.getFreeHeap());
http.end();
Serial.print("After end Heap Size: ");
Serial.print(ESP.getHeapSize());
Serial.print(", free: ");
Serial.println(ESP.getFreeHeap());
taskRun = false;
vTaskDelete(NULL); // Delete this task
}
void setup() {
TickType_t xLastWakeTime = xTaskGetTickCount();
// Init serial
Serial.begin(115200);
vTaskDelayUntil(&xLastWakeTime, pdMS_TO_TICKS(200));
// Configure and initialize WiFi
WiFi.disconnect(true, true); // Deletes old config
vTaskDelayUntil(&xLastWakeTime, pdMS_TO_TICKS(200));
WiFi.mode(WIFI_STA); // Station mode, connect to AP
WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE, INADDR_NONE, INADDR_NONE); // Use default params
WiFi.setAutoConnect(true);
WiFi.begin(wifi_ssid, wifi_password); // Begin searching for wifi network
WiFi.setHostname(wifi_hostname);
while(!wifiIsConnected()){
vTaskDelayUntil(&xLastWakeTime, pdMS_TO_TICKS(200));
}
Serial.println("------- WiFi Connected");
}
void loop() {
TickType_t xLastWakeTime = xTaskGetTickCount();
vTaskDelayUntil(&xLastWakeTime, pdMS_TO_TICKS(200));
Serial.print("Initial Heap Size: ");
Serial.print(ESP.getHeapSize());
Serial.print(", free: ");
Serial.println(ESP.getFreeHeap());
if(!taskRun){
taskRun = true;
Serial.println("Created Task");
xTaskCreatePinnedToCore(
dummyTask, /* Task Function */
"dummyTask", /* Task Name. */
7500, /* Stack Size */
NULL, /* Task Param */
0, /* Task Priority */
NULL, /* Task Handle*/
1 /* Core 0-1*/
);
Serial.print("After create task: ");
Serial.print(ESP.getHeapSize());
Serial.print(", free: ");
Serial.println(ESP.getFreeHeap());
}
}
Debug Message
Initial Heap Size: 320976, free: 218604
Created Task
After create task: 320944, free: 210728
[ 4452][D][HTTPClient.cpp:321] begin(): host: 10.42.0.1 port: 5000 uri: /api/live_race/test
After begin Heap Size: 320896, free: 210620
[ 4467][D][HTTPClient.cpp:606] sendRequest(): request type: 'GET' redirCount: 0
[ 4483][D][HTTPClient.cpp:1178] connect(): connected to 10.42.0.1:5000
[ 4503][D][HTTPClient.cpp:1329] handleHeaderResponse(): code: 200
[ 4504][D][HTTPClient.cpp:1332] handleHeaderResponse(): size: 29
[ 4504][D][HTTPClient.cpp:650] sendRequest(): sendRequest code=200
[ 4514][D][WiFiClient.cpp:536] connected(): Disconnected: RES: 0, ERR: 128
[ 4517][D][HTTPClient.cpp:1468] writeToStreamDataBlock(): connection closed or file end (written: 29).
[ 4540][D][HTTPClient.cpp:416] disconnect(): tcp is closed
Number of requests: 16 -------------------------, code 200
After get Heap Size: 320624, free: 208152
[ 4569][D][HTTPClient.cpp:416] disconnect(): tcp is closed
After end Heap Size: 320624, free: 208152
Initial Heap Size: 320736, free: 216260
Created Task
After create task: 320704, free: 208384
[ 4652][D][HTTPClient.cpp:321] begin(): host: 10.42.0.1 port: 5000 uri: /api/live_race/test
After begin Heap Size: 320656, free: 208284
[ 4667][D][HTTPClient.cpp:606] sendRequest(): request type: 'GET' redirCount: 0
[ 4668][E][WiFiClient.cpp:225] connect(): socket: 105
[ 4672][D][HTTPClient.cpp:1171] connect(): failed connect to 10.42.0.1:5000
[ 4678][W][HTTPClient.cpp:1491] returnError(): error(-1): connection refused
[ 4685][W][HTTPClient.cpp:1491] returnError(): error(-4): not connected
Number of requests: 17 -------------------------, code -1
After get Heap Size: 320576, free: 208044
[ 4715][D][HTTPClient.cpp:416] disconnect(): tcp is closed
After end Heap Size: 320576, free: 208044
Initial Heap Size: 320672, free: 216100
Other Steps to Reproduce
The problem occurs either in the HUZZAH 32 and my custom board.
I have checked existing issues, online documentation and the Troubleshooting Guide
- I confirm I have checked existing issues, online documentation and Troubleshooting guide.